在StafOverflow社区的帮助下,我能够在我的母版页中为100多个Web表单实现以下方法,该解决方案创建了独特的防伪密钥和经过身份验证的用户信息来验证提交。 http://software-security.sans.org/developer-how-to/developer-guide-csrf
但是我很想知道是否将“双重提交”方案视为漏洞。
在上述解决方案之前,我能够做到以下, 我能够使用LINK#2并随时提交伪造请求。
解决方案后,如果我打开新浏览器,LINK#2将失败(为了确保,我已在LINK#2中更新了__EVENTVALIDATION& __VIEWSTATE)。 但是我仍然可以使用“新标签”(不是新会话)下的LINK#2提交伪造请求。
所以我的问题是,这仍然被视为漏洞吗?
以下是已实施的内容。
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
setAntiForgeryKey()
AddHandler Page.PreLoad, AddressOf master_Page_PreLoad
.
.
.
End Sub
Protected Sub setAntiForgeryKey()
Dim requestCookie = Request.Cookies(AntiXsrfTokenKey)
Dim requestCookieGuidValue As New Guid
If requestCookie IsNot Nothing AndAlso Guid.TryParse(requestCookie.Value, requestCookieGuidValue) Then
_antiXsrfTokenValue = requestCookie.Value
Page.ViewStateUserKey = _antiXsrfTokenValue
Else
_antiXsrfTokenValue = Guid.NewGuid().ToString("N")
Page.ViewStateUserKey = _antiXsrfTokenValue
Dim responseCookie = New HttpCookie(AntiXsrfTokenKey) With { _
.HttpOnly = True, _
.Value = _antiXsrfTokenValue _
}
If (FormsAuthentication.RequireSSL And Request.IsSecureConnection) Then responseCookie.Secure = True
Response.Cookies.Set(responseCookie)
End If
End Sub
Protected Sub master_Page_PreLoad(ByVal sender As Object, ByVal e As System.EventArgs)
If Not Page.IsPostBack Then
ViewState(AntiXsrfTokenKey) = Page.ViewStateUserKey
ViewState(AntiXsrfUserNameKey) = UserID
Else
If (CType(ViewState(AntiXsrfTokenKey), String) <> _antiXsrfTokenValue) Or _
(CType(ViewState(AntiXsrfUserNameKey), String) <> UserID) Then
Throw New InvalidOperationException("Validation of Anti-XSRF token failed.")
End If
End If
End Sub