Django/Auth:可以利用 request.user 并指向其他用户吗?

Cod*_*ist 6 security authentication django http-post django-authentication

假设我有一个表单在数据库中执行某些操作并且需要通过 POST 发送的用户身份验证,是否有可能在内部请求邪恶的人更改用户以利用系统?

以下示例在数据库中创建一个项目,但需要登录用户。有人可以在request.user 中发送其他用户的数据吗?

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from items_core.models import Item
from items.forms import CreateItemForm
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
@login_required
def create(request):
    errors = None
    if request.method == 'POST':
        form = CreateItemForm(request.POST)
        if form.is_valid():
            try:
                Item.objects.get(
                    name = form.cleaned_data['name'],
                    user = request.user
                    )
                errors = 'Item already exist. Please provide other name.'
            except Item.DoesNotExist:
                Item.objects.create(
                    name = form.cleaned_data['name'],
                    user = request.user
                    )

                return redirect('items:list')

        form = CreateItemForm()
    else:
        form = CreateItemForm()

    template = {
        'form':form, 
        'items':Item.objects.filter(user=request.user),
        'request':request,
        'errors':errors
        }

    return render(request, 'items/item_create.html', template)
Run Code Online (Sandbox Code Playgroud)

谢谢!

kar*_*ikr 6

request.user对象的类型是SimpleLazyObject其由添加auth middleware到requestobject。

SimpleLazyObject(LazyObject):用于延迟包装类的实例化在请求实际登录用户时,get_user方法被调用。

def get_user(request):
    if not hasattr(request, '_cached_user'):
        request._cached_user = auth.get_user(request)
    return request._cached_user
Run Code Online (Sandbox Code Playgroud)

在这里,auth.get_user()将反过来验证这种方式:

backend_path = request.session[BACKEND_SESSION_KEY]
backend = load_backend(backend_path)
user = backend.get_user(user_id) or AnonymousUser()
Run Code Online (Sandbox Code Playgroud)

因此,如果request.user对象被篡改,则此验证将失败,因为会话数据验证将失败


Aks*_*aaj 5

userrequestie上的属性request.userAuthenticationMiddleware. process_request对于这个中间件,内部使用get_user()django auth 系统提供的,该系统在django.contrib.auth.__init__.py.

get_user()使用 django 会话,并且 django 会话内部使用 cookie。keyDjango 会话使用带有as的 cookie sessionid

因此,假设恶意用户获取了合法用户的 cookie 并将该 cookie 发送到服务器,服务器将认为该请求来自合法用户并以合法用户身份登录。但由于请求是由恶意用户发送的,因此他现在可以访问合法用户的资源。