In der Regel sollte man zuerst reinigen - "für Ihren Schutz und ihre." Dies schließt das Entfernen von ungültigen Zeichen ein (Zeichencodierung natürlich empfindlich). Wenn ein Feld nur Zeichen und Leerzeichen enthalten soll, dann entferne alles, was nicht das erste ist.
Danach validieren Sie die Ergebnisse - ist der Name bereits verwendet (für eindeutige Felder), ist es die richtige Größe, ist es nicht leer?
Der Grund, den Sie geben, ist genau der richtige - um die Benutzererfahrung zu maximieren. Verwechsle den Benutzer nicht, wenn du es vermeiden kannst. Dies hilft beim Schutz vor dumb copy & einfügen Verhalten, aber Sie müssen vorsichtig sein - wenn ich möchte meinen Namen als "Ke $ h @" aufgezeichnet, kann ich oder nicht ok mit der Änderung zu "Keh".
Zweitens, es ist auch Bugs zu verhindern.
Was passiert, wenn Sie Benutzernamen erstellen möchten, die keine Sonderzeichen zulassen? Wenn ich "Brian" eingebe, und dein System es als den uns bereits verwendeten Namen zurückweist, dann reiche ich "Brian $" ein? Zuerst validierst du es, und es wird nicht benutzt, dann entziehst du Sonderzeichen und du bleibst bei "Brian". Uh oh - jetzt müssen Sie entweder AGAIN validieren, oder Sie erhalten einen merkwürdigen Fehler, dass entweder die Kontoerstellung fehlgeschlagen ist (wenn Ihre Datenbank zum Beispiel eindeutige Benutzernamen erfordert), oder schlimmer noch, es wird erfolgreich sein und überschreiben/Korruption tritt für Benutzer Benutzerkonten auf.
Ein anderes Beispiel sind minimale Feldlängen: Wenn Sie einen Namen benötigen mindestens 3 Buchstaben lang sein und nur Buchstaben akzeptieren, und ich gebe "Nein" ein, würden Sie es ablehnen; aber wenn ich "no @ # $%" eintrage, würde man sagen, dass es gültig war (lange genug), es sterilisieren, und jetzt ist es nicht mehr gültig, etc.
Der einfache Weg, dies zu vermeiden, ist zuerst zu sanieren und dann müssen Sie nicht zweimal über die Validierung nachdenken.
Allerdings hatte Niet Recht, Daten vor der Speicherung nicht zu verschlüsseln; Im Allgemeinen ist es viel einfacher, die Ausgabe in HTML so einzurichten, als wäre sie codiert, wenn es angebracht ist, dann sollte man daran denken, sie zu dekodieren, wenn Sie nur den einfachen Text (zum Eingeben in Textfelder, JSON-Zeichenfolgen usw.) wollen. Die meisten Testfälle, die Sie verwenden, enthalten keine Daten mit HTML-Entities, so dass es leicht ist, dumme Bugs einzuführen, die nicht leicht zu finden sind.
Das große Problem ist, dass wenn ein solcher Fehler eingeführt wird, kann es schnell zu Datenbeschädigung führen, die nicht leicht zu lösen ist. Beispiel: Sie haben einfachen Text, geben ihn falsch als HTML-Entitäten in ein Textfeld aus, das Formular wird zurückgesendet und Sie codieren es neu ... jedes Mal, wenn es geöffnet/erneut gesendet wird, wird es neu codiert. Bei einer stark frequentierten Site/Formular könnten Sie Tausende von unterschiedlich kodierten Einträgen erhalten, ohne dass Sie klar bestimmen könnten, was und was nicht HTML-kodiert sein sollte.
Der Schutz vor der Injektion ist gut, aber HTML-Codierung ist nicht dafür ausgelegt (und muss nicht verlässlich sein), dies zu tun.
Sie sollten niemals Daten verschlüsseln, bevor Sie sie speichern. Speichere es raw (benutze das richtige Escapen wie mysqli_real_escape_string oder ähnliches) und kodiere es, bevor du es ausgibst. Dies liegt daran, dass es eine andere Kodierung benötigt, wenn Sie es als HTML oder JSON oder irgendetwas anderes ausgeben. –
Die beste Methode, um sql-injection zu stoppen, ist die Verwendung von mysqli oder PDO prepared statement, um Daten in die Datenbank einzufügen. @ [Niet the Dark Absol] (http://stackoverflow.com/users/507674/niet-the-dark-absol) ist Richtig, aber die Funktion mysqli_real_escape_string() ist veraltet. – nurakantech
Ich werde nie Funktionen wie 'mysqli_real escape_string()' für sesurity Gründe verwenden, im Verwenden von PDO ist es sicherer. – naazanin