2013-02-02 47 views
5

如何保護特定的GET請求(例如:^api/...)?在Django Web應用程序中保護GET請求

我想讓這個視圖(API調用)僅對我的Django Web應用程序可用。

它只能由Django Web應用程序調用,而不是直接調用。

使用由CSRF中間件生成的散列鍵是否是一個好習慣?有沒有更好的方法?

+0

你打算怎麼稱呼它? ajax呼叫?或者只是在內部,作爲您自己的應用程序的Web服務。 – santiagobasulto

+0

@santiagobasulto這是一個Ajax調用,我不想讓這個API公開。想法是僅通過我正在構建的Web應用程序來使用此API。 – abhiomkar

+0

我也很好奇,想知道爲什麼擴展CSRF來彌補這個問題並不常見?或者至少它似乎沒有在django文檔中記錄。看起來好像所有的AJAX調用都可以切換到POST來觸發CSRF保護,但是這感覺很不方便。 – MichaelJones

回答

0

看看這些replies,他們似乎已經經歷了同樣的問題。我會寫一個裝飾器,檢查request.META['REMOTE_ADDR']是否與您的本地地址相同。

2

恐怕沒有可靠的方法來實現這一點。我能想到的最好方法是在你的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視圖中使用哪個。

再一次,它不可靠,沒有萬無一失的方法來做你想做的事情。這是讓其他人複製醜陋的一種愚蠢的方式。