WP Sucheingaben zusätzlich filtern

Ein möglicher Angriffspunkt bei selbstprogrammierten Scripts sind Formulare. Werden Formulareingaben nicht ausreichend gefiltert, kann Schadcode eingeschleust werden. Ob es sich dabei um Formulare für den Versand von E-Mails handelt oder um Formulare für interne Suchvorgänge, ist eigentlich unerheblich. Bei Formularen, welche Sucheingaben und die Durchsuchung der Datenbank ermöglichen, kommt jedoch hinzu, dass dem Inhaber der Website möglicherweise nicht alle Eingaben recht sind.
Wordpress filtert die Sucheingaben ebenfalls und wandelt dabei kritische Zeichen in HTML-Entities um. Aus einer Eingabe wie

value = <?php echo $param; ?>

würde dabei im Quelltext der Seite

value = &lt;?php echo $param; ?&gt;

womit der Code entschärft wäre. Doch eigentlich könnten alle Zeichen, die für einen normalen Suchvorgang unerheblich sind, auch gleich gänzlich entfernt werden. Zu diesen für die meisten Suchanfragen kaum relevanten Zeichen gehören (neben spitzen, eckigen oder geschweiften Klammern) eigentlich alle Satzeichen, zumindest jedoch Zeichen wie % & oder #.

Die auf dieser Seite vorgestellte Funktion entfernt nicht nur alle Zeichen, bei denen es sich weder um Ziffern, Buchstaben, Leerzeichen zwischen den Wörtern \s, noch um Plus- oder Minuszeichen handelt, sondern filtert zusätzlich aus den Sucheingaben noch unerwünschte Eingaben heraus. Bei Verwendung der alternativen Zeichenklasse bleiben häufig verwendete Satzzeichen erhalten, jedoch werden problematische Zeichen, die in Sucheingaben nichts verloren haben, ebenfalls gefiltert.
Ermöglicht wird diese Filterung durch die Variable $request, die eine Referenz auf das WP_Query Objekt enthält, zu dem unter anderem dem die Eigenschaft query_vars gehört. Diese Eigenschaft wiederum enthält ein Array, in dem auch der Wert des vom Suchformular per GET übergebenen Parameters ‘s’ enthalten ist. Weiterhin wird diese Filterung durch den Hook pre_get_posts unterstützt, der sich einhakt, noch bevor eine Suchanfrage an die Datenbank übermittelt wird. Mit Hilfe der Funktion wird nicht nur der Wert von query_vars["s"] überschrieben, sondern auch der Wert des Parameters ‘s’ von der Superglobalen $_GET.

Die im Array enthaltenen Begriffe sollen nur als Beispiel dienen, wobei das Array beinahe beliebig angepasst oder erweitert werden kann. Nur sollte darauf geachtet werden, dass alle Muster von Delimiter-Zeichen begrenzt werden. Als Modifier wurde i verwendet, um Groß- und Kleinschreibung zu ignorieren. Weiterhin sind alle Einträge durch ein Komma zu trennen, lediglich nach dem letzten Eintrag kann das Komma entfallen.
Wer es sich zutraut, die- oder derjenige kann ebenfalls die Zeichenklasse erweitern. Dabei ist darauf zu achten, dass kein vorhandener von-bis Bereich unterbrochen wird und ein Minuszeichen als einzelnes Zeichen nur an den Anfang oder an das Ende einer Zeichenklasse notiert werden sollte, um keinen neuen von-bis Bereich zu erzeugen. Wer auf Satzzeichen wert legt, kann die alternative Zeichenklasse verwenden. % & oder # sollten hingegen nicht verwendet werden.

Anmerkung: Ein Test mit einer Zeichenklasse, in der statt Umlaute deren Hex-Werte verwendet wurden, lieferte kein befriedigendes Ergebnis:

[^0-9\w\xC4\xD6\xDC\xDF\xE4\xF6\xFC\s.,:;!?+-]

Code-Listing:

/**
 * Sucheingaben filtern
 * Alternative Zeichenklasse [^a-zA-ZäöüÄÖÜß0-9.,:;!?\s+_-]
 */
function interne_suche_zusaetzlich_filtern($query) {

    $musterarr = array(

        "/login/i",
        "/log-in/i",
        "/log in/i",
        "/signup/i",
        "/register/i",
        "/registr/i",
        "/passw/i"
    );

    if (isset($_GET["s"]) and !empty($_GET["s"])){

        $interne = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s+-]/", "", $_GET["s"]);
        $interne = preg_replace($musterarr, "", $interne);
        $interne = trim($interne);

        if (strlen($interne) > 2) {
            $query->query_vars["s"] = $interne;
            $_GET["s"] = $interne;

        } else {
            $query->query_vars["s"] = "Wie bitte?";
            $_GET["s"] = "Wie bitte?";
        }
    }
}
add_filter("pre_get_posts", "interne_suche_zusaetzlich_filtern");

Wichtiger Hinweis: Wir empfehlen vor Benutzung der Funktion und dem Einfügen in die functions.php Ihres Theme eine Sicherung von der functions.php oder besser noch eine Sicherung Ihrer WordPress Website anzulegen. Falls es zu Störungen bei oder nach der Aktualisierung der functions.php kommt, können Sie so einfach die veränderte durch die unveränderte functions.php ersetzen, in dem Sie erstere per FTP hochladen.
Falls Sie die funktions.php in einem Editor auf dem Desktop bearbeiten, so sollten Sie weiterhin darauf achten, dass die Datei als UTF-8 Datei ohne BOM abgespeichert wird, da sich die Umlaute anderenfalls in Glypen verwandeln könnten.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *