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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...