2016-11-18 138 views
1

在同步標記模式,我總是看到在一個隱藏字段或URL的CSRF令牌。將它附加到ajax post請求的末尾並讓服務器決定是否需要使用它是否安全?如果這是爲什麼人們不這樣做?CSRF同步令牌

回答

0

簡短的回答是,它並沒有多麼您在同步標記模式發送令牌,只要它是不會自動發送瀏覽器請求是否被另一個原點(即製造。它不是在一個cookie )。因此,將它附加到ajax post請求的末尾是很好的(雖然我不太清楚你的意思:))。

在談到沒有Ajax調用傳統的表單應用程序,一個隱藏的表單字段是最便捷的方式。您只需將標記放置在每個表單的隱藏字段中,並且客戶端上沒有任何其他操作可以輕鬆完成。

阿賈克斯改變了風景,AJAX調用不會自動發送令牌,你要自動照顧它。例如,對於jQuery,您可以使用$.ajaxSetup中的beforeSend鉤子自動將令牌添加到請求。當請求內容類型爲x-www-form-urlencoded時,您可以將其添加爲另一個表單變量,當它是一個帶有application/json的json請求時,可以將其添加爲json值。這將是安全的,但我可以看到兩個問題。

之一是,令牌是一種「元數據」的要求,你的業務邏輯和業務數據的不部分。它也是跨數據結構的一個交叉問題,並不針對查詢。所以最好不要使用數據結構。

另一個問題是,在加入beforeSend令牌到已經請求池莉構建數據是乏味的。您必須深入研究數據結構,找到/創建令牌的變量等。

將它作爲標記發送會更容易,這是人們在將標記添加到ajax請求時主要執行的操作。添加像X-CSRF-Token或類似的自定義請求標頭非常常見,然後服務器端可以從那裏驗證令牌。

+0

非常好的解釋!我有一個非傳統的方式來在PHP中完成它。這不是常識,因爲它是我爲我的應用程序專門設計的。我只是想知道是否有任何安全問題,我沒有太多的知識來糾正應用程序的安全問題,以及哪些是明顯或不明顯的缺陷。 –