防止用户直接访问 django 中的重定向 URL

Posted

技术标签:

【中文标题】防止用户直接访问 django 中的重定向 URL【英文标题】:Prevent user from directly accessing a redirection URL in django 【发布时间】:2012-08-10 04:43:30 【问题描述】:

有些 URL 仅用于在操作成功后重定向用户。 (例如,提交反馈后的感谢页面)。

问题是这些页面可以直接访问。

有没有办法防止这种情况发生?

谢谢

【问题讨论】:

你可以从 HTTP 请求中check the referrer。 谢谢。但我认为这太低级了。我更喜欢不涉及查看 HTTP 标头的解决方案。 (例如 django 装饰器?) 当用户尝试访问此类页面时,您期望什么? 最好的情况是行为灵活且可编程。下一个最好的是 404 或 403。 【参考方案1】:

URL 由视图处理,因此请确保视图仅在它所做的最后一件事是对登录用户的成功操作时才满意。否则引发Http404。

只需检查视图中用户的会话变量即可。逻辑是这样的:

shop.html:用户点击“帖子”购买.html

buy.html 视图向用户收费,在会话中设置“刚买的东西”,重定向到 Thanks.html

view for Thanks.html 检查“刚买了东西”会话变量,如果设置为 404,则清除它,并在成功时为响应呈现模板。

【讨论】:

【参考方案2】:

如果用户不提供特定的 GET 参数,您可以在视图中执行一些非常简单的操作,例如重定向:

if not request.GET.get('show', False):
     # do redirection
else:
     # render the page

所以只能使用/my-url/?show=true访问该URL

【讨论】:

【参考方案3】:

我建议 the message framework 这样做。

【讨论】:

不错的方向。但这不是消息的预期用途。 AFAIK 消息框架用于显示消息,而不是在页面之间传达一般信息。但我想我喜欢它:) @fabiocerqueira,我认为,你的 hack 很糟糕。因为如果在消息 API 中实现了任何更改(将不考虑此类不合格的黑客攻击),则会导致代码被破坏。作为一项原则,按照预期的方式使用 API 总是好的。【参考方案4】:
def get_referer(request):
    referer = request.META.get('HTTP_REFERER')
    if not referer:
        return None
    return referer

然后在任何视图中:

def my_view(request):
    if not get_referer(request):
        raise Http404
    return render(request, 'sample.html', )

这里我们假设如果没有引用者 (None),则表示在浏览器中输入 URL 的人。

【讨论】:

以上是关于防止用户直接访问 django 中的重定向 URL的主要内容,如果未能解决你的问题,请参考以下文章

Django 身份验证 - 错误的重定向 url 到登录页面

django中用户退出

防止 Xmlhttprequest 的重定向

如何做nginx的重定向

在React中处理用户验证的重定向?

他的第一次连接的重定向用户