Frage

Wenn ich mich darauf vorbereite, das Problem der Eingangsdatenfilterung und -entsorgung anzugehen, bin ich gespannt, ob es eine beste (oder am meisten verwendete) Praxis gibt? Ist es besser, die Daten (von HTML, JavaScript usw.) zu filtern/zu sanieren, bevor die Daten in die Datenbank eingefügt werden, oder sollte sie erfolgen, wenn die Daten für die Anzeige in HTML erstellt werden?

Ein paar Hinweise:

  • Ich mache das in PHP, aber ich vermute, dass die Antwort darauf Sprache agnostisch ist. Wenn Sie jedoch Empfehlungen für PHP haben, teilen Sie dies bitte mit!
  • Dies geht nicht darum, den Daten für die Datenbankinsertion zu entkommen. Ich habe das PDO bereits ganz gut.

Vielen Dank!

War es hilfreich?

Lösung

Wenn es darum geht, benutzergerichtete Daten anzuzeigen, besteht das allgemein anerkannte Mantra darin, "Eingabe zu filtern, Fluchtausgabe".

Ich würde empfehlen, Dingen wie HTML -Entitäten usw. zu entkommen, bevor Sie in die Datenbank gehen, da Sie nie wissen, wann HTML nicht Ihr Anzeigemedium ist. Außerdem erfordern verschiedene Arten von Situationen unterschiedliche Arten von Ausgangsflächen. Wenn Sie beispielsweise eine Zeichenfolge in JavaScript einbetten, ist eine unterschiedliche Flucht als in HTML erforderlich. Wenn Sie dies bereits tun, wiegt sich Sie sich in ein falsches Sicherheitsgefühl.

Die grundlegende Faustregel lautet also vor der Verwendung und spezifisch für diese Verwendung; nicht präventiv.

(Bitte beachten Sie, dass ich nicht über die Fluchtausgabe für SQL spreche, nur für die Anzeige. Bitte tun Sie immer noch entkommensdaten für eine SQL -Zeichenfolge.)

Andere Tipps

Ich mag es, die Daten in Originalform zu haben/zu speichern. Ich entkomme/filtere den Daten nur von dem Ort, an dem ich sie verwende.

  • Auf einer Webseite - codieren Sie alle HTML
  • auf SQL - Töte Zitate
  • auf URL - Urlencodierung
  • auf Druckern - codieren Fluchtbefehle
  • Auf was auch immer - codieren es für diesen Job

Es gibt mindestens zwei Arten der Filterung/Desinfektion, die Sie interessieren sollten:

  • Sql
  • Html

Offensichtlich muss der erste vor/beim Einfügen der Daten in die Datenbank betreut werden, um SQL -Injektionen zu verhindern.
Aber Sie wissen das schon, wie Sie sagten, also werde ich nicht mehr darüber sprechen.


Der zweite hingegen ist eine interessantere Frage:

  • Wenn Ihre Benutzer in der Lage sein müssen, ihre Daten zu bearbeiten, ist es interessant, sie ihnen genauso zurückzugeben, wie sie sie zuerst eingegeben haben. Was bedeutet, dass Sie eine "nicht-html-spezielles" -Version speichern müssen.
  • Wenn Sie HTML anzeigen möchten, verwenden Sie möglicherweise etwas wie Htmlpurifier : Sehr leistungsstark ... aber möglicherweise etwas zu viel Ressourcen erfordern, wenn Sie sie für alle Daten ausführen, wenn sie angezeigt werden müssen ...

So :

  • Wenn Sie HTML mithilfe eines schweren Tools zum Validieren/Filtern von HTML anzeigen möchten, müssen Sie sagen, dass Sie eine bereits gefilterte/egal welche Version in die Datenbank speichern müssen, um den Server nicht zu zerstören und ihn jedes Mal wiederherzustellen, wenn die Daten wird angezeigt
    • Sie müssen aber auch die "Original" -Version speichern (Sehen Sie, was ich vorher gesagt habe)
    • In diesem Fall würde ich wahrscheinlich beide Versionen in eine Datenbank speichern, auch wenn sie mehr Platz einnimmt ... oder zumindest einen guten Caching-Mekanismus verwenden, um die saubere Version immer wieder zu verringern.
  • Wenn Sie keine HTML anzeigen möchten, werden Sie verwenden htmlspecialchars oder ein Äquivalent, das wahrscheinlich nicht so viel von einem CPU-Eater ist ... also spielt es wahrscheinlich keine Rolle, dass es nicht viel spielt
    • Sie müssen noch die "Original" -Version speichern
    • Wenn Sie jedoch die Daten ausgeben, ist es jedoch möglicherweise in Ordnung.

Übrigens ist die erste Lösung auch schön, wenn Benutzer beim Eingeben der Daten etwas wie BBCode/Markdown/Wiki verwenden, und Sie in HTML ...
Zumindest, solange es häufiger als aktualisiert wird - und insbesondere, wenn Sie keinen Cache verwenden, um die saubere HTML -Version zu speichern.

Bereinigen Sie sie für die Datenbank, bevor Sie sie gegebenenfalls in die Datenbank einfügen (dh wenn Sie keine Datenbank -Interaktivitätsschicht verwenden, die das für Sie behandelt). Bereinigen Sie es vor der Anzeige zum Display.

Das Speichern von Dingen in einer derzeit unnötigen zitierten Form führt zu viele Probleme.

Ich sage immer, entkommen Dinge unmittelbar, bevor ich sie an den Ort übergeben muss, an dem sie entkommen werden müssen. Ihre Datenbank kümmert sich nicht um HTML. Daher ist es unnötig, HTML vor dem Speichern in der Datenbank zu entkommen. Wenn Sie jemals als etwas anderes als HTML ausgeben oder ändern möchten, welche Tags zulässig/nicht zugelassen sind, haben Sie möglicherweise ein bisschen Arbeit vor sich. Außerdem ist es einfacher, das Flucht zu erinnern, wenn es zu tun hat, als in einem viel früheren Stadium in diesem Prozess.

Es ist auch erwähnenswert, dass HTML-Essstrings viel länger sein können als die ursprüngliche Eingabe. Wenn ich einen japanischen Benutzernamen in ein Registrierungsformular einbezog, ist die ursprüngliche Zeichenfolge möglicherweise nur 4 Unicode -Zeichen, aber HTML -Flucht kann sie in eine lange Zeichenfolge von "〹𐤲 䡈穩" konvertieren. Dann ist mein 4-Charakter-Benutzername zu lang für Ihr Datenbankfeld und wird als zwei japanische Zeichen und einen halben Fluchtcode gespeichert, was mich wahrscheinlich auch daran hindert, sich anzumelden.

Achten Sie darauf, dass Browser dazu neigen, einigen Dingen wie nicht englischem Text in eingereichten Formularen selbst zu entkommen, und es wird immer diesen Smartass geben, der überall einen japanischen Benutzernamen verwendet. Vielleicht möchten Sie eigentlich unauslösch HTML vor der Aufbewahrung.

Meistens hängt es davon ab, was Sie mit den Eingaben sowie Ihrer Entwicklungsumgebung vorhaben.

In den meisten Fällen möchten Sie Originaleingaben. Auf diese Weise haben Sie die Kraft, Ihre Ausgabe an den Inhalt Ihres Herzens zu optimieren, ohne Angst zu haben, das Original zu verlieren. Auf diese Weise können Sie auch Probleme wie die kaputte Ausgabe beheben. Sie können immer sehen, wie Ihre Filter fehlerhaft sind oder die Eingabe Ihres Kunden fehlerhaft ist.

Andererseits konnten einige kurze semantische Daten sofort gefiltert werden. 1) Sie möchten keine unordentlichen Telefonnummern in der Datenbank. Für solche Dinge könnte es gut sein, zu sanieren. 2) Sie möchten nicht, dass ein anderer Programmierer versehentlich Daten ausgibt, ohne zu entkommen, und Sie arbeiten in der Umgebung mit Multiprogrammer. In den meisten Fällen ist die Rohdaten jedoch besser IMO.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top