2016-06-11 20 views
2

ich einen regulären Ausdruck Muster schafft mit ~ oder ~* angepasst werden, wenn die Anwendung und Teil Teil des Musters wird aus Benutzereingaben gemacht erstellt:Entweichende Benutzereingabe für die Verwendung in einem PostgreSQL Regex mit PHP?

$userInput = "t ' e * \\s * t (i \n g"; 

$pattern = "(a|b|c)" . preg_quote($userInput) . "(x|y|z)"; 
$pattern = pg_escape_literal($conn, $pattern); 

$result = pg_query($conn, "SELECT * FROM example WHERE name ~* $pattern"); 

Dies funktioniert, so weit, aber ich bin mir nicht ganz sicher über die Sicherheit:

  • Does PHP preg_quote() escape (zumindest) alle Sonderzeichen in einem PostgreSQL regulären Ausdruck?
  • Gibt es irgendeinen möglichen $userInput Wert, der die Flucht brechen könnte?

(Es gibt einige allgemeine Verarbeitung für $userInput, bevor sie dieses Stadium erreicht - Codierung, charset, akzeptiert Zeichenbereiche usw. Abfrageparameter für die meisten der (tatsächlichen) Abfrage verwendet werden, aber diesen Teil der SQL wird manuell erstellt.)

Antwort

4

Ja. Von the docs, ~ und ~* Verwendung POSIX regulären Ausdrücken, was bedeutet, dass diese Zeichen speziell behandelt werden:

()[]{}^$|?:.\ 

preg_quote, von the docs, geht nur blind durch und legt einen Schrägstrich (dh entkommt) alle diese Zeichen:

.\+*?[^]$(){}=!<>|:- 

Mit anderen Worten, es entkommt alle Zeichen, die es zu entkommen gilt.

Allerdings sollten Sie immer noch vorsichtig sein. Wenn Sie sich dazu entscheiden, LIKE oder SIMILAR TO zu einem späteren Zeitpunkt zu verwenden, werden _ und % nicht maskiert. Außerdem müssen Sie daran denken, kein anderes Escape-Zeichen zu verwenden. Wenn Sie das tun, wird die sorgfältige Überprüfung aus dem Fenster verschwinden und Sie werden eine Menge seltsamer Fehler bekommen.