Welcher Art ist die korrekte Eingabe von Webformularen für verschiedene Kontexte?

8

Was halten Sie alle für den richtigen (am flexibelsten, lose gekoppelten, robustesten usw.) Weg, um Benutzereingaben aus dem Internet für die Verwendung in verschiedenen Teilen einer Webanwendung sicher zu machen? Natürlich können wir für jeden Kontext die entsprechenden Desinfektionsfunktionen verwenden (Datenbank, Anzeige auf dem Bildschirm, Speichern auf der Festplatte usw.), aber gibt es ein allgemeines "Muster" für den Umgang mit unsicheren Daten und die Sicherheit? Gibt es eine etablierte Möglichkeit, die Behandlung als unsicher zu behandeln, wenn sie nicht sicher ist?

    
Douglas Treadwell 16.08.2009, 02:48
quelle

3 Antworten

4

Wie bereits erwähnt, gibt es einige Dinge, die Sie berücksichtigen sollten, wenn Sie sich mit Websicherheit befassen. Hier sind einige grundlegende Prinzipien zu beachten:

  • Vermeiden Sie direkte Eingaben von Benutzern, die in Abfragen und Variablen integriert werden.

Das bedeutet also, dass Sie nicht so etwas wie $variable = $_POST['user_input'] haben. Für jede Situation wie diese übergeben Sie dem Benutzer zu viel Kontrolle. Wenn sich die Eingabe auf eine Datenbankabfrage auswirkt, sollten Sie immer Positivlisten für die Überprüfung der Benutzereingaben verwenden. Wenn die Abfrage nach einem Benutzernamen erfolgt, überprüfen Sie anhand einer Liste mit guten Benutzernamen. Machen Sie NICHT einfach eine Abfrage, bei der die Benutzereingaben direkt fallengelassen wurden.

Eine (mögliche) Ausnahme ist eine Suchzeichenfolge. In diesem Fall müssen Sie so einfach sanieren.

  • Speichern Sie keine Benutzereingaben ohne Hygiene.

Wenn der Benutzer ein Profil erstellt oder Informationen für andere Benutzer hochlädt, müssen Sie entweder eine weiße Liste der zulässigen Daten erstellen oder alles entfernen, was schädlich sein könnte. Dies gilt nicht nur für die Sicherheit Ihres Systems, sondern auch für Ihre anderen Benutzer (siehe nächster Punkt).

  • NIEMALS etwas von einem Benutzer zum Browser ausgeben, ohne es zu entfernen.

Dies ist wahrscheinlich das Wichtigste, was Sicherheitsberater für mich herausgestellt haben. Sie können sich nicht einfach darauf verlassen, Eingaben zu bereinigen, wenn sie vom Benutzer empfangen werden. Wenn Sie die Ausgabe nicht selbst geschrieben haben, stellen Sie immer sicher, dass die Ausgabe harmlos ist, indem Sie beliebige HTML-Zeichen codieren oder sie in ein <plaintext> -Tag einschließen. Es ist einfache Fahrlässigkeit seitens des Entwicklers, wenn Benutzer A ein bisschen Javascript hochlädt, das anderen Benutzern, die diese Seite anzeigen, schadet. Sie werden nachts besser schlafen, wenn Sie wissen, dass alle Benutzerausgaben nichts anderes tun können, als in allen Browsern als Text angezeigt zu werden.

  • Erlaube niemals jemandem außer dem Benutzer, das Formular zu kontrollieren.

XSS ist einfacher als es sein sollte und ein echter Schmerz in einem Absatz zu erfassen. Einfach ausgedrückt: Wenn Sie ein Formular erstellen, geben Sie Benutzern Zugriff auf ein Skript, das Formulardaten verarbeitet. Wenn ich jemandes Sitzung oder jemandes Cookie stehle, kann ich jetzt mit dem Skript sprechen, als wäre ich auf der Formularseite. Ich kenne die Art der Daten, die es erwartet, und die Namen der Variablen, nach denen es sucht. Ich kann diese Variablen einfach übergeben, als wäre ich der Benutzer und das Skript kann den Unterschied nicht erkennen.

Das Obige ist keine Frage der Hygiene, sondern der Benutzervalidierung. Mein letzter Punkt bezieht sich direkt auf diese Idee.

  • Vermeiden Sie die Verwendung von Cookies zur Benutzervalidierung oder Rollenvalidierung.

Wenn ich den Cookie eines Nutzers stehlen kann, kann ich vielleicht mehr tun, als dass ein einziger Nutzer einen schlechten Tag hat. Wenn ich feststelle, dass der Cookie einen Wert namens "member" hat, kann ich diesen Wert sehr einfach zu "admin" ändern. Vielleicht funktioniert es nicht, aber für viele Skripte hätte ich sofortigen Zugriff auf alle Informationen auf Admin-Ebene.

Einfach gesagt, gibt es keinen einfachen Weg, ein Webformular zu sichern, aber es gibt grundlegende Prinzipien, die das vereinfachen, was Sie tun sollten, und damit den Schutz Ihrer Skripte erleichtert.

Noch einmal für ein gutes Mass:

  • Sanitize alle Eingaben
  • Alle Ausgaben kodieren
  • Überprüfen Sie alle Eingaben, die für die Ausführung mit einer strikten Whitelist
  • verwendet werden
  • Stellen Sie sicher, dass die Eingabe vom tatsächlichen Benutzer stammt
  • Machen Sie niemals eine benutzer- oder rollenbasierte Validierung browserseitig / benutzerdefinierbar

Und nimm niemals an, dass die Liste einer Person erschöpfend oder perfekt ist.

    
Anthony 16.08.2009 07:27
quelle
1

Ich bin mehr als ein wenig skeptisch, dass ein solcher Allzweckrahmen sowohl existieren als auch weniger komplex sein könnte als eine Programmiersprache.

Die Definition von "sicher" ist so unterschiedlich zwischen den verschiedenen Ebenen

  • Eingabefeld Validierung, Zahlen, Daten, Listen, Postleitzahlen, Fahrzeugzulassungen
  • Übergreifende Feldvalidierung
  • Domänenvalidierung - ist das ein gültiger Zählerstand? Miss Jones hat diesen Monat 300.000.000 € Strom verbraucht?
  • Inter-Anfrage-Validierung - buchen Sie wirklich zwei transatlantische Flüge für sich am selben Tag?
  • Datenbankkonsistenz, Validierung von Fremdschlüsseln
  • SQL-Injektion

Berücksichtigen Sie auch die Aktionen, wenn Verstöße entdeckt werden.

  • Auf der UI-Ebene löschen wir fast sicher nicht nur Ziffern ohne Ziffern aus numerischen Feldern, sondern rufen einen In der Benutzeroberfläche möchten wir wahrscheinlich alle Felder validieren und jeden einzelnen Fehler markieren
  • In anderen Schichten können wir eine Ausnahme auslösen oder einen Geschäftsprozess starten

Vielleicht vermisse ich Ihre Vision? Hast du schon etwas gesehen, das dir nahe kommt?

    
djna 16.08.2009 06:12
quelle
0

Sie können nicht eine einzige Methode verwenden, um Daten für alle Anwendungen zu bereinigen, aber ein guter Anfang ist:

Filter Var nimmt eine Reihe verschiedener Datentypen und entfernt fehlerhafte Zeichen (wie Nicht-Ziffern für Dinge, von denen Sie erwarten, dass sie Zahlen sind) und stellt sicher, dass es ein gültiges Format hat (IP-Adressen).

Hinweis: E-Mail-Adressen sind weitaus komplizierter als die Implementierung von Filter_Var, also erkundigen Sie sich bei Google nach der richtigen Funktion.

Ich würde nicht vorschlagen, dies zu benutzen, bis Sie Sachen in eine Datenbank eingeben wollen, und es ist wahrscheinlich besser, nur vorbereitete mysqli-Anweisungen zu verwenden.

    
Tyler Carter 16.08.2009 02:55
quelle