如何保护特定的 GET 请求(例如:)^api/...
?
我想让这个视图(API 调用)只对我的 Django Web 应用程序可用。
它只能由 Django Web 应用程序调用,而不是直接调用。
使用 CSRF 中间件生成的哈希键是一个好习惯吗?有没有更好的方法?
恐怕没有可靠的方法来实现这一点。我能想到的最好方法是在您的 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 视图中使用哪个。
同样,它不可靠,没有万无一失的方法可以做你想做的事。这只是一种愚蠢的方式,让其他人复制它变得丑陋。
查看这些回复,他们似乎经历了同样的问题。我会编写一个装饰器来检查是否request.META['REMOTE_ADDR']
与您的本地地址相同。