最近在处理一个aspx页面遇到一点小麻烦,页面中有几个参数不好处理,因为是hidden域,所以无法直接赋值进行提交。
ViewState的原理
1.浏览器请求Default.aspx页面
2.在服务器端 发现创建的ViewState 这个时候 会自动创建一个名字叫做__VIEWSTATE(双下滑线 全部是大写)
的隐藏域 其隐藏域的值经过base64加密以后返回到浏览器端这一加密过程在页面生命周期
的SaveState事件中的SaveAllState方法中完成
3.当浏览器提交表单的时候 将__VIEWSTATE的隐藏域也一起提交到服务端 这个时候 页面生命周期的ReadState事件
的ReadAllState方法会将加密后的值反base64解密 最后将值赋值给名字叫做name的ViewState
4.最后来操作ViewState中的值
关于__EVENTVALIDATION
__EVENTVALIDATION只是用来验证事件是否从合法的页面发送,只是一个数字签名,所以一般很短。
“id”属性为“__EVENTVALIDATION”的隐藏字段是ASP.NET 2.0的新增的安全措施。该功能可以阻止由潜在的恶意用户从浏览器端发送的未经授权的请求.
为了确保每个回发和回调事件来自于所期望的用户界面元素,ASP.NET运行库将在事件中添加额外的验证层。服务器端通过检验表单提交请求的内容,将其与“id”属性为“__EVENTVALIDATION”隐藏字段中的信息进行匹配。根据匹配结果来验证未在浏览器端添加额外的输入字段(有可能为用户在浏览器端恶意添加的字段),并且该值是在服务器已知的列表中选择的。ASP.NET运行库将在生成期间创建事件验证字段,而这是最不可能获取该信息的时刻。像视图状态一样,事件验证字段包含散列值以防止发生浏览器端篡改。
说明:“id”属性为“__EVENTVALIDATION”隐藏字段一般在表单的最下方,如果表单在浏览器端尚未解析完毕时,用户提交数据有可能导致验证失败。
处理这两个hidden域参数
我们先向网站发起一次请求,把这两个参数的值取出来,然后再利用取到的值,发起post请求就可以了
url="http://test.iiisjjj.cn/addressbook.aspx" html=requests.get(url).content bsObj=BeautifulSoup(html,'html.parser') #print(bsObj.content) VIEWSTATE=bsObj.find('input',{'id':'__VIEWSTATE'}).attrs['value'] EVENTVALIDATION=bsObj.find('input',{'id':'__EVENTVALIDATION'}).attrs['value'] #print(VIEWSTATE) #print(EVENTVALIDATION) payload={ '__EVENTTARGET':'', '__EVENTARGUMENT':'', '__LASTFOCUS':'', '__VIEWSTATE':VIEWSTATE, '__EVENTVALIDATION':EVENTVALIDATION, 'T1':'%', 'D1':8, 'btnSearhCommnet':'搜索' } contacthtml=requests.post(url,data=payload).content contactObj=BeautifulSoup(contacthtml,'html.parser')
这样我们就能获取我们需要的数据了