您的位置:首页 > 其它

web服务验证事件合法请求,使用到了__VIEWSTATE、__EVENTVALIDATION、cookie来验证

2018-03-05 12:52 585 查看
__VIEWSTATE
ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。 
ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。 
当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值

__EVENTVALIDATION
__EVENTVALIDATION只是用来验证事件是否从合法的页面发送,只是一个数字签名,所以一般很短。
“id”属性为“__EVENTVALIDATION”的隐藏字段是ASP.NET 2.0的新增的安全措施。该功能可以阻止由潜在的恶意用户从浏览器端发送的未经授权的请求.
为了确保每个回发和回调事件来自于所期望的用户界面元素,ASP.NET运行库将在事件中添加额外的验证层。服务器端通过检验表单提交请求的内容,将其与“id”属性为“__EVENTVALIDATION”隐藏字段中的信息进行匹配。根据匹配结果来验证未在浏览器端添加额外的输入字段(有可能为用户在浏览器端恶意添加的字段),并且该值是在服务器已知的列表中选择的。ASP.NET运行库将在生成期间创建事件验证字段,而这是最不可能获取该信息的时刻。像视图状态一样,事件验证字段包含散列值以防止发生浏览器端篡改。
说明:“id”属性为“__EVENTVALIDATION”隐藏字段一般在表单的最下方,如果表单在浏览器端尚未解析完毕时,用户提交数据有可能导致验证失败。于是关键的关键是获取这两个值。运用正则,在爬取之前先open一次url获取值,然后在第二次爬取的时候把这个值传进post参数里面
#coding:utf-8
import requests
import re

url1 = "http://wx.ismartgo.com/sso/Login.aspx?code=f8a56609c3b44693aa7f655600cc280c&appid=op"#获取参数网址
url2 = "http://wx.ismartgo.com/sso/Login.aspx?code=0ecd89621b924c49b224ba39712a47ff&appid=op"#账号密码登录接口
#使用正则从url1获取以下参数
r1 = requests.get(url1)
r1txt = r1.text
VIEWSTATE =re.findall(r'id="__VIEWSTATE" value="(.*?)" />', r1txt,re.I)
EVENTVALIDATION =re.findall(r'id="__EVENTVALIDATION" value="(.*?)" />', r1txt,re.I)

#url2请求头,请求body
header = {
"Connection": "keep-alive",
"Content-Length": "411",
"Cache-Control": "max-age=0",
"Origin": "http://wx.ismartgo.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Referer": "http://wx.ismartgo.com/sso/Login.aspx?code=4c8b7a50534346ba9c5b40b5a32642d1&appid=op",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.8",
"Cookie": "ASP.NET_SessionId=sd1vav45ejfiew452sknthu3; sso_oauth_user=user=&md5=D41D8CD98F00B204E9800998ECF8427E"
}
data = {
"txtLoginName": "***",
"txtPassword": "****",
  #使用url1获取的参数
"__VIEWSTATE": VIEWSTATE,
"__EVENTVALIDATION": EVENTVALIDATION,

"chkKeepLogin": "on",
"btnLogin": "%E7%99%BB%E5%BD%95"
}
r = requests.post(url2,headers=header,data=data)

print("状态码",r.status_code)
print(r.headers)
print(r.text)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  接口测试 web验证