2010-09-20 9 views
9

Ich hatte eine Regex als erste Verteidigungslinie gegen XSS.Regex als erste Verteidigungslinie gegen XSS

public static function standard_text($str) 
{ 
    // pL matches letters 
    // pN matches numbers 
    // pZ matches whitespace 
    // pPc matches underscores 
    // pPd matches dashes 
    // pPo matches normal puncuation 
    return (bool) preg_match('/^[\pL\pN\pZ\p{Pc}\p{Pd}\p{Po}]++$/uD', (string) $str); 
} 

Es ist eigentlich von Kohana 2.3.

Dies läuft auf öffentlich eingegebenem Text (kein HTML jemals), und verweigert die Eingabe, wenn es diesen Test nicht besteht. Der Text wird immer mit htmlspecialchars() (oder genauer gesagt Kohana's flavour angezeigt, fügt unter anderem den Zeichensatz hinzu). Ich habe auch einen strip_tags() am Ausgang gesetzt.

Der Client hatte ein Problem, wenn er einen Text mit Klammern eingeben wollte. Ich dachte daran, den Helfer zu modifizieren oder zu erweitern, aber ich hatte auch einen Nebengedanken - wenn ich doppelte Anführungszeichen erlaube, gibt es wirklich irgendeinen Grund, warum ich überhaupt validieren muss?

Kann ich mich nur auf die Ausgabe verlassen?

Antwort

5

Es ist niemals sicher, sich auf Regexes zu verlassen, um gefährliche XSS-Angriffe zu filtern. Und obwohl Sie sich nicht darauf verlassen, werden Ausgabe- und Eingabefilter bei richtiger Verwendung alle Arten von Angriffen beenden. Daher hat es keinen Sinn Regexes als "erste Verteidigungslinie" zu haben, wenn ihre Hilfe nicht wirklich benötigt wird. Wie Sie und Ihr Kunde herausgefunden haben, erschweren sie die Dinge nur, wenn sie so benutzt werden.

Lange Geschichte kurz: Wenn Sie html_entities oder htmlspecialchars verwenden, um Ihre Ausgabe zu entkommen, brauchen Sie keine Regexes noch benötigen Sie wirklich strip_tags entweder.