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.)