Python 是否可以为Django服务器伪造HttpRequest属性

Python 是否可以为Django服务器伪造HttpRequest属性,python,django,http,authentication,Python,Django,Http,Authentication,我正在使用Django编写一个web应用程序。我试图让用户看到它的个人资料,只有他自己的 if(not request.user.id == request.GET.get('user_id', '')): raise PermissionDenied 我的问题是:以这种方式检查是否安全,或者聪明的孩子是否有可能以某种方式更改request.user.id中的值以匹配任何人的user\u id 用户必须先登录,然后才能使用以下命令访问此页面: user = LDAPBackend().

我正在使用Django编写一个web应用程序。我试图让用户看到它的个人资料,只有他自己的

if(not request.user.id == request.GET.get('user_id', '')):
    raise PermissionDenied
我的问题是:以这种方式检查是否安全,或者聪明的孩子是否有可能以某种方式更改
request.user.id
中的值以匹配任何人的
user\u id

用户必须先登录,然后才能使用以下命令访问此页面:

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

请求。为每个请求设置用户

将代表当前登录用户的
user
属性添加到每个传入的
HttpRequest
对象

如果用户未登录,则
request.user
设置为匿名用户。看一看

所以,我不知道一个聪明的孩子会如何改变登录用户的id


大多数情况下,
用户
与其配置文件之间存在一对一的关系。如果是这种情况,您可以修改查询集以直接获取
请求的配置文件。用户

请求。用户
为每个请求设置为使用:

将代表当前登录用户的
user
属性添加到每个传入的
HttpRequest
对象

如果用户未登录,则
request.user
设置为匿名用户。看一看

所以,我不知道一个聪明的孩子会如何改变登录用户的id


大多数情况下,
用户
与其配置文件之间存在一对一的关系。如果是这种情况,您可以修改查询集以直接获取
请求用户的配置文件。

是的,应该是安全的

仅当使用会话cookie进行身份验证时,才会填充request.user get。除非有人偷了饼干或代币,否则这不成问题

有一件事我不明白,为什么这里需要显式传递
user\u id
参数

如果您正在强制登录以查看页面。我有两种看法

  • /profile
  • 直接获取
    请求对应的用户配置文件。用户

  • /

  • 查询用户名对应的配置文件,并将其与request.user.id进行比较

    是,它应该是安全的

    仅当使用会话cookie进行身份验证时,才会填充request.user get。除非有人偷了饼干或代币,否则这不成问题

    有一件事我不明白,为什么这里需要显式传递
    user\u id
    参数

    如果您正在强制登录以查看页面。我有两种看法

  • /profile
  • 直接获取
    请求对应的用户配置文件。用户

  • /

  • 查询用户名对应的配置文件,并将其与request.user.id比较。user
    已是发送请求以获取页面的当前用户的对象。您可以使用
    login\u required
    或仅允许用户登录访问(:decorator或Mixin)

    然后可以使用您的条件在函数中加载页面。例如:

    =>url.py:

    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\u object\u或
    请求。User
    已经是关于发送请求以获取页面的当前用户的对象。您可以使用
    login\u required
    或仅允许用户登录访问(:decorator或Mixin)

    然后可以使用您的条件在函数中加载页面。例如:

    =>url.py:

    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\u object\u或\u 404(用户,用户名=request.User.username)

    这是一个评分应用程序,因此任何老师都可以访问任何学生的个人资料,但任何学生都只能看到自己的个人资料。这就是我明确通过学生证的原因。谢谢!这是一个评分应用程序,所以任何老师都可以访问任何学生档案,但任何学生只能看到自己的档案。这就是我明确通过学生证的原因。谢谢!