2009-08-11 9 views
3

Angenommen, ich erlaube meinen Benutzern, ein Formular mit einigen Textfeldern einzureichen (ich spreche nicht von Passwörtern). Meine Benutzer würden gelegentlich Nicht-ASCII-Zeichen wie Russisch, Chinesisch usw. verwenden, daher verwende ich UTF-8-Zeichensätze in meiner Datenbank. Die Frage ist, sollte ich wirklich alle möglichen UTF-8-Zeichen zulassen? Ich habe mir die ASCII-Tabelle angeschaut und gesehen, dass die Zeichen 0 bis 31 nichts mit Text zu tun haben, außer für Zeilenumbrüche und Leerstellen. Zeichen 176 bis 223 scheinen für dekorative Zwecke zu sein: p. Sollte ich sie einschränken?Erlaubte Zeichen in Einreichungsformularen (einschließlich UTF-8)

Antwort

4

Stellen Sie sicher, dass UTF-8 und Unicode gültig sind? Ja

Stellen Sie sicher, dass bestimmte Zeichen wie Steuercodes nicht enthalten sind?

Sie sollten sich bewusst sein, dass Sie zwar UTF-8 in Ihrem Formular verwenden, aber möglicherweise kein gültiges UTF-8 von allen Benutzeragenten erhalten, wenn sie Formulardaten an Sie senden muss es bei Bedarf filtern. Ungültige UTF-8 kann viele Formen annehmen, von denen einige

  • Überlange Kodierungen (was zu Sicherheitsproblemen führen kann)
  • Andere ungültige UTF-8-Byte-Sequenzen, die, dass der User-Agent ignoriert anzeigen kann, die Zeichencodierung und hat stattdessen etwas wie Windows-1252 oder ISO-8859-1-Codierung eingereicht.
  • -Code Punkte, die

Alle oben genannten Bedarf in Unicode in reservierten Ersatzraum liegen bei der Eingabe herausgefiltert werden, sonst werden Sie gültige Unicode nicht gespeichert werden.

Wenn Sie gültigen HTML oder XHTML dienen wollen, die eine Teilmenge von Unicode verwenden, müssen Sie auch brauchen, um herauszufiltern (entweder am Eingang oder Ausgang):

  • C0-Steuercodes 0x00 bis 0x19 (Neben tab, Raum, neue Zeile, carraige return)
  • 0x7F
  • C1 Steuercodes 0x80 bis 0xBF
  • (wahrscheinlich) jeder Codepunkt oberhalb 0x10FFFF
+0

Alles stimmt, und die Regex von Gumbo wird alle diese Probleme behandeln. –

+0

Vielen Dank für Ihre Antwort. Ich schätze, ich werde den regulären Ausdruck verwenden, den Gumbo vorgeschlagen hat, um die Eingabe zu validieren. Es scheint alles zu handhaben, was Sie herausfiltern wollten. – liviucmg

+0

Ja, diese Regex eignet sich für UTF-8-kodierten Text, der in XHTML oder HTML verwendet wird, da auch diese Kontrollcodes wie oben beschrieben herausgefiltert werden. – thomasrutter

6

Das W3C überspringt diese Zeichen in ihrem Beispiel regulären Ausdruck in Multilingual form encoding:

$field =~ 
    m/\A(
    [\x09\x0A\x0D\x20-\x7E]   # ASCII 
    | [\xC2-\xDF][\x80-\xBF]    # non-overlong 2-byte 
    | \xE0[\xA0-\xBF][\x80-\xBF]  # excluding overlongs 
    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 
    | \xED[\x80-\x9F][\x80-\xBF]  # excluding surrogates 
    | \xF0[\x90-\xBF][\x80-\xBF]{2}  # planes 1-3 
    | [\xF1-\xF3][\x80-\xBF]{3}   # planes 4-15 
    | \xF4[\x80-\x8F][\x80-\xBF]{2}  # plane 16 
)*\z/x; 
+0

Die PHP Äquivalent würde preg_match sein ('/ \ A ( [\ x09 \ x0A \ x0D \ x20- \ X7E] | [\ xC2- \ XDF] [\ x80- \ xBF] | \ xE0 [\ xA0- \ xBF] [\ x80- \ xBF] | [\ xE1- \ xEC \ xEE \ xEF] [\ x80- \ xBF] {2} | \ xED [\ x80- \ x9F] [\ x80- \ xBF] | \ xF0 [\ x90- \ xBF] [\ x80- \ xBF] {2} | [\ xF1- \ xF3] [\ x80- \ xBF] {3} | \ xF4 [ \ x80- \ x8F] [\ x80- \ xBF] {2} ) * \ z/x ', $ string); Bin ich richtig? – liviucmg

+1

@bilygates: Sie können die Kommentare auch verlassen. PHP 'preg_match' verwendet Perl-kompatible Reguläre Ausdrücke und der' x' Modifizierer erlaubt die Verwendung von Leerzeichen und Kommentaren (beginnend mit '#' bis zum Ende der Zeile), um einen regulären Ausdruck verständlicher zu machen. – Gumbo

+0

@Gumbo Ok, werde ich tun. Danke vielmals! – liviucmg

1

Nr

Es ist eine sehr schlechte Idee, "pre-clean" Benutzereingabe zu versuchen. Was Sie als "dekorativ" bezeichnen, könnte für Leser einer anderen Sprache unbedingt notwendig sein. Die beste Lösung besteht darin, den Text unverändert in der Datenbank zu speichern und anschließend zu bereinigen, bevor auf die Seite geschrieben wird.

+0

Ich stimme nicht zu. Benutzereingaben sollten vor jeder Verarbeitung, einschließlich Speicherung, bereinigt werden. Was wäre der Vorteil, wenn Sie das nicht tun? –

+0

Wenn Sie die Eingabe zu stark oder zu wenig bereinigt haben, können Sie die ursprünglichen Daten nicht wiederherstellen. Wenn die unbelasteten Daten gespeichert werden, können sie immer auf die jeweils gewünschte Weise bereinigt werden. –

+0

Ich stimme dem zu, aber auf der anderen Seite kann die routinemäßige Speicherung der Daten eine Sicherheitslücke offenlegen, die durch bösartige und nicht-animierte Eingaben ausgenutzt werden könnte. –

1

Wenn Sie sagen "die ASCII-Tabelle" Sie sprechen über this page, nicht wahr? Diese Seite ist Müll. Nur die ersten 128 Zeichen (dh 0..127) sind "ASCII"; Die Zuordnungen, die sie für die Nummern 128..255 zeigen, stammen von einer ASCII-Erweiterung mit der Bezeichnung cp437. Es gibt eine Menge "erweiterter ASCII" -Daten, und cp437 ist bei weitem nicht die gebräuchlichste.

Aber ich schweife ab. Bei Ihrer Frage geht es nicht um Zeichenkodierungen, sondern um Filterung, und ein Filter sollte auf den Eigenschaften der Zeichen basieren: ist es ein Buchstabe, eine Ziffer, ein Steuerzeichen?Die meisten modernen Programmiersprachen stellen Methoden oder Funktionen bereit, um solche Informationen zu erhalten, und die meisten bieten Regex-Unterstützung. Wie für was sollten Sie filtern, oder ob Sie überhaupt filtern sollten, nur Sie können das wissen.

Es klingt, als ob Sie mehr über Zeichenkodierungen und Unicode lernen müssen. Start here.

+0

Ja, das ist genau die Seite, die ich angeschaut habe. Ich wusste nicht, dass die Buchstaben 127 - 255 unterschiedlich sein können. Ich werde mir den von Ihnen empfohlenen Artikel ansehen. Vielen Dank! – liviucmg

Verwandte Themen