5

我正在为网站制作移动应用程序以查看您的日程安排。他们不提供任何 API,也无意制作一个。

该网站只能使用 Ajax 运行,但是要伪造这些请求并抓取网站,我需要伪造__EVENTVALIDATIONpost 字段。

我无法控制网站,也从未使用 ASP.NET 或 Microsoft Ajax 构建过任何东西。

有人做过吗?

我发现该__EVENTVALIDATION字段具有这种模式(...表示根据请求更改的字节,base64 解码版本的 hexdump):

d8 01 16 13 02 4f 0a
...
f6 e0 84 d4 05 02 a0 3f
e2 3f 03 02 3f d8 d1 d5 0c 02 bb 82 cf ec 08 02
b4 b5 99 f8 0b 02 3f 89 3f eb 04 02 d5 83 90 88
0a 02 8a 分贝 94 90 03 02 8b cf 3f 85 08 02 93 3f
b1 3f 06 02 9b 3f 8f a5 02 02 b5 b4 af 85 01 02
d1 fc ae 9c 0e 02 b4 e2 94 9e 0a 02 3f e2 94 9e
0a 02 3f e2 94 9e 0a 02 bb 92 80 a5 06
...                                  
4

2 回答 2

9

在为 ASP.NET 网站构建爬虫程序之前,我已经处理过这个问题。您需要请求浏览器用户通常登陆的初始页面,提取__VIEWSTATE__EVENTVALIDATION散列,然后使用它们对您实际需要的数据进行第二次请求。

例如,如果您要从表单提交中抓取响应:

  1. 对表单所在的页面发出 AJAX 请求
  2. 从响应中提取视图状态和事件验证哈希
  3. 发出一个模拟表单提交的新 AJAX 请求,将哈希值作为参数传递

如果您正在寻找 JavaScript 函数来从标记中提取哈希值,我已经在 GitHub 上发布了我用作ms-viewstate的函数。

于 2013-03-13T18:23:10.397 回答
1

__EVENTVALIDATION是一种安全措施

该功能可防止潜在恶意用户从客户端发送未经授权的请求。为了确保每个回发和回调事件都源自预期的用户界面元素,页面添加了额外的事件验证层。该页面基本上将请求的内容与 __EVENTVALIDATION 字段中的信息相匹配,以验证客户端上没有添加额外的输入字段,并且在服务器上已知的列表中选择了该值。页面在呈现期间生成事件验证字段 - 这是在信息可用的最后可能时刻。与视图状态一样,事件验证字段包含一个哈希值以防止客户端篡改。

哈希值基于服务器级别的键。所以你不能复制那个哈希——或者更确切地说,如果你这样做了,没有访问服务器,我猜你发现了一个安全漏洞。

参考:MSDN

于 2012-10-30T22:39:27.437 回答