在没有母版页的 ASP.NET Web 表单中防止 CSRF 攻击

Protect against CSRF attacks in ASP.NET Web Forms without Master Pages

我正在审查一个大约有 7 年历史的 ASP.NET 网站的安全性。在创建站点时,Microsoft 指导是将以下内容添加到公共基页(由所有页面隐藏代码继承):

Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
    MyBase.OnInit(e)

    If Request.IsSecureConnection = True Then
        ViewStateUserKey = Session.SessionID
    End If
End Sub

此建议来自以下 MSDN Article 2005 年。

我的问题是这是否仍然是防止 CSRF 攻击的有效技术。

请注意,我阅读了一篇关于此主题的 ,但 Visual Studio 2012+ 项目自动生成的 CSRF 保护似乎已添加到母版页中。由于 CSS 冲突,我正在审查的网站未使用母版页,并且将母版页添加到当前更新中不在范围内。

是的,如果启用了 ViewStateMac,这将减轻 CSRF。

这是因为每个用户都将通过自己的密钥(即 session ID)对 ViewState 进行身份验证。

由于 ViewState 在每个具有 side-effects 的请求后被 POST 发送回服务器,ASP.NET 将验证 ViewState 值实际上来自当前用户。

因此,任何攻击者都无法构建 POST 请求来诱使受害者提交,因为他们没有受害者的 session ID 无法执行此操作。

请注意,以上假定所有具有 side-effects 的请求都是通过回发完成的。也就是说,应用程序遵循 RFC 7231 in regards to the definition of "safe" methods,并且除了回发机制之外没有其他处理程序 POST 请求。

请注意,应用程序中的任何自定义 AJAX 请求(例如 JQuery 发出的请求)都不会受到 CSRF 的保护,因为这些请求未作为回发实现。

建议为这些设置和检查自定义 header,例如 X-Requested-With。请注意,由于各种 Flash 漏洞,您可能还想将令牌传递到 header 以检查 server-side。