3 Stimmen

Entfernt PHP automatisch Anführungszeichen in einem String, der per GET oder POST übergeben wird?

Datei berücksichtigen a.php :

<?php
    echo $_GET['a'];
?>

a.php?a=abcd' druckt abcd\' .

Ich denke, dass PHP Anführungszeichen automatisch entkommen lässt, aber ich konnte kein Dokument darüber finden.

Stimmt das? Denn ich möchte sichergehen - ich bin ziemlich faul, also habe ich SQL-Injection in meinem PHP-Quellcode nicht verhindert...

3voto

Emil Vikström Punkte 87499

PHP tut dies, wenn magische_zitate_gpc in der Konfiguration aktiv ist. Diese Funktion ist veraltet und wird in Zukunft verschwinden. Es ist nicht gut (eigentlich ist es geradezu dumm), sich beim Schreiben von neuem Code auf veraltete Funktionen zu verlassen.

Beachten Sie, dass magische Anführungszeichen reichen nicht aus, um vor SQL-Injections zu schützen da es nicht alle Zeichensätze korrekt verarbeitet. Ich empfehle, dass Sie die magische Anführungszeichen umkehren und verwenden Sie stattdessen mysql_real_escape_string (oder ähnliche in anderen Datenbankerweiterungen).

3voto

Alix Axel Punkte 146320

Es hängt davon ab, ob magic_quotes_gpc en On oder nicht auf Ihrem php.ini Konfigurationsdatei.

Diese Konfigurationsrichtlinie wurde eingeführt, um Entwicklern zu helfen, sich gegen SQL-Einschleusung Angriffe. Wenn Sie nicht wissen, was das ist, empfehle ich Ihnen, den Wikipedia-Eintrag sehr sorgfältig zu lesen.

Die Sache ist die, die sich nur auf magic_quotes unsicher und unberechenbar ist und diese Funktion wird auch in zukünftigen PHP-Versionen entfernt werden. Der beste Weg, sich gegen SQL-Injection zu schützen, ist entweder die Verwendung von Prepared Statements (mit PDO o MySQLi ) oder verwenden Sie die spezifische Escaping-Funktion für Ihre Datenbank:

Wenn jedoch magic_quotes eingeschaltet ist und Sie versuchen, Ihre Eingabedaten zu escapen, besteht die Chance, dass Sie eine doppelt escapete Zeichenkette erhalten (was nicht gut ist), um dem entgegenzuwirken, erkennen wir normalerweise, ob magic_quotes es On und, falls ja, entfernen Sie die hinzugefügten Schrägstriche über stripslashes() .

Manche tun dies vor dem Aufruf der Datenbank-Escaping-Funktion/-Methode, aber ich persönlich ziehe es vor, dies beim Laden der Seite zu tun, da dies die Daten viel konsistenter und weniger fehleranfällig macht. Wenn Sie PHP 5.3+ verwenden, sollte das folgende Snippet die Funktion deaktivieren magic_quotes :

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
}

Wenn Sie eine ältere Version von PHP verwenden, Das PHP-Handbuch hat auch einen ziemlich guten Ausschnitt :

if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}

1voto

ThiefMaster Punkte 297146

Sie brauchen um Ihren Code so zu aktualisieren, dass Ihre SQL-Eingabe korrekt umbrochen wird. Oder noch besser, verwenden Sie PDO, damit Sie Abfrageargumente getrennt von der Abfrage übergeben können.

PHP hat zwar magic_quotes_gpc ist sie standardmäßig deaktiviert und wird entfernt in PHP 6. Abgesehen davon ist es ein schreckliches Durcheinander, das zu potenziell unsicherem oder fehlerhaftem Code führt, und deshalb ist es besser, die entfernen automatisch Anführungszeichen hinzugefügt, wenn get_magic_quotes_gpc() es true .

0voto

Flask Punkte 4916

mysqli_real_escape_string() ist ein guter Anfang.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X