如何限制从 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管理部分功能的使用