Frage

in Dokumentation von mysql_real_escape_string () es sagt:

... unter Berücksichtigung des aktuellen Zeichensatzes der Verbindung, so dass es sicher ist, sie in mySQL_Query () zu platzieren ()

Warum hat es nun nicht richtig funktioniert? Dieses Beispiel?

$c = mysql_connect("localhost", "user", "pass");
mysql_select_db("database", $c);
// change our character set
mysql_query("SET CHARACTER SET 'gbk'", $c);
// create demo table
mysql_query("CREATE TABLE users (
    username VARCHAR(32) PRIMARY KEY,
    password VARCHAR(32)
) CHARACTER SET 'GBK'", $c);
mysql_query("INSERT INTO users VALUES('foo','bar'), ('baz','test')", $c);
// now the exploit code
$_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*'; 
$_POST['password'] = 'anything'; 
// Proper escaping, we should be safe, right?
$user = mysql_real_escape_string($_POST['username'], $c);
$passwd = mysql_real_escape_string($_POST['password'], $c);
$sql = "SELECT * FROM  users WHERE  username = '{$user}' AND password = '{$passwd}'";
$res = mysql_query($sql, $c);
echo mysql_num_rows($res); // will print 2, indicating that we were able to fetch all records

Wir haben die Charaktereinstellung durch verändert mysql_query("SET CHARACTER SET 'gbk'", $c) voranrufen mysql_real_escape_string, Warum kannte diese Funktion keine neue Charakter-Set?

War es hilfreich?

Lösung

SET CHARACTER SET / SET NAMES ist nicht genug Um vor dem GBK -Exploit zu schützen, je nachdem, welche Version von MySQL Sie verwenden.

Wenn Sie können, verwenden Sie mysql_set_charset / mysqli_set_charset oder echte vorbereitete Aussagen.

Sie möchten auch MySQL 5.0.77 oder besser verwenden. Weitere Informationen finden Sie in meinem früheren Beitrag von mir. Wenn Sie ältere Versionen von MySQL verwenden, sind Sie kann ohne die verletzlich sein _set_charset Funktionen.

Die Verwendung vorbereiteter Aussagen umgeht dieses Problem vollständig.

Andere Tipps

Sie lesen die falsche Dokumentation.

Du redest über mysql_real_escape_string , aber Sie beziehen sich auf die Dokumentation von mysqli_real_escape_string. Beachten Sie das zusätzliche ich.

In der Dokumentation für MySQLI_REAL_ESCAPE_STRING steht:

Mysqli :: real_esescape_string - mysqli_real_escape_string - entkommt Sonderzeichen in einer Zeichenfolge, um in einer SQL -Anweisung zu verwenden, wobei das aktuelle Zeichen der Verbindung berücksichtigt wird

Die Dokumentation für MySQL_REAL_ESCAPE_STRING (die im Beispiel verwendet wird):

MySQL_REAL_ESCAPE_STRING - Es entgeht Sonderzeichen in einer Zeichenfolge für die Verwendung in einer SQL -Anweisung

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