不ValidateAntiForgeryToken工作PUT和DELETE請求或只爲處理ASP.NET Web API POST請求?如果不是,確保安全的最佳方法是什麼?防止CSRF攻擊的PUT和DELETE請求的ASP.NET Web API
2
A
回答
4
反CSRF通常通過匹配來自餅乾和身體令牌來驗證在非AJAX調用瀏覽器等形式後的請求來完成。
在Ajax調用,建議把令牌在自定義標題。如果你安裝了最新的ASP.NET 2012.2 update。它在MVC項目對話框中有一個spa模板,演示如何在SPA應用程序中防止CSRF。以下是從模板複製的代碼,以便從服務器端驗證標頭令牌。
public class ValidateHttpAntiForgeryTokenAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
HttpRequestMessage request = actionContext.ControllerContext.Request;
try
{
if (IsAjaxRequest(request))
{
ValidateRequestHeader(request);
}
else
{
AntiForgery.Validate();
}
}
catch (HttpAntiForgeryException e)
{
actionContext.Response = request.CreateErrorResponse(HttpStatusCode.Forbidden, e);
}
}
private bool IsAjaxRequest(HttpRequestMessage request)
{
IEnumerable<string> xRequestedWithHeaders;
if (request.Headers.TryGetValues("X-Requested-With", out xRequestedWithHeaders))
{
string headerValue = xRequestedWithHeaders.FirstOrDefault();
if (!String.IsNullOrEmpty(headerValue))
{
return String.Equals(headerValue, "XMLHttpRequest", StringComparison.OrdinalIgnoreCase);
}
}
return false;
}
private void ValidateRequestHeader(HttpRequestMessage request)
{
string cookieToken = String.Empty;
string formToken = String.Empty;
IEnumerable<string> tokenHeaders;
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
{
string tokenValue = tokenHeaders.FirstOrDefault();
if (!String.IsNullOrEmpty(tokenValue))
{
string[] tokens = tokenValue.Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}
}
AntiForgery.Validate(cookieToken, formToken);
}
}
從客戶端,您還需要在ajax調用中設置標頭。這是todo.datacontext.js代碼:
function ajaxRequest(type, url, data, dataType) { // Ajax helper
var options = {
dataType: dataType || "json",
contentType: "application/json",
cache: false,
type: type,
data: data ? data.toJson() : null
};
var antiForgeryToken = $("#antiForgeryToken").val();
if (antiForgeryToken) {
options.headers = {
'RequestVerificationToken': antiForgeryToken
}
}
return $.ajax(url, options);
}
0
我寫了一個動作過濾器類來處理反僞造的令牌驗證..
public class WebApiValidateJsonToken : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext filterContext)
{
//get the base url or virtual directory of web app
var virtualDirectory = filterContext.Request.Headers.GetValues("vd").First();
//base 64 encode the virtual directory
var encodedVirtualDirectory = Convert.ToBase64String(Encoding.UTF8.GetBytes(virtualDirectory));
//set cookie name to look for to append '_' + base 64 encoded virtual directory to match how Asp.Net Html.AntiforgeryToken
//names the cookie that holds the token
var cookieName = "__RequestVerificationToken" + (String.IsNullOrEmpty(encodedVirtualDirectory) ? "" : "_" + ReplacePadding(encodedVirtualDirectory));
//get the formtoken created by the Html.AntiforgeryToken helper (hidden input element in view) value sent in ajax header
var formtoken = filterContext.Request.Headers.GetValues("antiForgeryToken").First();
//get the cookie token value with the name generated from above
var cookietoken = filterContext.Request.Headers.GetCookies(cookieName).FirstOrDefault()[cookieName].Value;
try
{
//Validate antiforgery token the old way because can't use ValidateAntiforgeryToken attribute with JSON content
System.Web.Helpers.AntiForgery.Validate(cookietoken, formtoken);
base.OnActionExecuting(filterContext);
}
catch
{
throw new ArgumentException("CSRF");
}
}
//Supporting Method to strip base 64 '=' padding and replace with the number representation of padding
public string ReplacePadding(string b64)
{
var count = b64.Count(x => x == '=');
b64 = b64.Substring(0, b64.Length - count);
return b64 + count.ToString();
}
}
這是我如何實現它在視圖:
baseUrl = '@Url.Content("~/")';
$.ajaxSetup({
headers: {
antiForgeryToken: $('input[name="__RequestVerificationToken"]').val(),
vd: baseUrl.substring(0, baseUrl.length - 1)
}
});
$.ajax({
url: '@Url.Content("~/api/WebApiAction")',
data: JSON.stringify(paramObject),
contentType: "application/json",
type: 'PUT'
})
.done(function (data) {/*do stuff*/});
相關問題
- 1. 防止ASP.NET MVC中的CSRF攻擊
- 2. IIS 7.5和Web API 2 PUT/DELETE請求
- 3. Web安全:防止CSRF攻擊
- 4. 防止跨站請求僞造(CSRF)攻擊
- 5. 防止jQuery的CSRF和XSRF攻擊$ .post
- 6. ASP.NET Web Api「請求的資源不支持http方法PUT/DELETE」
- 7. 防止惡意請求-DOS攻擊
- 8. HTTPS是否可以防止CSRF攻擊?
- 9. ASP.NET MVC中的AntiForgeryToken是否可以防止所有CSRF攻擊?
- 10. 如何防止以下CSRF攻擊Oauth2?
- 11. 在grails中防止CSRF攻擊?
- 12. 你如何防止特定CSRF攻擊
- 13. php防止csrf攻擊多次提交
- 14. 防止csrf攻擊在modx formit
- 15. 這是防止跨站點請求僞造(CSRF)攻擊的安全方法嗎?
- 16. CSRF攻擊 - 同一頁上的GET和POST請求
- 17. 防止Javascript和XSS攻擊
- 18. 使用ASP.NET Web API對PUT和DELETE的CORS支持
- 19. REST的PUT和DELETE和防火牆
- 20. 防止Web API中的「傳遞哈希」攻擊?
- 21. 使用CURL發送`PUT`和`DELETE`請求
- 22. 反應:取DELETE和PUT請求
- 23. ASP.NET Core中的Data Protection API是否可防止重放攻擊?
- 24. 防止XSS攻擊
- 25. 防止XSS攻擊
- 26. CakePHP的:防止XSS攻擊
- 27. 防止跨站點請求僞造攻擊
- 28. 如何防止ajax應用程序中的CSRF攻擊
- 29. 在PHP中防止CSRF攻擊的最佳方法
- 30. 如何防止涉及嵌入式iframe的CSRF/XSRF攻擊?
你有沒有試過? –