ABP理論之CSRF

来源:http://www.cnblogs.com/farb/archive/2016/09/17/ABPCSRF.html
-Advertisement-
Play Games

"返回總目錄" 本篇目錄 "介紹" "ASP.NET MVC" "ASP.NET WEB API" "ASP.NET Core" 【以後補上】 "客戶端類庫" "內部原理" 介紹 CSRF【Cross Site Request Forgery】 跨站請求偽造是一種攻擊類型,一般指的是一個惡意的網站、 ...


返回總目錄


本篇目錄

介紹

CSRF【Cross-Site Request Forgery】跨站請求偽造是一種攻擊類型,一般指的是一個惡意的網站、郵件、博客、即時消息、或程式使得用戶的web瀏覽器對當前用戶已認證的可信任網站執行一個自己不願執行的操作。想要詳細瞭解的可以查看百度CSRF,擴展閱讀OWASP

這裡簡明描述一下如何在ASP.NET Web API中實現。

ABP框架儘可能地簡化自動化了CSRF保護,現成的啟動模板已經做了預配置。本文,會解釋如何將它集成到ASP.NET平臺的,以及它是如何工作的。

HTTP動詞

無需對GET,HEAD,OPTIONS,TRACEHTTP動詞做保護操作,因為正常情況下它們應該是無副作用的(不會更改資料庫)。ABP只對POST,PUT,PATCH,DELETE動詞實現了反偽造(Anti-Forgery)保護,可以使用本文中定義的特性來更改該行為。

ASP.NET MVC

功能

大家都知道,ASP.NET MVC有自己內置的反偽造系統,但它有一些不足:

  • 需要為保護的所有actions添加ValidateAntiForgeryToken特性,這個容易忘記。
  • ValidateAntiForgeryToken特性只檢查HTML 表單域中的**__RequestVerificationToken,這就使得在AJAX請求中使用它非常困難或不可能,尤其是以"application/json"**作為content-type發送請求時。在Ajax請求中,通常會在請求頭中設置token。
  • 在JS代碼中很難訪問驗證token,尤其是不在.cshtml文件中寫JS。但我們需要在AJax請求中訪問使用。
  • 即使可以在js中訪問token,也需要為每個請求都在頭部手動加入,很是麻煩。

ABP做了下麵這些事情來客服上面的困難:

  • actions會被自動保護(通過AbpAntiForgeryMvcFilter)。自動保護可以應對大多數情況。當然,可以使用DisableAbpAntiForgeryTokenValidation特性為任何action和Controller關閉自動保護,也可以使用 ValidateAbpAntiForgeryToken特性打開。
  • 除了HTML的表單域,AbpAntiForgeryMvcFilter也會檢查請求頭中的token。因此,可以很容易對ajax請求使用反偽造token保護。
  • 在js中可以使用abp.security.antiForgery.getToken()函數獲得token。
  • 為所有的ajax請求頭部自動添加反偽造token。

集成

啟動模板已經集成了現成的CSRF保護,如果需要手動將它添加到你的項目,那麼請參照以下步驟。

Layout 視圖

Layout視圖中添加以下代碼:

@{
    SetAntiForgeryCookie();
}

這樣,所有使用了這個佈局頁的頁面都會包含這句代碼了,該方法定義在ABP視圖基類中,它會創建和設置正確的token cookie,使得在js端可以工作。如果有多個Layout的話,需要為每個佈局添加上面的代碼。

對於ASP.NET MVC 應用,只需要做這麼多,所有的ajax請求都會自動工作。但是對於HTML 表單仍然需要使用** @Html.AntiForgeryToken()** HTML幫助方法,因為表單不是通過Ajax提交的,但是不需要在相應的action上使用ValidateAbpAntiForgeryToken 特性了。

配置

XSRF預設是打開的,也可以在模塊的PreInitialize方法中關閉或配置,如下:

Configuration.Modules.AbpWeb().AntiForgery.IsEnabled = false;

也可以使用Configuration.Modules.AbpWebCommon().AntiForgery對象配置token和cookie名稱。

ASP.NET WEB API

功能

ASP.NET Web API不包括反偽造機制,ABP為ASP.NET Web API Controllers提供了基礎設施來添加CSRF保護,並且是完全自動化的。

集成

ASP.NET MVC客戶端
如果在MVC項目中使用了Web API,那麼不需要額外的配置。只要Ajax請求是從一個配置的MVC應用中發出的,即使你的Web API層自宿主在其它進程中,也不需要配置。

其它客戶端
如果你的客戶端是其它類型的應用(比如,一個獨立的angularjs應用,它不能像之前描述的那樣使用SetAntiForgeryCookie()方法),那麼你應該提供一種設置反偽造token cookie的方法。一種可能的實現方式是像下麵那樣創建一個api控制器:

using System.Net.Http;
using Abp.Web.Security.AntiForgery;
using Abp.WebApi.Controllers;

namespace AngularForgeryDemo.Controllers
{
    public class AntiForgeryController : AbpApiController
    {
        private readonly IAbpAntiForgeryManager _antiForgeryManager;

        public AntiForgeryController(IAbpAntiForgeryManager antiForgeryManager)
        {
            _antiForgeryManager = antiForgeryManager;
        }

        public HttpResponseMessage GetTokenCookie()
        {
            var response = new HttpResponseMessage();

            _antiForgeryManager.SetCookie(response.Headers);

            return response;
        }
    }
}

然後就可以從客戶端調用這個action來設置cookie了。

ASP.NET Core###【以後補上】

客戶端類庫

jQuery

abp.jquery.js中定義了一個ajax攔截器,它可以將反偽造請求token添加到每個請求的請求頭中,它會從abp.security.antiForgery.getToken()函數中獲得token。

Angularjs

Angularjs會將反偽造token自動添加到所有的ajax請求中,請點擊鏈接查看Angularjs的XSRF保護一節。ABP預設使用了相同的cookie和header名稱。因此,Angularjs集成是現成可用的。

其它類庫

如果你使用了其它類庫做Ajax請求,那麼有三種選擇:

Intercept XMLHttpRequest
因為所有的類庫都使用了原生的js Ajax對象——XMLHttpRequest,因此可以定義一個簡單的攔截器,將token添加到請求頭部:

(function (send) {
    XMLHttpRequest.prototype.send = function (data) {
        this.setRequestHeader(abp.security.antiForgery.tokenHeaderName, abp.security.antiForgery.getToken());
        return send.call(this, data);
    };
})(XMLHttpRequest.prototype.send);

Use Library Interceptor
好的類庫都會提供攔截點(比如 jquery和angularjs),因此,請查看文檔學習如何攔截請求以及操作頭部。

Add the Header Manually
最後,可以使用abp.security.antiForgery.getToken()獲取token,然後手動為每個請求添加請求頭,但是很可能不需要這麼做,而是按照上面的方法解決問題。

內部原理

你可能想知道ABP是如何處理這個的,實際上,ABP使用了和之前文檔描述的angularjs機制是一樣的。ABP會將token保存到一個cookie中,然後使用那個cookie設置請求頭。這個實現也很好地集成到了ASP.NET MVC, Web API 和 Core框架。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引言 基於生成圖片實現了一個手機號轉圖片的需求。 內容也很簡單,直接用手機號生成一個png圖片。就是為了背景透明以便其他地方調用。 有無鋸齒主要依靠一句代碼:g.TextRenderingHint= TextRenderingHint.AntiAlias; 生成圖片 1、有鋸齒 2、無鋸齒 生成方法 ...
  • 操作步驟: 給頁面隱藏TextBox賦值,然後觸發ASP.NET change事件,調用ASP.NET後臺方法,調用後執行客戶端腳本this.RegisterClientScriptBlock(DateTime.Now.ToString(), script); 執行頁面的script;頁面的scri ...
  • System.Data.OleDb.OleDbException: 未指定的錯誤的解決方法 ...
  • 很多時候我們在使用Lambda表達式查詢時,比如使用Lambda表達式查詢用戶數據,有時候會用電話或郵箱去查詢用戶信息,有時候又會用戶名去查詢用戶信息 其實查詢的結果都一樣,但唯一的區別就是Lambda表達式中的條件不一樣,那麼能不能只寫一個查詢方法,而實現Lambda表達式中Where的有查詢條件 ...
  • 只是想簡單說下表達式樹 - Expression Trees 目錄 簡介 Lambda 表達式創建表達式樹 API 創建表達式樹 解析表達式樹 表達式樹的永久性 編譯表達式樹 執行表達式樹 修改表達式樹 調試 簡介 表達式樹以樹形數據結構表示代碼,其中每一個節點都是一種表達式,比如方法調用和 x < ...
  • ps:曾經靠著這張圖做了很多的圖形報表 ...
  • 本主題是ASP.NET在移動設備上展示的方面的內容 起初看起來deviceFilters與前面的browserCaps類似。同樣也會關聯到HttpBrowserCapabilities,而在這裡用到的是MobileCapabilities,但是細看後發現browserCaps關註的是瀏覽器,devi ...
  • 定義用於支持 Web 應用程式部署的配置設置。 retail屬性:設置一個值,該值指定是否以發佈模式部署 Web 應用程式。預設值為 false。如果 retail 設置為 true,ASP.NET 將禁用某些配置設置,如跟蹤輸出、自定義錯誤和調試功能。 但是只要我在Web.Config裡面一加這個 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...