Einige Richtlinien für die Umgehung von Sonderzeichen in SQL-Anweisungen.
Verwenden Sie nicht MySQL . Diese Erweiterung ist veraltet. Verwenden Sie MySQLi o PDO stattdessen.
MySQLi
Um Sonderzeichen in einer Zeichenkette manuell zu escapen, können Sie die mysqli_real_escape_string Funktion. Die Funktion funktioniert nicht richtig, wenn nicht der richtige Zeichensatz mit mysqli_set_charset .
Ejemplo:
$mysqli = new mysqli('host', 'user', 'password', 'database');
$mysqli->set_charset('charset');
$string = $mysqli->real_escape_string($string);
$mysqli->query("INSERT INTO table (column) VALUES ('$string')");
Für das automatische Escaping von Werten mit vorbereiteten Anweisungen verwenden Sie mysqli_prepare y mysqli_stmt_bind_param wobei die Typen für die entsprechenden Bindungsvariablen für eine entsprechende Konvertierung angegeben werden müssen:
Ejemplo:
$stmt = $mysqli->prepare("INSERT INTO table (column1, column2) VALUES (?,?)");
$stmt->bind_param("is", $integer, $string);
$stmt->execute();
Unabhängig davon, ob Sie vorbereitete Erklärungen verwenden oder mysqli_real_escape_string
müssen Sie immer die Art der Eingabedaten kennen, mit denen Sie arbeiten.
Wenn Sie also eine vorbereitete Anweisung verwenden, müssen Sie die Typen der Variablen für mysqli_stmt_bind_param
Funktion.
Und die Verwendung von mysqli_real_escape_string
dient, wie der Name schon sagt, dazu, Sonderzeichen in einer Zeichenkette zu entschärfen, macht also keine ganzen Zahlen sicher. Der Zweck dieser Funktion ist es, das Aufbrechen von Zeichenketten in SQL-Anweisungen und die dadurch verursachten Schäden an der Datenbank zu verhindern. mysqli_real_escape_string
ist eine nützliche Funktion, wenn sie richtig eingesetzt wird, insbesondere in Kombination mit sprintf
.
Ejemplo:
$string = "x' OR name LIKE '%John%";
$integer = '5 OR id != 0';
$query = sprintf( "SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string($string), $integer);
echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 5
$integer = '99999999999999999999';
$query = sprintf("SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string($string), $integer);
echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 2147483647