【问题标题】:ViewStateUserKey isn't preventing CSRF?ViewStateUserKey 没有阻止 CSRF?
【发布时间】:2011-05-08 22:13:32
【问题描述】:

我怀疑这是由于我的测试配置造成的,但我想问问你们的想法。我正在玩一个快速测试项目。我有一个简单的表单认证页面和一个订单页面(两个字段和一个显示“订单”的列表)。订单页面设置为在检索参数时使用 Request.Form[] 以防止输入作为 GET 操作进入。

我在 Page_Init 中设置 ViewStateUserKey 并将 EnableViewStateMac 显式设置为 true(即使它默认为 true)。

然后我制作了一个 .HTM,它在我的订单页面上发布了一个表单,为两个字段(产品和数量)设置了值。我应该注意,我没有费心将视图状态作为表单提交的一部分。我在浏览器的真实页面上查看了源代码,删除了除表单字段之外的所有内容,添加了一些 javascript 来设置字段值并执行 form.submit()

我登录到测试项目,并打开了 .HTM。 .HTM 成功提交表单,当我刷新订单页面时,我可以看到虚假订单。

为什么 ViewStateUserKey 没有防止这种情况发生?它不应该阻止那种类型的攻击吗?在这个例子中,我没有篡改视图状态,我只是创建了一个页面来进行正常的表单发布,所以 ViewStateUserKey ONLY 是为了防止 ViewState 被篡改(这让我觉得完全没有价值,或者这是因为两个页面都在同一台物理机器上吗?

【问题讨论】:

    标签: asp.net csrf xss csrf-protection


    【解决方案1】:

    您是否在测试页中包含原始视图状态字段?如果您为特定用户复制了一个有效的视图状态,然后以该用户的身份提交了它,那么是的,您希望它能够正常工作。

    ViewStateUserKey 功能只会阻止您获取从您自己的用户创建的 ViewState 并将其用于其他用户无意提交的提交中。

    【讨论】:

    • 我的测试页根本没有视图状态。这是一个页面,在一个表单中包含两个控件和一些用于设置控件值的 javascript 和一个提交表单的调用。
    • 我的测试页根本没有视图状态。这是一个页面,在一个表单中有两个 html 控件和一些设置控件值的 javascript 和一个提交表单的调用。所以你说的是 ViewStateUserKey + EnableViewStateMac 将防止篡改视图状态并且不会阻止:
      因此,阻止它的唯一方法是: 1. 加密网络连接 2. 使用隐藏的表单字段值将请求标识为合法(并且已加密,因此您无法窥探值)
    • 啊,所以你实际上根本没有使用回发和视图状态,只是简单的旧 HTML 表单处理?在这种情况下,您将不得不自己动手。请参阅例如 owasp.org/index.php/.Net_CSRF_Guard 以了解实现此功能的一个库。
    • 啊,明白了。因此,如果我使用 ViewState 并引用 txtControl1 和 txtControl2 之类的控件,它将起作用,因为这些值来自 ViewState,因此将应用 ViewState 验证。由于我使用的是 Request.Form,所以我没有得到这样的好处,这就是为什么普通的 html 表单帖子可以通过?
    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多