簡體   English   中英

ASP.NET MVC - 關於GET請求的CSRF

[英]ASP.NET MVC - CSRF on a GET request

我們有一個ASP.NET MVC應用程序。 通過使用@Html.AntiForgeryTokenValidateAntiForgeryToken屬性,所有POST請求(表單提交)都已受到CSRF保護。 控制器上的一個操作方法是GET,它向用戶返回一個報告(一個包含數據庫數據的pdf文件)。 簽名是:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetReport()
{
    // get data from db
    return GetReport();

}

以下是我要針對此操作測試CSRF的步驟:

  1. 用戶登錄到應用程序
  2. 登錄后,用戶打開以下HTML文件並單擊“提交”按鈕:
  3. 該報告已下載。

問題:

這可以被視為CSRF攻擊嗎?

如果是的話,如何減輕它? 由於action方法是GET請求,我如何使用MVC的CSRF方法(在action方法上應用@Html.AntiForgeryTokenValidateAntiForgeryToken )。

HTML文件:

<html>
      <body>
        <form action="https://<baseurl>/Analysis/GetReport">
                <input type="submit" value="Submit request" />
            </form>
          </body>
</html>

簡而言之,您剛才描述的並不是 XSRF攻擊的一個例子......


什么是XSRF攻擊?

CSRFXSRF都用於描述所謂的Cross Site Request Forgery 這是惡意網站利用您在其他網站上的身份驗證狀態來執行欺詐性跨網站請求的地方。

示例:網上銀行。

銀行

想象一下,您在銀行的網站上進行了authenticated ,並且您的銀行網站包含一個用於創建新交易的form ,所有這些都很直接......

<!-- Malicious website -->
<form action="http://yourbank.com/send_moneh" method="POST">
    <input type="hidden" name="amount" value="100.00"/>
    <input type="hidden" name="accountNumber" value="123456" />
</form>
惡意網站

現在讓我們想一下您正在訪問的Malicious website ,想象它還包含一個form ,一個隱藏的form ,其值已經預先填充...

 <!-- Malicious website --> <form action="http://yourbank.com/send_moneh" method="POST"> <input type="hidden" name="amount" value="100.00"/> <input type="hidden" name="accountNumber" value="123456" /> </form> 

當提交惡意網站上的表單時, HTTP request將直接從發送到您的銀行 ,並且由於您在銀行的網站上進行了身份驗證,因此可以接受該交易。

從本質上講,攻擊者通過偽造請求並使用您作為傳遞該請求的信使來使用您自己的身份驗證。


怎么預防呢?

您使用防偽令牌,此token是包含隨機值的字符串,除了您的HTML表單之外,令牌也會放在您的cookies中。

當您收到請求時,您將驗證該表單是否包含防偽令牌,並且它與您存儲在Cookie中的令牌相匹配。 惡意站點無法看到您的網站在客戶端上設置的令牌,如果沒有此信息,XSRF攻擊就會停止。


如何在ASP.NET MVC中實現它?

在您的控制器上將處理請求的Action,添加屬性[ValidateAntiForgeryToken] ,並在HTML表單中添加(@Html.AntiForgeryToken())

 public class ExampleController : Controller { [ValidateAntiForgeryToken] [HttpPost] public ActionResult Test(Foo fooModel) { // do your thing... return this.View(); } } <form action="/Example/test" method="POST"> @Html.AntiForgeryToken() <input type="text" name="bar" /> <input type="submit" value="Submit" /> </form> 

而已!


提示/指針/建議

防偽代碼在執行GET請求時沒有多大意義,實際上,將它們放在您未修改和保留數據的任何地方都沒有意義,因為任何GET請求都將返回給您的用戶而不是攻擊者。

如果您正在創建,更新或刪除數據...請確保您正在使用它。

通常安全的方法不必受CSRF保護,因為它們不會對應用程序進行更改,即使它們返回敏感信息,也會受到瀏覽器中同源策略的保護。

如果您的站點是按照標准實現的,那么您的GET請求應該是安全的,因此不需要保護。

但是,存在可以執行“跨站點DoS” *攻擊的特定情況。 假設您的報告頁面需要10秒鍾才能執行,數據庫服務器上的CPU使用率為100%,Web服務器上的CPU使用率為80%。

您的網站用戶知道在辦公時間內永遠不會訪問https://<baseurl>/Analysis/GetReport ,因為它會導致服務器死亡並使其他用戶體驗不良。

但是, Chuck想要將你的<baseurl>網站脫機,因為他不喜歡你或你的公司。

在他經常發帖的繁忙論壇http://forum.walkertexasranger.example.com ,他將自己的簽名設置為以下內容:

<img src="https://yoursite.example.org/Analysis/GetReport" width=0 height=0 />

他也知道貴公司的員工經常在論壇上,經常登錄yoursite.example.org

每當您的員工讀取Chuck的帖子之一時,身份驗證cookie就會發送到https://yoursite.example.org/Analysis/GetReport ,因此您的站點會處理請求並生成報告,並且您的系統因為CPU而脫機被這些不斷的要求吃掉了。

因此,即使請求是GET請求並且不對系統進行任何永久性更改(也稱為“安全”),它實際上會在每次運行時關閉系統。 因此,最好采用一些CSRF預防方法來保護這一點。 最簡單的方法是轉換它,以便只能通過POST請求生成報告,因此可以通過AntiForgeryToken驗證請求。

* XSDoS,或跨站點拒絕服務,是我創造的一個短語,所以不要去谷歌搜索它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM