MVC4 SPA模板的ValidateHttpAntiForgeryTokenAttribute
類具有ValidateRequestHeader
函數,該函數在爲AJAX調用組裝數據時分析客戶端構造的RequestVerificationToken
頭的兩部分。客戶端AJAX代碼從組合表單令牌和Cookie令牌的表單中的字段獲取其值。我覺得將這些組合成一個單一的值會失去AntiForgery令牌的目的;他們分開是有原因的。我們是否通過這種方式使用防僞令牌來獲得任何安全保障?AntiForgery.Validate在AJAX調用中的功效和用途
服務器.vbhtml代碼(剃刀爲主):
Public Function GetAntiForgeryToken() As String
Dim cookieToken As String = String.Empty
Dim formToken As String = String.Empty
AntiForgery.GetTokens(Nothing, cookieToken, formToken)
Return cookieToken & ":" & formToken
End Function
...
@If User.Identity.IsAuthenticated Then
@<input id="antiForgeryToken" type="hidden" value="@GetAntiForgeryToken()" />
End If
客戶端AJAX代碼:
function ajaxRequest(type, url, data, dataType) { // Ajax helper
var options = {
dataType: dataType || "json",
contentType: "application/json",
cache: false,
type: type,
data: data ? ko.toJSON(data) : null
};
var antiForgeryToken = $("#antiForgeryToken").val();
if (antiForgeryToken) {
options.headers = {
'RequestVerificationToken': antiForgeryToken
}
}
return $.ajax(url, options);
}
服務器驗證碼:
Private Sub ValidateRequestHeader(request As HttpRequestMessage)
Dim cookieToken As String = String.Empty
Dim formToken As String = String.Empty
Dim tokenHeaders As IEnumerable(Of String) = Nothing
If request.Headers.TryGetValues("RequestVerificationToken", tokenHeaders) Then
Dim tokenValue As String = tokenHeaders.FirstOrDefault()
If Not String.IsNullOrEmpty(tokenValue) Then
Dim tokens As String() = tokenValue.Split(":"c)
If tokens.Length = 2 Then
cookieToken = tokens(0).Trim()
formToken = tokens(1).Trim()
End If
End If
End If
AntiForgery.Validate(cookieToken, formToken)
End Sub
是什麼阻止客戶挑選過去使用過的任意一對cookieToken和formToken,並通過AJAX調用將它們一起提交以使其通過?這不是什麼防僞功能應該防止?這只是很多愚蠢的開銷,不會提高安全性,還是我缺少一部分內容?
但模板代碼*中的cookie和標記值都存儲在表單*上!這不會破壞cookie標記的安全嗎? – BlueMonkMN
對不起 - 稍有誤解您的原始問題!無論如何,我已經用答案更新了它。 – SilverlightFox
只有一個問題,即用戶名是什麼可以防止這種情況:模板代碼爲IIdentity參數傳遞「Nothing」,除非我讀錯代碼,否則會導致currentUsername保持爲空。 – BlueMonkMN