it-swarm.com.de

Wie validiere ich Daten aus $ _GET oder $ _REQUEST mit WordPress-Funktionen richtig?

Ich arbeite an einem Plugin, das eine direkte Bearbeitung der Inhaltsausgabe erfordert. Dies hängt ausschließlich von der aktuellen $_GET-Variablen oder der $_REQUEST-Variablen ab.

Abhängig von der Einstellung der Variablen wird eine bestimmte Klassenmethode aufgerufen, um die Benutzeranforderung zu verarbeiten und den richtigen Inhalt anzuzeigen.

Ich bin mir der Seite Datenvalidierung im WordPress-Codex voll bewusst. Ich bin mir jedoch nicht sicher, was der beste Ansatz für mein Szenario ist oder welches Szenario für die Bereinigung von $_GET-Variablen oder $_REQUEST-Variablen in dieser Angelegenheit geeignet ist.

Wie kann ich mithilfe von WordPress-Funktionen für $_GET variable oder $_REQUEST variable eine Zeichenfolge bereinigen, die zum Aufrufen einer bestimmten Klassenmethode abgeglichen wird?

Könnte dies ausgenutzt werden oder mit dem folgenden Code fehlschlagen ?:

public function display_admin_page(){
    if(is_admin() && isset($_GET['page'])){
        global $content;
        $page = sanitize_title($_GET['page']);
        $method_name = 'page_'.str_replace('-', '_', $page);
        if(method_exists('content', $method_name)){
            // Display requested page from content class
            $thePage = $content->$method_name();
        } else{
            $thePage = $content->error(404);    
        }
        echo $thePage;
    }
}
4
Michael Ecklund

WordPress bietet keine spezifischen Datenüberprüfungsfunktionen für SUPERGLOBALS.

Ich benutze die PHP filter_input - Funktion, um sie dann wie jede nicht vertrauenswürdige Variable zu maskieren.

$url = filter_input( INPUT_GET, 'some_query_string', FILTER_VALIDATE_URL );

echo '<a href="'. esc_url( $url ). '">Click Me</a>';

Die Filtereingabe PHP akzeptiert:

3
Chris_O

Zu Ihrem konkreten Beispiel:

Sie haben die $ _GET-Daten entsprechend bereinigt (ich dachte, ich würde sanitize_key anstelle von sanitize_title verwenden - kann nicht sagen, dass es einen großen Unterschied gibt, aber sanitize_title ist für die Verwendung in URLs vorgesehen).

Die Funktion method_exists gibt für private und geschützte Methoden true zurück. Wenn ein Benutzer also versucht, eine private oder geschützte Methode aufzurufen, schlägt dies fehl, ohne zu 404 zu wechseln. (Sofern sich die Methode display_admin_page nicht in derselben Klasse befindet.)

Das bringt uns zum wichtigsten potenziellen Exploit: dass absolut jeder jede öffentliche Methode in Ihrer Klasse zum Laufen bringen kann. Wenn möglich, ist es immer besser, speziell auf die Whitelist zu setzen, was akzeptiert werden kann. Auf diese Weise können Sie Folgendes bestätigen:

if ( !in_array( $_GET['page'], array( 'accepted_method', 'another_accepted_method' ) ) )
     $content->error(404);
2
SeventhSteel

Die Bereinigung von $_GET ist ziemlich kontextspezifisch. Hängt davon ab, welchen Wert Sie möchten und wie er überprüft werden soll.

Es gibt keine einheitliche Antwort auf diese Frage. Es ist sehr kontextspezifisch. Sie könnten zum Beispiel eine Funktion schreiben, die alle Tags und Schrägstriche von der Eingabe entfernt. Das ist sehr sicher. Was wäre, wenn ein p-Tag gespeichert werden soll? Kein Schaden dort. Die wp_kses () -Familie ist eine interessante Studie, aber keine großartige Lösung, da sie den Kontext, die Benutzerebene und mehr berücksichtigt. Als Administrator können Sie beispielsweise JavaScript in Beitragstitel und Beitragsinhalt speichern, als untergeordnete Rolle jedoch nicht.

Wenn es sich bei dem Wert um eine bekannte Größe handelt, können Sie auch prüfen, ob in_array( $array_valid_strings ) und bei diesen besonders sicher sein.

Das heißt, es gibt verschiedene Hygienisierungsgrade, daher ist es wichtig, dass Sie Ihr Endziel im Auge behalten. Ich würde diese Liste konsultieren und die Funktion oder Kombination von Funktionen finden, die Ihren Bedürfnissen entspricht. Es sind speziell die sanitize_-Funktionen, die hier verwendet werden sollten, nicht esc_. Desinfektion und Flucht sind weiterhin verwirrt ...

In meinem Fall verwende ich sanitize_text_field () , weil es eine Zeichenfolge aus Benutzereingaben oder aus der Datenbank bereinigt.

  • Prüft auf ungültiges UTF-8,
  • Konvertiert einzelne <Zeichen in Entitäten
  • Entfernt alle Tags
  • Entfernt Zeilenumbrüche, Tabulatoren und zusätzliche Leerzeichen
  • Entfernt Oktette

Viel Glück :).

P.S. Diese Antwort zitiert drei verschiedene Perspektiven der Entwickler (Josh, Michal, Kevin).

0
Ahmad Awais

Ich würde empfehlen, mysql_real_escape_string($_GET) für jede GET-Anfrage zu verwenden. Es ist eine sehr mächtige PHP Funktion.

Sie können dann str_replace() verwenden, um unerwünschte Zeichen zu ersetzen.

0
Ciprian