2011-04-01 72 views
1

我想保護我的網站免受cross-site request forgery的侵害。我試圖按照these recommendations,通過發送會話特定的令牌以及所有需要保護的請求。通過跨域JavaScript呼叫預防CSRF

問題在於我有一些請求被設計爲由不同域上的第三方網站調用。他們大多使用JSONP:他們使用<script>標籤向我們的服務器發出請求,響應是JavaScript代碼,它在頁面上調用一個函數。

我的問題是,如何在這些請求中傳遞令牌?看來第三方網站需要知道令牌。我可以提供另一個將令牌作爲JSON返回的請求,但不可信站點可以發出相同的請求,獲取令牌並用它來僞造對服務器的請求。

有沒有更好的方法來做到這一點?

+1

當他們請求JS時是否實際執行了任何操作?有什麼理由*你需要保護腳本? – sdleihssirhc 2011-04-01 22:24:00

+0

是的,一些腳本執行的操作我不希望未經授權的站點能夠執行。 – 2011-04-01 22:58:42

+1

我的理解是JSONP基本上是通過GET請求來操作的,但是防止CSRF的第一步就是隻使用POST。 – sdleihssirhc 2011-04-01 23:03:05

回答

3

XSRF標記通常是您生成的域中的Cookie。你真的不想引入一種機制來允許其他網站設置這些機制。驗證來自可信方的消息最好被視爲簽名驗證問題。

您可以讓每個合作伙伴網站生成並保留私鑰/公鑰signature密鑰對。然後他們可以向您發送他們的公鑰。

然後他們可以在他們的消息上簽名。

所以他們的要求看起來像

<script src="https://.../yourservice?partnerid=foobar&signedquerystring"></script> 

,然後你可以檢查數字簽名,該簽名的查詢字符串使用您通過密鑰foobar擡頭公鑰正確簽名。

您現在知道信任該請求,前提是該請求包含您的XSRF令牌或使用您與之建立關係的合作伙伴的私鑰進行了正確簽名。

這不會阻止某個可以觀察登錄用戶查看合作伙伴網站的人重播請求,因此合作伙伴網站和您的腳本都應該通過安全通道(https)加載,就像您一樣多用途XSRF令牌。

+0

儘管這確實增加了難度,並且需要服務器端處理,但首先擊敗了使用JSONP的許多優點。 – 2013-02-06 21:58:46

+0

@PhillipWhelan,XSRF保護是關於防止濫用同源特權。除非一個服務器參與調解在其源中運行的內容,否則就無法完成,所以是的,可以運行可濫用權限的JSONP需要服務器往返。唯一的選擇是讓客戶端代碼(來自該源,但可緩存)檢查跨越原始獲取的內容並保留任何安全屬性。 '

0

我有最簡單的解決方案JSONP CSRF問題,添加「while(1);」或「for(,,);」或扔「F *** U」;在json響應數據的開始。

現在任何JSONP請求都會以無限循環結束。因爲您沒有使用JSONP請求,所以您可以通過此代碼修改響應

JSON.parse(this.responseText.slice("while(1);".length));