Django:使用@login_required和设置LOGIN_URL时存在信息泄露问题

10

我在使用@login_required装饰器并设置LOGIN_URL变量时,发现一种信息泄漏的形式。

我的网站要求所有内容都必须登录才能访问。问题是当你访问一个已存在的页面时,会被重定向到登录页面,并且next变量也被设置了。

因此,当未登录时请求以下内容时:

 http://localhost:8000/validurl/
你看到了这个:
 http://localhost:8000/login/?next=/validurl/

当请求一个不存在的页面时:

 http://localhost:8000/faultyurl/
你看到这个:
 http://localhost:8000/login/

我希望能够避免暴露一些信息。我考虑重写登录方法,将下一个参数强制设为空,并在子类化的方法中调用'super'。

另外一个问题是如果不设置LOGIN_URL,我的一些测试会失败。它们会重定向到'/accounts/login/'而不是'/login/'。因此,我想使用LOGIN_URL但禁用'自动下一步'功能。

有谁能给我指点一下吗?

十分感谢。

Gerard。


在我看来,这是半正确的行为。对于不存在的资源,您应该返回404,对于需要授权才能查看的现有资源,应返回403。换句话说,您不应该将不存在的内容重定向到登录页面 - 显示一个非常简单的404页面即可。 - Dominic Rodger
1个回答

5
你可以将这行代码包含在你的`urls.py`文件中作为最后一个模式。它会将没有匹配到其他模式的url重新路由到登录页面。
urlpatterns = patterns('',

    ...

    (r'^(?P<path>.+)$', 'django.views.generic.simple.redirect_to', {
        'url': '/login/?next=/%(path)s', 
        'permanent': False
    }),
)

编辑:为了让已认证的用户继续看到404页面,请执行以下操作:

from django.http import Http404, HttpResponseRedirect
def fake_redirect(request, path):
    if request.user.is_authenticated:
        raise Http404()
    else:
        return HttpResponseRedirect('/login/?next=/%s' % path)

urlpatterns = patterns('',

    ...

    (r'^(?P<path>.+)$', fake_redirect),
)

jbochi,有趣的解决方案。然而,这会破坏已经正确登录的用户的正常404行为。我必须检查一下我的自定义404处理程序的影响范围。它会检查某人是否已登录,然后决定是404还是登录。我看到一个循环正在出现 :) - GerardJP
@GerardJP。你说得对!我已经编辑了我的答案。请查看第二个解决方案。如果你想的话,你可以修改这一行 raise Http404() 来调用你自己的 404 处理程序。 - jbochi
jbochi,太好了!那确实是我正在寻找的。暂时我选择放宽了我的测试,并禁用了LOGIN_URL,因为这由我的404处理程序处理。否则,我只是在为一个我不使用的变量实现一些代码,除此之外还会破坏我的测试。但我一定会记住那个“捕获所有”URL技巧的。再次感谢! - GerardJP
我很高兴能够帮助!记得如果你喜欢的话可以将答案设置为已接受。 - jbochi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接