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)
谢谢!
该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对象被篡改,则此验证将失败,因为会话数据验证将失败
userrequestie上的属性request.user由AuthenticationMiddleware. process_request对于这个中间件,内部使用get_user()django auth 系统提供的,该系统在django.contrib.auth.__init__.py.
这get_user()使用 django 会话,并且 django 会话内部使用 cookie。keyDjango 会话使用带有as的 cookie sessionid。
因此,假设恶意用户获取了合法用户的 cookie 并将该 cookie 发送到服务器,服务器将认为该请求来自合法用户并以合法用户身份登录。但由于请求是由恶意用户发送的,因此他现在可以访问合法用户的资源。
| 归档时间: |
|
| 查看次数: |
1095 次 |
| 最近记录: |