【问题标题】:Scraping through VIEWSTATE通过 VIEWSTATE 抓取
【发布时间】:2012-01-30 23:02:56
【问题描述】:

我在编写用于抓取网页的实用程序时遇到了一个问题。

我正在发送 POST 请求以检索数据,我模仿了我正在报废的网络的行为(根据 fiddler 收集的信息)。

我已经能够自动替换除 VIEWSTATE 之外的 POST 上的所有参数。 我的猜测是网络正在根据给定的 VIEWSTATE 执行一些逻辑,这就是为什么我没有得到预期的结果(我尝试输入提琴手在 VIEWSTATE 中给出的值,然后我确实得到了预期的结果,但是我想自动化这个过程)

有什么方法可以编辑 VIEWSTATE 字符串而不损坏它?

我尝试使用 base64 解码和编码(最后在 POST 操作之前使用 URLEncode),但无法保持有效。

【问题讨论】:

  • .Net 网站太痛苦了,如果没有机械化之类的东西,很难刮掉。我不确定 c# 存在哪些选项。
  • @pguardiario 我想是的。我想我可能会采取不同的方向,也许使用使用 Silenium 制作的自定义脚本。手动少一点。
  • @AlonAmir,不要使用 Selenium,它的工作量太大。我有同样的问题,这个链接很有帮助:asoftwaredeveloper.wordpress.com/category/extracting-view-state

标签: c# .net screen-scraping viewstate


【解决方案1】:

视图状态可能已加密。

无论如何,视图状态应该被加密。这是您似乎正在尝试做的那种类型的 XSRF 攻击的保护 :-)

底线是您发回的 ViewState 必须与服务器发送给您的 ViewState 相同。这就是它的用途。换句话说,要做你想做的事情,你必须保留服务器发送给你的视图状态的副本,并将相同的视图状态发回。然后服务器将向您发送一个新的视图状态,您必须在下一个请求中提交该视图状态,依此类推。

【讨论】:

  • 保留 VIEWSTATE 意味着我必须执行我正在报废的表单的每个步骤。我想我可能会以某种方式跳过填写表格所需的一些步骤,因为我已经有了需要输入的信息——除了 VIEWSTATE。我想我没有选择按原样提取 VIEWSTATE 并像用户那样一步一步地做。
  • @AlonAmir,正确。加密视图状态的目的是强迫你这样做。
【解决方案2】:

您可以使用与 asp.net 相同的序列化器。我认为它是一个名为 HiddenFieldPageStatePersister 的类。

http://msdn.microsoft.com/en-us/library/system.web.ui.hiddenfieldpagestatepersister.aspx

希望对你有帮助

【讨论】:

  • 如果可以的话会很好,我看不到如何从视图状态字符串初始化该类的实例。看起来它只能在实际创建.net web时使用
  • 检查基类,也许子类化会有所帮助。我猜它有一个获取和设置字符串的模板方法。
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 2016-11-18
相关资源
最近更新 更多