2014-01-31 74 views
21

什麼<元>像把CSRF令牌名稱和值內<頭使用>標籤的需求:爲什麼CSRF令牌應該放在meta標籤和cookie中?

如:

<meta content="authenticity_token" name="csrf-param" /> 
<meta content="4sWPhTlJAmt1IcyNq1FCyivsAVhHqjiDCKRXOgOQock=" name="csrf-token" /> 

我讀過有關概念將CSRF值保存在cookie中,但沒有找到爲什麼要保留在裏面<頭>標記。

回答

14

要到prevent CSRF您需要提交一個值,該值與惡意網站無法發送的請求一起提交。身份驗證Cookie不合適,因爲如果攻擊者可以讓瀏覽器向受害者站點發送請求,則Cookie將自動提交。

例如,通過提交包含在www.evil.com通過JavaScript形式對www.example.com攻擊用戶的會話:

<form method="post" action="https://www.example.com/executeAction"> 
    <input type="hidden" name="action" value="deleteAllUsers"> 
</form> 

<script>document.forms[0].submit()</script> 

在頁面內存儲的反CRSF令牌是爲了防止其他網站從提交OWASP推薦的解決方案由於Same Origin Policy阻止在www.evil.com上的JavaScript讀取www.example.com的頁面內容,因此用戶會話中的隨機令牌無法被www.evil.com讀取。

這些標記可以存儲在頁面的任何位置。最常見的是它將在隱藏的表單域中,但它們也可以存儲在HTML 5 data- attributes之內。似乎使用meta標籤是JavaScript可以將其包含在頁面製作的任何表單提交中的另一種方式。

+0

'www.evil.com'應該無法獲得即使SOP被禁用**,也就是來自「www.example.com」的用戶的確切標記**(即來自'www.evil.com'的請求是一個單獨的會話,因此應該生成新的標記)。 – rakeen

+0

如果使用瀏覽器的相同實例(當然是使用隱身或隱私瀏覽模式),這是相同的會話。 – SilverlightFox

+0

「www.example.com」如何知道它是否是同一會話? 來自'www.evil.com'的請求沒有任何標記。 – rakeen

1

我可以想象的唯一選擇是使數據可以從JavaScript訪問。只是爲了防止cookie僅爲http。

+0

好吧,我知道了,但我仍然困惑。非常感謝你。 – vinaykrsharma

+0

如果我的答案幫助你,請記住接受它。 – rekire

2

這是因爲沒有什麼能夠阻止從發佈數據到合法網站的違規網站,這可能包括您的身份驗證票證和您的CSRF令牌。想象一下這種情況......取自ASP.NET

  1. 用戶使用表單身份驗證登錄到www.siteA.com。
  2. 服務器驗證用戶。來自服務器的響應包含身份驗證Cookie。
  3. 如果不註銷,用戶將訪問惡意網站。該惡意網站包含以下HTML表格:

    <h1>You Are a Winner!</h1> 
        <form action="http://siteA.com/api/account" method="post"> 
         <input type="hidden" name="Transaction" value="withdraw" /> 
         <input type="hidden" name="Amount" value="1000000" /> 
    <input type="submit" value="Click Me"/> 
        </form> 
    

注意,表單操作崗位的漏洞的網站,而不是惡意網站。這是CSRF的「跨站點」部分。

用戶點擊提交按鈕。瀏覽器在請求中包含身份驗證Cookie。 請求使用用戶的認證上下文在服務器上運行,並且可以執行認證用戶被允許執行的任何操作。

所以基本上,當siteA.com收到CSRF攻擊時,它應該匹配Cookie中的CSRF標記與元標記中的CSRF標記。合法請求將包括兩種情況,但是,僞造攻擊只會包含Cookie中指定的CSRF令牌。

9

CSRF令牌通常以隱藏表單域的形式出現。如果您使用的是JavaScript,將它們放在元標記中才有意義。 JavaScript可以從元標記讀取標記並將其發佈到一個操作。

您不希望將CSRF令牌放入Cookie中,因爲無論cookie來源如何,都會從Web瀏覽器向特定網站發送每個請求的cookie。唯一的例外將是安全cookie,這應該遵循同源策略。

+0

在Cookie中存儲XSRF標記時如果發送請求時我設置了X-XSRF-TOKEN標頭並檢查標頭服務器端忽略cookie – DevEng