在Django Web应用程序中保护GET请求

时间:2013-02-02 12:05:04

标签: python django api rest

如何保护特定的GET请求(例如:^api/...)?

我想让这个视图(API调用)只对我的Django Web应用程序可用。

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

使用CSRF Middleware生成的哈希密钥是一个好习惯吗?有没有更好的方法?

2 个答案:

答案 0 :(得分: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视图中使用哪个。

同样,它不可靠,没有万无一失的方法可以做你想做的事。让其他人复制它是一种愚蠢的方式。

答案 1 :(得分:0)

查看这些replies,他们似乎已经遇到了同样的问题。我会写一个装饰器来检查request.META['REMOTE_ADDR']是否与您的本地地址相同。