Frage

Mit %27 können Sie nur SQL -Injektion haben, obwohl Daten mit sanitären mysql_real_escape_string

%27) SQL INJECTION HERE %2F*

Was zu tun ist?

Bearbeiten mit Beispiel:

$sql = sprintf("SELECT *, MATCH(post) AGAINST ('%s*' IN BOOLEAN MODE) AS score FROM Posts WHERE MATCH(post) AGAINST('%s*' IN BOOLEAN MODE)",
                mysql_real_escape_string($_GET['searchterm']),
                mysql_real_escape_string($_GET['searchterm']));

$results = $db->queryAsArray($sql);

Wenn Sie eingeben %27) SQL INJECTION HERE %2F* Zum Suchterm QueryString werde ich auf der Seite ausgegeben:

Sie haben einen Fehler in Ihrer SQL -Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL -Serverversion entspricht, damit die richtige Syntax in der Nähe des 'Boolean -Modus) in Zeile 1 verwendet wird

Vielen Dank an alle, dass Sie das Problem in der DB -Klasse gefunden haben.

War es hilfreich?

Lösung

Argumentation aus dem Methodennamen queryAsArray, es scheint, dass du benutzt Dies Dbbase Klasse aus den Kommentaren der MySQL -Funktionsseite. Wenn ja, ist es das query Methode, die den Fluchtcharakter aus den entkommenen Anführungszeichen entfernt:

function query($sql, &$records = null){
    $sql = str_replace(array('\\"', "\\'"), array('"', "'"), $sql);
    // …
}

Dann ist es kein Wunder, dass Ihr Beispiel funktioniert (ich habe es vereinfacht):

$input = "', BAD SQL INJECTION --";

$sql = "SELECT '".mysql_real_escape_string($input)."'";
var_dump($sql);  // string(33) "SELECT '\', BAD SQL INJECTION --'"
//                      everything’s OK ↑

$sql = str_replace(array('\\"', "\\'"), array('"', "'"), $sql);
var_dump($sql);  // string(32) "SELECT '', BAD SQL INJECTION --'"
//                                Oops! ↑

Andere Tipps

Die in unserem Handbuch erwähnte Notiz wurde für die Löschung markiert. Sobald es sich über alle Spiegel in unserem Netzwerk ausbreitet, wird es nicht mehr an die offizielle Dokumentation beigefügt.

~ Daniel P. Brown
  Network Infrastructure Manager
  http://php.net/

Es ist am besten, solche Anweisungen überhaupt nicht zu erstellen und stattdessen Abfragen mit Parametern mithilfe von MySQLI oder PDO zu verwenden. Dies wird sich mit dem Problem der MySQL -Injektion befassen und eines Tages (noch nicht, leider) wird es auch besser abschneiden, da die Abfragen ohne Parameter zwischengespeichert werden, was bedeutet Einzeleingangswert ändert sich die ganze Zeit. Andere Datenbanken verwenden dies seit langem, aber MySQL hat es gerade geschafft, seit der neuesten Version parametrisierte Abfragen nicht langsamer zu machen.

Es sieht nicht plausibel aus, dass %27 die Zeichenfolge tatsächlich beendet. Es scheint eher eine Möglichkeit, Zitate in eine Zeichenfolge einzubetten, aber ich bin mir nicht sicher.

Natürlich habe ich mich entschlossen, meinen Server zu opfern und dies zu testen. Wenn ich %27 in ein Eingabefeld und ein Eingangsfeld eingreife, die mit MySQL_REAL_ESCAPE_string entkommen sind und dann in die Datenbank eingefügt werden, erhalte ich keine Fehler. Der Text %27 ist nur eingefügt. Also überhaupt kein Problem.

Sie liegen falsch. Keine Injektion hier möglich.

Durch die Befolgung dieser drei einfachen Regeln

  1. Die codieren ordnungsgemäß gesetzte Kunden durch mysql_set_charset()
  2. Daten entkommen using mysql_real_escape_string()
  3. Und in Zitate eingeschlossen

Sie können sicher sein, dass keine Injektion möglich ist

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top