Samstag, Januar 18, 2020

Desinfizieren query-string in PHP

Ich habe eine Webseite mit einem query-string.

In PHP habe ich:

$querystring=$_SERVER["QUERY_STRING"];
echo "<html><head></head><body>
<a href='index.php?$querystring'>test</a>
</body></html>";

Muss ich desinfizieren den querystring?

Wenn ja, wie kann ich das bereinigen, und was sind einige mögliche Angriffe, wenn ich nicht?

InformationsquelleAutor David19801 | 2011-12-02

4 Kommentare

  1. 7

    Sollten Sie verwenden htmlspecialchars($query, ENT_QUOTES) zu verhindern, XSS-Angriffe.

    echo "<html><head></head><body>
    <a href='index.php?".htmlspecialchars($querystring, ENT_QUOTES)."'>test</a>
    </body></html>"

    Aber immer noch, sollten Sie der weißen Liste für alle Parameter, weil eine intelligente Angreifer fälschen, Abfrage und versuchen Sie, einen CSRF Angriff.

  2. 13

    Wenn Sie PHP >= 5.2.0 verwenden filter_input oder filter_input_array.

    Sagen wir mal deine URL und query-string ist so etwas wie http://example.com/?liquor=gin&mixer=tonic&garnish=lime.

    Filtern möchten, führen Sie etwas wie das folgende.

    /*
     FILTER_SANITIZE_STRING removes most dangerous characters. That may 
     not always be what you want. Read the PHP filters docs. 
    
     We are also overwriting the $_GET array (the query string) with the sanitized
     versions of these variables.
    */
    
    $_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
    
    /* 
    rebuild query string using white listed variables, 
    not $_GET to prevent variable injection as Mārtiņš Briedis 
    suggests above.
    */
    
    $qv['liquor']  = $_GET['liquor'];
    $qv['mixer']   = $_GET['mixer'];
    $qv['garnish'] = $_GET['garnish'];
    
    # build and URL encode the query string using the above array.
    $querystring = http_build_query( $qv );
  3. 0

    In diesem Fall sollten Sie urlencode-Funktion.

    htmlspecialchars/htmlentities sind besser geeignet, wenn Sie gehen, um die Ausgabe Wert von der Abfrage-Parameter in der link-Titel zum Beispiel, aber nicht an der href/src-Attributen.

  4. -3

    Können Sie bereinigen die Abfrage über mehrere Wege, aber das ist hier nicht der Ort, das zu tun. Sogar, wenn Sie senden eine sichere Abfrage BEKOMMEN, kann mir jemand die Abfrage ändern, die auf die Adressleiste, oder mit tamper data. Sie müssen zu bereinigen auf index.php (oder wo auch immer du die Daten verarbeiten). Wenn Sie MySQL verwenden, müssen Sie bereinigen diese Weise:

    $field = mysql_real_scape($_GET['field']);
    • Warum machen die Leute halten, empfehle mysql_real_escape() für XSS/CSRF injection1!!!?! SQL-injection und XSS/CSRF-Angriffe sind völlig verschiedene Bedenken bezüglich der Sicherheit.
    • +1 zu dem, was John Cartwright sagte. Steve, dein Vorschlag funktioniert für die Verhinderung von SQL-injection. Aber in diesem Fall wollen wir zu-filter-Ausgang-was ist Hinzugefügt, um unsere HTML — XSS-Angriffe zu vermeiden.

Kostenlose Online-Tests