2013-06-04 60 views
2

我有一個跟蹤我的用戶訪問頁面的網頁。這是一個「個人資料頁面」,如果有人訪問了你的「個人資料頁面」,他的訪問將被跟蹤,你會得到通知。如何防止嵌入式請求到我的網頁?

這與stackoverflow's profile page類似,它跟蹤配置文件視圖(雖然細節不同)。每當獨特的訪問者訪問您的個人資料頁面時,個人資料瀏覽計數器將會增加。

我使用存儲在瀏覽器Cookie中的隨機生成的令牌對用戶進行身份驗證。這是我的問題CSRF大問題,因爲任何隨機網站都可以簡單地代表我的用戶訪問網頁,而他們不知道。例如,攻擊者的網頁,可以簡單地指向我的網頁上嵌入的iframe或圖片:

<img src="http://mysite.com/profile-page"> 

or 

<iframe src="http://mysite.com/profile-page"></iframe> 

每當我的用戶訪問攻擊者的網頁,他們將拜訪某人的個人資料頁面沒有他們知道它(訪問是然後記錄)。

讓我用一個具體的例子來證明我的觀點:

許多網站,這些天允許用戶發佈圖片的網址。用戶可以發佈這樣一個形象:

<img src="https://stackoverflow.com/users/632951/pacerier"> 

圖像標記的src真的不是一個圖像文件,但是瀏覽器仍然會發出請求,並顯示一個空的圖像:

enter image description here

這意味着攻擊者已經成功地以用戶的名義向https://stackoverflow.com/users/632951/pacerier發出了請求,很可能沒有用戶知道它。

正如Preventing CSRF and XSRF Attacks中提到的,我們可以添加一些隱藏的輸入字段和一個表單「你確定要申請這個頁面嗎?」。缺點是每個請求頁面的真實用戶現在需要點擊按鈕,然後才能訪問網頁,這會嚴重破壞可用性。 我不想強制用戶點擊確認爲每個追蹤的頁面。

是否有其他更方便用戶的方式來防止CSRF獲取請求?

我們怎麼能告訴瀏覽器不要從域http://mysite.com請求頁面,如果它是一個嵌入式頁面(瀏覽器的地址欄沒有顯示請求的頁面,這意味着它是一個嵌入式圖像,框架,IFRAME等) ?

回答

2

這裏有一個方式,應該是相當簡單的,可靠的:

  • 不要指望請求作出的頁面,而是在的東西提出的請求的頁面(如AJAX請求和/或頁面上的圖像請求)。這將涉及img黑客行爲,因爲瀏覽器實際上不會嘗試將HTML頁面呈現爲圖像,因此不會在頁面上運行任何JavaScript或加載任何(子)圖像。

  • 將一個X-Frame-Options: DENY標題添加到該頁面,以便瀏覽器不會將其呈現在iframe之內。對於舊版本的瀏覽器(或僅作爲腰帶和吊帶方法的一部分),您還可以在發送AJAX確認之前讓您的JavaScript檢查window.parent == window

  • 最後,爲了保護(AJAX /圖片)的請求,你從欺騙做計數,包括一個獨特的,不可預測的令牌只適用於每個人的一次。一種方法是隨機生成令牌並將它們保存到數據庫(或會話存儲)中,直到它們被收回(或變得太舊)。

    或者,如果您不想將令牌存儲在數據庫中,則可以計算出時間戳記(例如用戶的IP地址)的MAC,並同時發送請求,並將錯誤的MAC或陳舊的時間戳。

+0

關於你的第三點,這是不是意味着使URL變醜? – Pacerier

+0

另外,是否有X-Frame-Options:用於圖像的DENY等價物? – Pacerier

+0

是的,AJAX請求的URLs很醜陋(除非你使用POST請求,在這種情況下,醜陋的東西將在請求體中),但用戶永遠不會看到這些,所以誰在乎?不,沒有用於圖像的「X-Frame-Options」,但不需要:只要您發送「text/html」(或「text/anything」)內容類型,瀏覽器就不會嘗試將您的頁面渲染爲圖像。在他們能夠找到內容類型之前,他們仍然需要_request_,但是,'X-Frame-Options'也一樣。 –