如何保護特定的GET請求(例如:^api/...
)?在Django Web應用程序中保護GET請求
我想讓這個視圖(API調用)僅對我的Django Web應用程序可用。
它只能由Django Web應用程序調用,而不是直接調用。
使用由CSRF中間件生成的散列鍵是否是一個好習慣?有沒有更好的方法?
如何保護特定的GET請求(例如:^api/...
)?在Django Web應用程序中保護GET請求
我想讓這個視圖(API調用)僅對我的Django Web應用程序可用。
它只能由Django Web應用程序調用,而不是直接調用。
使用由CSRF中間件生成的散列鍵是否是一個好習慣?有沒有更好的方法?
看看這些replies,他們似乎已經經歷了同樣的問題。我會寫一個裝飾器,檢查request.META['REMOTE_ADDR']
是否與您的本地地址相同。
恐怕沒有可靠的方法來實現這一點。我能想到的最好方法是在你的javascript客戶端中生成某種私鑰,然後對代碼進行抽取。這會讓「攻擊者」很難使用你的方法。也許使用HMAC或類似的東西。
一個例子。您想要撥打以下電話:/api/users/1/vote_up
。你可以有一些代碼來生成私鑰:
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha256.js">
var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, generatePassphraseObfuscated());
hmac.update("/api/users/1/vote_up");
var hash = hmac.finalize();
$.ajax(
/api/users/1/vote_up,
{hash: hash}
)
</script>
的generatePassphraseObfuscated
功能是關鍵。你需要讓它很難複製。此外,您可以在每個請求中更改它,並添加一個cookie來識別您發送的「版本」。例如,您可以有兩個版本:
function generatePassphraseObfuscated(){
return 1;
}
function generatePassphraseObfuscated(){
return 2;
}
然後隨機提供它們,並用cookie標識它。所以你知道在你的django視圖中使用哪個。
再一次,它不可靠,沒有萬無一失的方法來做你想做的事情。這是讓其他人複製醜陋的一種愚蠢的方式。
你打算怎麼稱呼它? ajax呼叫?或者只是在內部,作爲您自己的應用程序的Web服務。 – santiagobasulto
@santiagobasulto這是一個Ajax調用,我不想讓這個API公開。想法是僅通過我正在構建的Web應用程序來使用此API。 – abhiomkar
我也很好奇,想知道爲什麼擴展CSRF來彌補這個問題並不常見?或者至少它似乎沒有在django文檔中記錄。看起來好像所有的AJAX調用都可以切換到POST來觸發CSRF保護,但是這感覺很不方便。 – MichaelJones