2012年12月19日星期三

查找中国防火墙设备ip地址

前两天看到一个用于查找GFC(Great Firewall of China)设备ip的python脚本mongol.py,觉得挺有意思,拿来研究了一下。

这个脚本基于 Internet Censorship in China: Where Does the Filtering Occur? 这篇论文,mongol.py基本就是该论文4.3节Algorithm的实现。除了防火墙设备ip查找算法,论文还阐述了以下内容:

  • 从现有实验结果看,有状态的连接(即已完成三次握手的连接)+ 敏感词 才会触发审查
  • 对访问外国的流量审查严格,国内主要还是靠social control(如人工审查)
  • 国内两大ISP,电信的审查设备主要设置在省区城域网,网通的主要设置在骨干网,因在省区也有审查设备,GFC其实也具备国内流量审查的能力
  • 审查起作用后,链路被阻塞的状态会维持一段时间,这段时间内,即使后续的报文不包含敏感词,也会被阻塞


mongol.py接受一个ip参数,其完成以下工作:

首先新建socket与指定ip 80端口进行连接,发送一条GET消息:
GET / HTTP/1.1      \r\n
Host: ip    \r\n
\r\n

在connect调用返回前,三次握手已经完成。之后拿到response,判断响应状态码,如果是200 OK 或 302 Redirect 或 401 Unauthorized,则表明可与目的ip 80端口建立有效连接。

然后对于有效连接,利用scapy进行ackattack(相当于traceroute),并记录本机到目的ip的中间router设备ip,注意所记录的router中可能有一个就是GFC设备,此时由于还没有发送敏感词,并未触发审查

再之后重新新建一个socket进行目的ip连接,此时发送一条包含敏感词的GET消息:
GET /tibetalk  \r\n
Host: ip  \r\n
\r\n

如果发送后出现socket error,则说明GFC设备在该链路上向本机发送了RST报文(也会向目的ip发送),审查机制被触发

最后再次进行ackattack,因为本机收到RST后,本机到目的ip的链路还会阻塞一段时间,这时即使是不包含敏感词的一个ack报文都会被阻塞,trace到的最后一个ip地址就是GFC设备的ip地址


貌似直接traceroute实现不是基于tcp三次握手的,否则直接traceroute Facebook就可以找到防火墙服务器ip;另对于是否stateful的连接才会触发审查,还可以用netcat工具进行验证。

以上提到的论文作者为查找全中国范围内的GFC设备,提到的一个方法也很有趣,利用中国政府网-部门地方链接以及各种导航网站获取到全国各个地方的网站,以此作为检测工具的目的ip地址参数。

Have fun!

2012年12月15日星期六

微信公众平台开放接口

微信公众平台,是为有更多话语权的人设置的一个功能,这部分人或许是明星,或许是地产大佬,或许是某行业中知道更多内幕、小道消息的人。公众平台的推广口号虽说是每个人都有自己的品牌,但在这本已信息过载的时代,谁会专门设置一个通道,关注某个普通人生活中鸡毛蒜皮的那点事。

本着折腾的精神看了下公众平台的开放接口,目前提供的接口就2个:

  • 网址接入公众平台合法性校验功能
  • 普通微信用户消息回复功能

使用前先需要填一些信息,包括token、URL等:















对于以上第二个功能,普通微信用户向公众平台发送消息时,公众平台再以POST的方式向以上配置的URL发送信息,包含以下一些数据:

  • 文本消息:包括文本消息内容、接受/发送方微信号等
  • 地理位置消息:包括地理位置经纬度等信息
  • 图片消息:包括图片链接等信息
我们部署在指定URL上的应用可以以POST方式回应文本、图文信息。

或许可以利用公众平台开放接口实现文本信息查询、基于地理位置的应用。

Have fun!

2012年12月14日星期五

新浪微博开放平台应用之登录授权

在前文《新浪微博开放平台应用之数据抓取》中,我们学会了如何使用 trends/statuses 接口抓取话题数据,相比 trends/statuses 接口,有些抓取数据的接口需要登录授权后才能调用,比如获取评论的接口 2/comments/show。下面我们就来看如何进行登录授权。

完成登录需要用到 oauth2/authorize 接口,其接收以下参数:
  • client_id: 所申请的app_key
  • response_type: 返回数据类型,值可为code或state,code用于后续获取access_token
  • display: 授权页面的终端类型,default指示游览器
  • redirect_uri: 授权回调地址,需与开放平台中设置的回调地址一致

参数既可以以POST方式传送,也可以以GET方式发送,如下例子:
https://api.weibo.com/oauth2/authorize?redirect_uri=http://liuxiaofang.sinaapp.com/callback?url=/init-comments&ids=3522096338448283&response_type=code&client_id=622387540&display=default

以上url以人为可读的方式显示,向应用服务器发送前还得经过编码(如使用python中的urllib.quote)。

这里所说的回调地址,通过 应用页面 -> 接口管理 -> 授权设置 进行配置。














正确发送URL后,将进入以下登录界面:













成功登录后,将跳转到我们之前设定的 redirect_uri,并返回 code 值:
http://liuxiaofang.sinaapp.com/callback?url=/init-comments&ids=3522096338448283&code=123456

有了code,我们就可以请求获取access_token,获取 access_token 的接口为 oauth2/access_token,其接收以下参数:
  • grant_type: 请求类型,对应与调用 authorize 获得的code,这里值应为 authorization_code
  • code: 以上获得的 code 值
  • client_id: 所申请的 app_key
  • client_secret: 所申请的 app_secret
  • redirect_uri: 回调地址,需与开放平台中设置的回调地址一致
向 oauth2/access_token 传送参数,需用POST方式,如:
https://api.weibo.com/oauth2/access_token
grant_typeauthorization_code
client_id622387540
client_secret = 123456
redirect_urihttp://liuxiaofang.sinaapp.com/callback?
code = 123456

正确发送URL后,将跳转到类似以下授权页面:















完成授权后,将跳转到之前设定的回调地址,并且从 response 中,我们可以获取到 access_token 和 expires_in 超时值。

有了 access_token,我们终于可以使用 2/comments/show 这类需要事先登录授权的接口了。下面通过GET方式获取指定微博id的评论,获取到的 access_token 放置在请求头中:

https://api.weibo.com/2/comments/show?id=3522885349661782
Authorization: OAuth2 123456

之后新浪服务器将返回评论id、评论文本、评论创建时间、评论作者等信息。

欢迎访问我的一个基于sae和新浪开放平台的网站 带上猫咪去旅行

Have fun!

2012年12月11日星期二

python web框架bottle

bottle是一个python WSGI框架,简单的一个py文件,集成了router、redirect、template,request/response获取与设定等功能,下面介绍其基本使用方法。

先import相关方法,并声明Bottle对象:

from bottle import Bottle, jinja2_template as template, static_file, redirect, request, response, run
app = Bottle()

Router
利用python的decorator方法,可以声明多个URL对应一个处理函数:

@app.get('/')
@app.get('/index')
def index():
  return 'Hello bottle!'

template
template用于将后台代码与前端代码分离,增加后台代码重用:

@app.get('/login')
def login():
   return template("login.html", handler=get_site_info())

@app.post('/login')
def login_post():
   return UserService.login()

redirect
bottle提供了redirect方法用于页面跳转,如登出后跳转到登录页面:

@app.get('/log-out')
 def log_out():
   UserService.log_out()
   redirect('/login', 302)

request/response
bottle提供了request和response对象,通过这两个对象,可方便地操作请求与响应数据:

@app.get('/admin')
 def admin():
   _status = request.query.get('status', None)
   response.set_cookie('status', _status)

static_file
网页包含html、js、图片等静态内容,处理这些静态内容的请求,我们不需要编写专门的router处理,只需要将静态内容放到一个文件夹下,利用如下一段代码,即可处理所有static文件请求:

@app.get('/static/<filename:re:.*')
 def server_static_file(filename):
   return static_file(filename, root='./static/')

最后,使用run方法让我们后台服务跑起来:
run(app, host='localhost', port=8080)

Have fun!

2012年12月10日星期一

社会化评论系统 ”多说“

多说 是一个评论系统,其整合了新浪微博、豆瓣、人人等多个社交网站评论插件,原先孤立的站点文章、博文可以通过 多说 与社交网站关联起来,利用社交人气活跃站点。

多说 是个开源的评论系统,使用起来也非常简单,先在多说官网进行注册,注册完成后将获得一段代码,将该段代码粘贴到网页代码<body></body>间任意位置,就可以使用多说评论系统。效果如下:













Have fun!

2012年12月9日星期日

新浪微博开放平台应用之数据抓取

新浪微博开放平台为开发者提供了很多API,用于访问或修改各种数据,如微博、评论、话题、收藏、用户标签等。下面展示如何使用“话题”的API,对特定数据进行访问。

新浪微博中的话题,由##括起来,要访问话题数据,需用到 trends/statuses 接口,其接受以下参数:
  • source : 所申请的app_key
  • trend_name : 要抓取的话题
  • count : 抓取条目的数量

通过GET方式(或直接通过游览器),访问以下URL:
http://api.t.sina.com.cn/trends/statuses.json?count=40&source=31641035&trend_name=带上猫咪去旅行

该URL指示获取最多40条,话题包含“带上猫咪去旅行”关键字的微博数据,访问该URL后,可获得以下形式的数据:

[{
"created_at":"Fri Dec 07 23:01:47 +0800 2012",
"id":3520736712709956,
"text":"#带上猫咪去旅行图站#低调内测上线 http://t.cn/zjJypQ5",
"source":"<a href=\"http://weibo.com\" rel=\"nofollow\">新浪微博</a>",
"thumbnail_pic":"http://ww4.sinaimg.cn/thumbnail/66f77025gw1dzlk18f7r3j.jpg",
"bmiddle_pic":"http://ww4.sinaimg.cn/bmiddle/66f77025gw1dzlk18f7r3j.jpg",
"original_pic":"http://ww4.sinaimg.cn/large/66f77025gw1dzlk18f7r3j.jpg",
"user":
{"id":1727492133,
"screen_name":"bangerlee",
"name":"bangerlee",
"province":"44",
"city":"1",
"location":"广东 广州",
"gender":"m",
"created_at":"Fri Apr 09 15:12:15 +0800 2010",
}]

可以看到返回的微博数据包含了我们想要搜索的关键词#带上猫咪去旅行#,另还有微博文字内容、微博图片ip、微博用户名等信息。

通过一个python小程序,我们可以实现数据抓取:




























运行以上程序有:
linux # python get_data.py  
bangerlee
#带上猫咪去旅行图站#低调内测上线 http://t.cn/zjJypQ5
http://ww4.sinaimg.cn/thumbnail/66f77025gw1dzlk18f7r3j.jpg

Have fun!