【问题标题】:Protecting GET request within Django web application在 Django Web 应用程序中保护 GET 请求
【发布时间】:2013-02-02 12:05:03
【问题描述】:

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

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

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

使用 CSRF Middle-ware 生成的 hash key 是个好习惯吗?有没有更好的办法?

【问题讨论】:

  • 你打算怎么称呼它?一个ajax调用?或者只是在内部,作为您自己的应用程序的网络服务。
  • @santiagobasulto 这是一个 Ajax 调用,我不想公开 API。想法是仅通过我正在构建的 Web 应用程序使用此 API。
  • 我对此也很好奇,想知道为什么扩展 CSRF 来覆盖它并不常见?或者至少它似乎没有记录在 django 文档中。似乎所有的 AJAX 调用都可以切换到 POST 以触发 CSRF 保护,但这感觉很hacky。

标签: python django api rest


【解决方案1】:

恐怕没有可靠的方法来实现这一点。我能想到的最好方法是在您的 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 视图中使用哪个。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 2015-10-15
      • 2010-12-15
      • 2022-10-17
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多