2016-05-03 14 views
2

ich etwas in Django Formularsätze bemerkt habe:Django Formset Sicherheit

Jeder formset.form hat ein verstecktes Feld mit der ID des Modells bearbeitet wird. Alles, was Sie tun müssen, ist diese ID ändern und übermitteln, und die Standard-Formularsatz clean() oder save() Methoden nicht ein Auge zuwerfen.

Ich würde denken, dass es nicht zu kompliziert wäre, zu verfolgen, welche Objekte in der ursprünglichen Formset-Abfragegruppe waren, und sie beim Speichern zu vergleichen. Ich frage mich, warum Django das nicht schon tut?

Was mich betrifft, ich bin die Überprüfung von Berechtigungen für formset wie sparen:

if formset.is_valid(): 
    for fs in formset: 
     report = fs.save(commit=False) 
     if can_edit(request.user, report): 
      report.save() 

Jeder andere Ankündigung dieses Problem? Ich wäre gespannt, wie Sie es angesprochen haben.

+0

Soweit ich mich erinnere, ist es nicht möglich, ein Objekt mit pk 'y' zu bearbeiten (was nicht im Abfrage-Set ist), indem die versteckte ID von' x' nach 'y' geändert wird. Wenn Sie etwas anderes gefunden haben, denke ich, dass dies ein Sicherheitsproblem ist, und es wäre besser, wenn Sie es privat melden, anstatt auf Stack Overflow zu posten. Ich glaube nicht, dass es einen bestimmten Grund für den derzeitigen Mangel an Fehlermeldung gibt - ich denke, ein Patch wäre willkommen. – Alasdair

+0

Es ist möglich (vorausgesetzt, der 'request.user' hat Bearbeitungsrechte für das Modell). Ich habe es gerade ausprobiert. –

+0

Reguläre Modellformsätze überprüfen "request.user" überhaupt nicht. Sprechen Sie über den Django-Administrator? – Alasdair

Antwort

0

Wenn Sie die erforderlichen Berechtigungen zum Bearbeiten dieses anderen Objekts haben, warum sollte Django Sie davon abhalten? HTTP-Anfragen sind zustandslos. Wenn also ein POST eingeht, prüft Django, ob Sie die Anfrage ausführen dürfen.

Nehmen wir an, Sie sind authentifiziert und haben die Berechtigung, Comment Objekte zu ändern. Ihr Formular hat einen Kommentar mit id=1. Sie ändern das versteckte Feld zu id=2 und senden das Formular ab. Django überprüft Ihre Berechtigungen und stellt fest, dass Sie eine beliebige Comment Instanz ändern und die POSTed-Änderung anwenden können.

+0

Vielleicht hast du recht. Da Django jedoch nicht mit Berechtigungen auf Objektebene ausgeliefert wird, ist das ein bisschen eine Gefahr. Z. B. kann ich sicherstellen, dass die Objekte auf dem Formularsatz ziemlich leicht zu dem "request.user" gehören, aber das gibt keinen Schutz. –

+0

Es gibt so viele praktische Werkzeuge wie 'is_valid()', 'csrf_token' und den' permission_required' Dekorator, es scheint eine kleine Methode zu sein, um zu sehen, ob das Formset manipuliert wurde, wäre eine gute Idee. –

+1

Es ist nicht so viel Django wie es HTTP ist, das nicht so funktioniert. Sie könnten erreichen, was Sie wollen, indem Sie alle 'id's in eine Zeichenkette setzen, sie dann hashen und diesen Hash an den Client senden, und wenn der Client das Formular abschickt, nehmen Sie die übergebenen' ids wieder, hash sie und vergleichen Sie die zwei Hashes. Ein anderer Weg wäre, Sie fügen die Liste der IDs in das Sitzungsobjekt des Benutzers ein und vergleichen, wann Sie das Formular erhalten. Aber so sollte es auch nicht sein. – C14L

Verwandte Themen