如何限制从 django 网站执行的视图功能?

Posted

技术标签:

【中文标题】如何限制从 django 网站执行的视图功能?【英文标题】:how to restrict a view function to be executed from website in django? 【发布时间】:2015-02-13 23:24:04 【问题描述】:

我有一个使用 django 1.6.0 和 python 2.7.5 开发的网站。在我的 view.py 文件中,我定义了一个方法,只有当对该视图的请求从某个地方重定向请求时,我才想执行该方法。我想通过输入 url 来限制用户执行该视图。

假设 view.py:

def online_test(request):
   return buy_test_final(request)

urls.py:

url(r'^test$',online_test),  

我需要限制从 url 访问 online_test 方法。

【问题讨论】:

这可能无法安全地执行,除非您提供一些证明重定向页面已被访问的证据,例如通过会话数据。为什么这个不想让人直接访问的视图竟然有自己的URL? 【参考方案1】:

为了使该视图仅可用于重定向请求,您可以检查 request.META 是否具有 HTTP_REFERER

def online_test(request):
    if 'HTTP_REFERER' not in request.META:
        raise Http404

    return buy_test_final(request)

编辑

正如Andrew Gorcester 在下面的评论中指出的那样,HTTP 标头可以手动操作。不仅如此,有人可以使用 Chrome 的开发者工具在您网站的任何页面上简单地添加一个链接。像这样:<a href="/test/">Test</a>。如果他点击此链接,request.META 将拥有HTTP_REFERER,从而执行该视图。

如果必须,请谨慎使用上述代码。

【讨论】:

我认为这不会起作用,因为我相信 HTTP_REFERER 仅适用于用户点击的 url,而不适用于 301/302 重定向。例如,如果您通过单击页面 A 上的链接访问页面 B,并且页面 B 重定向到页面 C,则页面 C 的视图处理程序处的请求将显示引荐来源为 A。 @AndrewGorcester 适用于 301/302 重定向。我刚刚检查过。 我很惊讶,但没关系。在这种情况下,请记住手动添加 HTTP 标头很简单,因此任何具有安全意识的代码都不应使用此方法。 @AndrewGorcester 编辑了我的答案。谢谢。 @xyres @Andrew 感谢您回答我的问题。我认为这是为了让“HTTP_REFERER”作为请求的验证者。我应该添加用户将被重定向到我的视图的网站的 ip。 ... 例如 'if request.META['REMOTE_ADDR'] == "第三方网站的 IP 地址":'

以上是关于如何限制从 django 网站执行的视图功能?的主要内容,如果未能解决你的问题,请参考以下文章

使用Django自带的登录访问限制login_required

Django Admin Cookbook-18如何限制对Django Admin管理部分功能的使用

如何在双连接关系之后在 Django 中执行查询(或:如何绕过 Django 对多对多“通过”模型的限制?)

如何限制请求数量?姜戈

Django如何将模板限制为只有两个帖子

如何限制 Django 错误邮件