Python:模拟登录ASPX站点
ASPX站点的模拟登录实际上一般就是__VIEWSTATE
和__EVENTVALIDATION
这两个变量的处理问题。
简单点可以认为是ASPX站点防止恶意POST
请求的办法,即每次用户向ASPX服务器发送POST
请求时,都要带上VIEWSTATE
和EVENTVALIDATION
的值,不发送或者在访问逻辑上值不正确,服务器就返回错误,防止恶意行为。
所以用Python模拟登录、浏览ASPX站点时就要多一些步骤。
- 登录时需要首先
GET
请求获取登录页面,找到VIEWSTATE
和EVENTVALIDATION
值(这两个值都隐藏在网页源码中),发送POST
请求时在POST
表单里加上这两个变量。 - 浏览ASPX站点时最好注意及时更新
VIEWSTATE
和EVENTVALIDATION
值,避免再POST
时出现麻烦。
注意,GET
请求完全不需要考虑VIEWSTATE
和EVENTVALIDATION
的问题,只是为了以后POST
方便,需要从GET
到的页面获取新的VIEWSTATE
和EVENTVALIDATION
值。
获取VIEWSTATE
和EVENTVALIDATION
:
import re
import urllib.request
con = urllib.request.urlopen('http://the.site.com')
content = con.read().decode('gbk')
regular = {
'viewstate': re.compile(r'id="__VIEWSTATE" value="(.+)" />'),
'eventvalidation': re.compile(r'id="__EVENTVALIDATION" value="(.+)" />')
}
VIEWSTATE = regular['viewstate'].findall(content)[0]
EVENTVALIDATION = regular['eventvalidation'].findall(content)[0]
这里就是首先GET到登录页面,利用正则表达式获取VIEWSTATE
和EVENTVALIDATION
值。
注意:
- 正则表达式需要根据网页源码来写;
- re的findall()返回的是一个数组,这里直接获取第一个数组元素值,所以如果正则表达式没有匹配项,就会报错,而不是空字符串,所以可能需要自行添加相应错误处理。
POST
请求:
POST
发送的表单需要用抓包工具分析,但一定不要忘了VIEWSTATE
和EVENTVALIDATION
,如:
user = {
'__EVENTVALIDATION': __EVENTVALIDATION,
'__VIEWSTATE': __VIEWSTATE,
# add
}
及时更新VIEWSTATE
和EVENTVALIDATION
:
可以包装成一个函数:
def update_aspx_id(html):
global __VIEWSTATE
global __EVENTVALIDATION
__VIEWSTATE = regular['viewstate'].findall(content)[0]
__EVENTVALIDATION = regular['eventvalidation'].findall(content)[0]
注意:关于global
全局变量声明的问题,还可以使用传参或者数组之类的办法,我是为了方便起见。
厉害