2012-12-23 114 views
0

編輯:看起來我對CSRF實際上是什麼感到困惑。我改寫的問題防止CSRF和防止垃圾郵件製造者

-

所以我知道有一噸大約防止CSRF的職位,但有這麼多的方法來繞過常見的方法:

CSRF令牌 - 設置一個CSRF令牌的形式,分配使用相同的數據一個cookie,並在服務器端

檢查useragents匹配它 - 確保所有的請求有一個有效的用戶代理的簡單方法。輕鬆繞過但簡單檢查仍然

基於IP的限制 - 根據請求者的IP地址限制請求。

-

但是,這都是可以容易繞過!還有什麼可以做,以防止這種事情?除了CAPTCHA之外的任何內容。

比方說,一個URL縮短樣本點。

  1. 用戶提交請求 - >返回縮短的URL。
  2. 的引用者是有效的(從原始形式)的腳本檢查 - 可以很容易地欺騙基於IP地址
  3. 檢查 - 代理解決此
  4. 檢查很容易得到CSRF令牌 - 垃圾郵件發送者可以很容易地繞過此首先訪問始發站點,並使用一套餅乾+令牌請求到現場

我只是不確定還有什麼可以做的?即使JavaScript是明智的,可以做些什麼來防止這種情況?爲cookie分配超時值可能有效,但垃圾郵件發送者只需通過訪問原始頁面將cookie重新分配給自己。

別的東西可以做,是顯示CAPTCHA的垃圾郵件發送者,如果請求的速度是高於平均水平。但我想要一些不會標記有效用戶的東西。是的,強迫用戶必須註冊一個帳戶才能解決這個問題,但不可行。

謝謝!

+2

你似乎在這裏混淆你的目標。你想阻止跨網站請求*僞造*,或者你想阻止*機器人*?這是兩個不同的事情,只有少量的重疊。 – Charles

+0

Both!垃圾郵件發送者從遠程服務器(CSRF)發送請求。我會稍微回答一下這個問題。謝謝。 – Prash

+1

我想你可能會混淆你的術語。 CSRF是* exploit *,惡意用戶通過該漏洞欺騙合法用戶進行非法請求。這聽起來像你真的只對預防機器人和非法用戶感興趣。這不是CSRF,這只是機器人保護。 – Charles

回答

3

時間。它通過。 CSRF需要被存儲。某處。雖然時間流逝,商店日期。如果您只留下一定的時間間隔,並且保留將時間轉化爲其他祕密的祕密,則垃圾郵件發送者不能「更新」到當前時間。

Misson完成。如何傳遞數據 - 確定在HTTP消息中的某處,通常在多個地方,例如,標題和正文 - 完全是您的選擇。

就照顧你只允許在可以執行的操作一定時限。

如果您需要更高的安全性,則需要用戶身份驗證(通過使用憑據登錄 - 或 - 通過使用UA規範(包括IP和請求標頭)自動登錄)。然後在該會話中,您可以保留很多服務器端的祕密,這是攻擊者無法預測的。

E.g.保持表單名稱和值完全動態。在提交它們之前使用JavaScript旋轉輸入值,只接受旋轉的值。根據時間改變旋轉。允許公開部分祕密共享一個當前時間來計算輪換。如上所述,取決於您的需求。

在這種情況下,HTTP的無狀態性質可能看起來像是一個弱點。但事實上,事實並非如此。用它。

+0

謝謝,我明白了!但問題是,如何阻止「垃圾郵件發送者」表單訪問這個網站的所有網站(即表單頁面)以及刮取表單名稱和定時令牌等?當然,如果我沒有誤解。肯定會減慢速度,但仍然非常有效。 我很抱歉,如果我誤解。此外,隨着時間跨度,爲CSRF令牌分配超時值? – Prash

+0

另外,對於隨機表單名稱,會將名稱存儲在會話數據中嗎? – Prash

+0

好的,你在技術上在這裏做的是你創建一個謎題。讓我們把它做成一個簡單的謎題:只有兩個部分。垃圾郵件發送者需要同時擁有兩個部分,第一部分可以通過第一個請求獲得,當然。接下來是第二部分。這部分取決於你。當然,垃圾郵件發送者總是可以嘗試在這裏進行反向工程,但是,垃圾郵件發送者通常會很容易地找到錢。不適合昂貴的東西。從技術上講,你可以接近規避一切,但對於垃圾郵件發送者來說,它實際上太貴了。 – hakre

0

您可以爲輸入字段生成隨機名稱,然後讓腳本標識它們全部。這與Facebook所做的相似,但效果很好。

+0

如果您的隨機名直接注入到DOM中,它可能會有效,但如果存在HTML表單,則表單令牌處理實際上是無用的,因爲攻擊者讀取腳本並返回所有字段。提交控件附近的一個複選框帶有一條說明,「如果您是人類,則取消選中該選項」可能會非常有效,尤其是當其中一個測試失敗時等待幾秒鐘的腳本配對時。 –