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オブジェクトは、によってrequestobject に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.userは によって設定されAuthenticationMiddlewareます。このミドルウェアは、 で定義されている django auth システムによって提供されるものをprocess_request内部的に使用します。get_user()django.contrib.auth.__init__.py

これget_user()は django セッションを使用し、django セッションは内部的に Cookie を使用します。keyDjango セッションはasで Cookie を使用しsessionidます。

したがって、悪意のあるユーザーが正当なユーザーの Cookie を取得し、この Cookie をサーバーに送信すると、サーバーは要求が正当なユーザーからのものであると見なし、正当なユーザーとしてログインします。しかし、リクエストは悪意のあるユーザーによって送信されたため、彼は正当なユーザーのリソースにアクセスできるようになりました。

于 2013-04-14T18:19:20.640 に答える