2014-02-08 58 views
2

我已經完成了一些使用Django作爲後端的移動應用程序,現在我正在開發一個Chrome擴展。我希望我的用戶能夠使用app/extension將POST請求發送到服務器,但是有沒有辦法在不首先向服務器請求CSRF令牌的情況下執行該操作?每次我們要提交數據時,它都會保存應用程序發出兩個請求。例如,我想在我的社交媒體應用上更新我的個人資料或從Chrome擴展程序更新錢包。打開配置文件視圖輸入數據並將其推送到服務器將會很好。如果我必須打開配置文件,然後等待它從服務器獲取令牌,然後我可以提交數據,那就不那麼光滑了。有沒有另一種方法來做到這一點?或者我堅持每次我想提交數據時發出多個請求?Django CSRF保護移動應用程序和Chrome擴展

此外,稍加說明,CSRF可防止網站使用用戶數據提交表單。但是阻止我製作一個使用Ajax或其他東西來獲取真實站點並竊取CSRF令牌並將其粘貼到我的跨站點請求表單中的網站是什麼?我覺得這裏有個漏洞。我知道我並不完全理解這一點。

回答

4

您可以也應該讓任何API端點CSRF豁免。

Django爲此提供了csrf_exempt裝飾工具,請參閱https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

此外,CSRF旨在防止通過GET請求僞造執行意外操作。它不是爲了讓自動化系統無法提交表單而存在的,因此存在驗證碼。

至於什麼阻止你使用AJAX來抓取整個網站,並提取令牌是所謂的Same-Origin Policy。這是由瀏覽器實現的,並且當AJAX調用的目標是不同的域而沒有正確的頭部設置時,阻止任何AJAX調用返回數據。 (我不完全確定沙盒應用於與此相關的Chrome擴展)。因此,它將或者至少應該不能通過AJAX爲普通網站獲取數據,例如,個人資料頁面。如果你想與第三方網站互動,你應該看看他們是否提供API。

+0

因此,使csrf_exempt只是使得一個csrf令牌不是必需的?如果我將它用於應用程序的後端而不提供實際頁面,那麼我可能會禁用中間件嗎?我今天做了很多關於csrf的文章(我以前認識過,但顯然不是)。說CSRF阻止人們製造一個虛假的網站試圖抓住你的用戶會話是否公平? –

+1

CSRF可能用於會話固定攻擊。但它也允許其他攻擊。如果你只是創建和API,你確實可以刪除CSRF中間件。相反,所有的請求都應該通過某種方式進行驗證。例如。令牌或憑證。 – EWit