2017-02-22 57 views
0

我正在使用Django编写Web应用程序。我试图让用户看到它的个人资料,只有他自己的资料。是否有可能伪造Django服务器的HttpRequest属性

if(not request.user.id == request.GET.get('user_id', '')): 
    raise PermissionDenied 

我的问题是:这是安全检查这种方式或有可能是一个聪明的孩子以某种方式改变request.user.id价值相匹配的人的user_id

用户必须在使用该访问该页面之前被记录在:

user = LDAPBackend().authenticate(username=username, password=password) 
if(user is not None): 
    login(request, user) 

回答

1

是的,它应该是安全的。

request.user get仅在使用会话cookie进行身份验证时填充。除非和直到有人偷走cookie或标记,否则应该是没有问题的。

我不明白的一件事是为什么你需要user_id参数在这里被明确地传递。

如果你正在登录,必须要查看页面。有两种方法我可以看到这一点。

  1. /profile

直接获得对应于request.user

用户简档
  • /<username>
  • 查询对应于用户名的简档,并比较它与request.user.id

    +0

    这是一个分级的应用程序,因此,任何教师都可以访问任何学生的个人资料,但任何学生只能看到自己的形象。这就是为什么我明确地通过student_id。谢谢! – pocpoc47

    1
    request.user

    使用AuthenticationMiddleware每个请求被设定:

    添加user属性,表示当前已登录在用户中,对每个传入的HttpRequest对象。

    如果用户未登录,则request.user设置为匿名用户。看看Authentication in Web requests

    因此,我不确定聪明的孩子如何改变登录用户的ID。

    大部分user与其配置文件之间存在one-to-one关系。如果是这种情况,您可以修改查询集以直接获取request.user的配置文件。

    1

    request.user已经是发送请求获取页面的当前用户的对象。您可以使用login_required或仅允许用户登录访问(2 solutions:装饰器或Mixin)。

    然后你可以使用你的条件来加载页面的功能。例如:

    => url。潘岳:

    url(r'^profile/$', login_required(app.views.profile), name='profile'), 
    

    => views.py:

    def profile(request): 
    try: 
        myProfile = User.objects.get(username=request.user.username) 
    except ObjectDoesNotExist: 
        return render(request, "error.html", {'message' : 'No Profile Found'}) 
    return render(request, "app/profile.html", 
           {'myProfile': myProfile}) 
    

    这样你就可以只显示您的个人资料(用户谁发送请求),你需要先登录。

    编辑:如果你不想“先试后赶上”您可以使用get_object_or_404(User, username=request.user.username)

    相关问题