2016-11-23 5 views
1

Mir wurde gesagt, dass alle vom Benutzer bereitgestellten Eingaben (z. B. $ _GET-Variablen) durch XSS-Filterung und htmlspecialchars gestellt werden müssen, um Datenbankangriffe zu verhindern. aber ich weiß nicht, welches ist das Beste, die Filterung in Controller oder die Modelle? Ich hoffe, ich bin nicht wieder Mikro-Optimierung ...htmlspecialchars in Controllern oder Modellen?

+0

Modell ist die sauberere Option – Blinkydamo

+0

Es ist interessant zu sehen, wie unterschiedliche Antworten auf verschiedene Aspekte der Frage konzentrieren. Antworten, die sagen, dass es im Modell sein sollte, sind korrekt, wenn wir über SQL-Injection sprechen - das sollte in der Tat verhindert werden, wo der Datenzugriff stattfindet.Der XSS-Aspekt der Frage verweist jedoch auf die Ansicht, die Ausgabecodierung sollte in Ansichten erfolgen, in denen die entsprechende Codierung ausgewählt werden kann. XSS ist eine Präsentationsverantwortung. –

Antwort

1

Persönlich würde ich eine Helper-Klasse mit solchen Funktionen, die instanziiert werden können, wo erforderlich, oder eine abstrakte Klasse oder Merkmal für Ihre Controller mit diesen Funktionen.

Sie sollten auch sicherstellen, dass die db-Modelle vorbereitete Anweisungen oder PDO verwenden, und Sie könnten auch eine weitere Ebene der Filterung/Bereinigung in die abstrakte Klasse des Modells aufnehmen.

2

Sie vermischen Dinge, fürchte ich.

Um "Datenbank-Attacken" (womit ich SQL Injection meine) zu vermeiden, müssen Sie parametrisierte Abfragen verwenden (mit etwas wie PDO in PHP). Es gibt große Fragen zu SO, die zu prevent SQL injection in PHP helfen.

Das hat aber nichts mit XSS und htmlspecialchars() zu tun.

XSS ist über einen Angreifer in der Lage, Javascript-Code in eine Anwendungsseite zu injizieren. Wenn dies durch eine beliebige Benutzereingabe möglich ist, ist die Seite anfällig für XSS.

Es ist ein großes Thema, aber in sehr kurzer Zeit ist XSS ein Ausgabeproblem, und die Lösung, die dazu beiträgt, es zu verhindern, ist die Ausgabecodierung. Es kann viele Formen haben, grundlegende HTML-Codierung wird von htmlspecialchars() in PHP durchgeführt, aber es gibt viel mehr dazu, wie zum Beispiel ist es unzureichend, wenn Variablen in einen Javascript-Kontext geschrieben werden (zwischen Skript-Tags, in Ereignisattribute, etc). Und dann haben wir DOM XSS nicht erwähnt, wenn das ganze in Javascript ohne einen einzigen Server Roundtrip passiert.

Ein vollständiges Tutorial zur Verhinderung von XSS würde hier nicht in eine Antwort passen.

Lassen Sie mich jedoch etwas, das eng mit Ihrer Frage verwandt ist. Sie sollten keine Benutzereingaben codieren, bevor Sie sie in Ihre Datenbank schreiben. Wenn Sie codierte Daten speichern, wird es auf der einen Seite viel schwieriger zu suchen/zu sortieren sein, da verschlüsselte Zeichen diese durcheinander bringen werden. Es ist auch eine Trennung der Sorgen Sache, Ihre Modelle haben nichts mit der Präsentation der Daten zu tun, und die Codierung ist Präsentationslogik. Wenn Sie Ihre Daten in der Datenbank speichern, wissen Sie nicht einmal, in welchem ​​Kontext sie präsentiert werden, so dass Sie nicht einmal die richtige Kodierungsmethode (html encoding? Javascirpt encoding? Xml oder json oder ldap? Wo werden Ihre Daten landen können) wählen ?).

So können Sie es einfach wie erhalten speichern (ordnungsgemäß für die SQL-Abfrage mithilfe von Parametern, offensichtlich), und dann kümmern sich um Ausgabecodierung in Ihren Ansichten, wenn diese Ausgabe tatsächlich vorgenommen wird.

+0

danke für die lange Antwort (Ich mag es, ich weiß einfach nicht, welche Worte zu verwenden). Ja, ich habe noch nie an einem großen Projekt gearbeitet, also musste ich mich zum ersten Mal um Sicherheitsfragen kümmern. Ich muss viel darüber nachlesen. – dapidmini

1

Ich bevorzuge das im Modell, nach dem Ergebnis.

Sobald Ergebnis bereit, ich möchte Ergebnisobjekt, Datumsformat, Zeichensatz und andere Werte ändern, um ein sauberes Objekt zurückzugeben.

Fettes Modell, schlanke Steuerung.

+0

bedeutet dies, dass die Abfrageergebnisse auch in Modellen geändert werden? wie htmlspecialchars_decode oder ähnliches hinzufügen? – dapidmini

+0

Ja, vorausgesetzt, Sie haben ein Objekt: – uruapanmexicansong

+0

Entschuldigung, Dies ist Ihr Abfrageobjekt: $ post-> title = "lorem ipsum"; $ post-> body = "Hallo Welt"; $ post-> date = "2016-11-24"; $ post-> tags = "lorem, ipsum, dolor, sit, amet"; Sie sollten Ihre Daten verarbeiten, um das endgültige Objekt zurückzugeben. Zum Beispiel: $ tags = $ post-> tags; $ post-> tags = explodieren (",", $ tags); $ post-> body = htmlspecialchars ($ post-> body); $ liste ($ post-> datum-> jahr, $ post-> datum-> monat, $ post-> datum-> tag) = explodieren ($ post-> datum); return $ post; Es gibt einige zu programmieren. Meine Empfehlung ist, sauberste sind besser. – uruapanmexicansong

Verwandte Themen