3

比方說,我有一個做數據庫的東西,需要已通過POST發送用戶身份驗證的形式,有可能裏面要求有人邪改變用戶以利用系統?Django/Auth:可以request.user被利用並指向其他用戶嗎?

以下示例在數據庫中創建一個項目,但需要登錄的用戶。有人可以發送其他用戶的數據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) 

謝謝!

回答

3

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()將inturn驗證這種方式:

​​3210

因此,如果request.user對象被篡改,該驗證將失敗作爲會話數據驗證將失敗

+0

是不是也在響應對象中傳遞了用戶對象,以便可以通過模板訪問它?由於安全問題,我有沒有辦法通過用戶對象? – user1050619 2015-12-22 03:17:39

+0

@ user1050619在一箇中間件中,你可以這樣做:'del response ['user']'。還要確保你刪除了相應的上下文處理器。更多信息,請訪問:https://docs.djangoproject.com/en/1.9/ref/request-response/ – karthikr 2015-12-23 01:46:13

2

user屬性上requestrequest.userAuthenticationMiddleware設置。 process_request該中間件內部使用get_user()由django認證系統提供,該系統在django.contrib.auth.__init__.py中定義。

這個get_user()使用django會話和django會話在內部使用cookie。 Django會話使用與key一樣的cookie作爲sessionid

因此,假設惡意用戶獲取合法用戶的cookie並將此cookie發送到服務器,服務器會認爲該請求來自合法用戶並將以合法用戶身份登錄。但由於請求是由惡意用戶發送的,他現在可以訪問合法用戶的資源。

相關問題