2012-05-05 1 views
8

Edit:Behandelt CakePHP beim Speichern geänderter Daten automatisch Massensicherheitsanfälligkeiten?

Nach mehr Informationen von DCoder Empfangen ich die Phrase für hier war auf der Suche ist eine „Massenzuordnung Verletzlichkeit.“ Das heißt, den Vorteil von Methoden zu nutzen, die alle gültigen Felder in der Datenbank speichern, unabhängig von ihrer Anwesenheit auf dem ursprünglichen Formular (wodurch sie anfällig für manipulierte POST-Daten werden, die mehr [möglicherweise kritischere] Felder als die vorgesehenen enthalten).

Die beiden üblichen Antworten werden dann entsprechend als Whitelisting und Blacklisting bezeichnet; Whitelisting-Felder, die zur Änderung bestimmt sind, oder Blacklisting-Felder, die nicht geändert werden sollen.

Meine Frage folgt dann: setzt CakePHP automatisch nur die Felder im sendenden Formular auf die weiße Liste, oder ist es für mich (und andere Cake-Fans) notwendig, dass wir Whitelisting oder Blacklisting durchführen?


Ursprüngliche Frage:

Kuchen viele große Möglichkeiten bietet Formen zu erzeugen und sie fast automatisch handhaben. Als ich über Sicherheit nachdachte, fragte ich mich: Ist Cake bewusst, welche Felder in einem Formular vorhanden waren, oder akzeptiert es einfach ein beliebiges gültiges Feld? Nehmen Sie das folgende Szenario, wenn ich keinen Sinn habe (und jemand ist willkommen, meine Frage besser zu formulieren, wenn sie sich einen besseren Weg vorstellen können):

Lassen Sie mich sagen, ich erlaube meinen Benutzern, ihre zu bearbeiten Profil. Ich erstelle ein Formular mit Feldern für Benutzername, E-Mail und Passwort unter der Aktion edit.

Ein kluger Benutzer möchte kommen und ihre is_admin Feld von false zu true ändern, so dass sie verwenden, um eine App wie Firebug benutzerdefinierte Post-Daten an die edit Aktion zu unterbreiten, die das Feld is_admin Satz true enthält.

Die Frage ist, würde Cake selbst erkennen, dass is_admin nicht in der ursprünglichen Form war, oder muss ich vorsichtig sein, die Felder explizit anzugeben, die eine bestimmte Aktion Felder ändern kann? Gibt es einen leichteren Weg?

Vielen Dank!

James

+1

Dies wird als „Massenzuordnung“ bekannt ist und es vor kurzem Schlagzeilen gemacht, als es war [ verwendet, um GitHub "zu hacken" (http://arstechnica.com/business/news/2012/03/hacker-commandeers-github-to-prove-vuln-in-ruby.ars). Normalerweise besteht die Lösung darin, die Felder, die massenweise zugewiesen werden können, auf die weiße Liste zu setzen. – DCoder

+0

@DCoder, danke, den Namen zu haben hilft sehr. Ich werde die Frage so ändern, dass sie diese Informationen widerspiegelt. – xtraorange

Antwort

4

Sie haben die SecurityComponent in Ihrem Controller laden (s) und CakePHP Formular für Sie Manipulationen zu verhindern, siehe http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#form-tampering-prevention

+1

Ich rate dir auch (xtraorange) zu lesen http://www.dereuromark.de/2010/09/21/saving-model- data-and-security/ – mark

+0

Das ist sehr hilfreich (euch beide). @mark - Ich habe den Artikel durchgelesen und festgestellt, dass er alle Probleme angesprochen hat, an die ich gedacht habe (und eine, die ich nicht berücksichtigt hatte). Ich habe bemerkt, dass der Artikel etwas veraltet ist und ich bin mir nicht sicher, wann du ihn zuletzt aktualisiert hast: Was fühlst du jetzt an der Sicherheitskomponente? Wenn ich es benutzen sollte, worauf sollte ich noch achten müssen? – xtraorange

+1

Also einschließlich der Sicherheitskomponente im AppController schützt jedes Formular vor Manipulation? Kennst du die Leistung, die davon betroffen ist? – Leo

-2

CakePHP verfügt über eine integrierte Validierungsoption. Das Formular generiert automatisch die Felder und führt die Validierung basierend auf den Validierungskriterien durch, die Sie im Modell erwähnt haben. Diese Validierung wird automatisch vor der Save-Methode aufgerufen.

Auch wenn Sie eine benutzerdefinierte Validierung hinzufügen möchten, können Sie diese im Modell hinzufügen.

Mit Ihrer spezifischen Abfrage können Sie das Feld is_admin aus dem Bearbeitungsformular entfernen, damit es für den Benutzer nicht bearbeitet werden kann. Wenn Sie mehr Sicherheit hinzufügen und sicherstellen möchten, dass das Feld is_admin einen falschen Wert aufweist, können Sie den Wert in der Controller-Edit-Methode bearbeiten.

In der Edit-Methode können Sie den folgenden Code hinzufügen, bevor Sie die Aktion Speichern aufrufen.
$this->request->data['ModelName']['is_admin] = false;

+0

Nun, ich verweise nicht auf Validierung. Ich verstehe zwar die Kuchenvalidierung, aber ich glaube nicht, dass das hier zutrifft. Soweit "is_admin", das ist wirklich nur ein Beispiel. Der Punkt ist, dass ich mich frage, ob ein Benutzer ändern wollte, was auch immer er mag, unabhängig davon, ob ich es für veränderbar halten wollte, für jedes Modell, an dem er etwas ändern kann. Wie verhindere ich das? – xtraorange

+0

Sie können das Feld auf der Bearbeitungsseite deaktivieren, die der Benutzer nicht bearbeiten soll. Selbst wenn Sie glauben, dass der Benutzer die Daten mithilfe von Firebug manipulieren kann, können Sie die ursprünglichen Daten vor der Methode Save in der Bearbeitungsaktion der Controller erneut schreiben. '$ this-> request-> data ['ModelName'] ['is_admin] = false;' – Saanch

+0

Leider kann ich das nicht wirklich in vollem Umfang anwenden. Wenn ich nur um ein Feld besorgt war, vor allem, wenn ich wusste, dass es Inhalt erwartet. Aber ich schaue mir ein anwendungsweites Szenario an, das auf dem modellierten Beispiel basiert. viele viele Felder mit dem gleichen Thema, verschiedene Benutzerlevels mit unterschiedlichen Rechten usw. Vielleicht ein bisschen verwirrend, ein Beispiel zu nennen, habe ich meine Frage geklärt, hoffentlich hilft das. Vielen Dank für Ihre Eingabe – xtraorange