6

假设我有一个表单在数据库中执行某些操作并需要通过 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)

谢谢!

4

2 回答 2

7

request.user对象是由请求对象SimpleLazyObject添加的类型。auth middleware

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

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

backend_path = request.session[BACKEND_SESSION_KEY]
backend = load_backend(backend_path)
user = backend.get_user(user_id) or AnonymousUser()

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

于 2013-04-04T19:30:21.657 回答
5

userrequestie上的属性request.userAuthenticationMiddleware. process_request对于此中间件,内部使用get_user()django.contrib.auth.__init__.py.

get_user()使用 django session 和 django session 内部使用 cookie。Django 会话使用带有keyas的 cookie sessionid

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

于 2013-04-14T18:19:20.640 回答