Ist dies der beste Weg, es zu tun?Verwendung von mysql_real_escape_string, um meine Abfragen zu bereinigen
Sollte ich dies zu jedem Wert in jeder Abfrage tun? GET und POST?
Ist addslashes(mysql_real_escape_string())
Overkill?
Ist dies der beste Weg, es zu tun?Verwendung von mysql_real_escape_string, um meine Abfragen zu bereinigen
Sollte ich dies zu jedem Wert in jeder Abfrage tun? GET und POST?
Ist addslashes(mysql_real_escape_string())
Overkill?
Wenn Sie mysql_query() dann ja verwenden, ist mysql_real_escape_string() der beste Weg. Und ja, Sie müssen es auf jeden Parameter anwenden, den Sie in Ihre SQL-Anweisung mischen. Z.B.
$query = "
SELECT
x,y,z
FROM
foo
WHERE
a = '". mysql_real_escape_string($_POST['a'], $mysql) . "'
AND b = '". mysql_real_escape_string($_POST['b'], $mysql) . "'
";
Sie können aber auch vorbereitete Anweisungen verwenden, z. mit dem pdo Modul. Die Parameter werden unabhängig von der SQL-Anweisung übertragen und müssen daher nicht entfernt werden. Es ist sicherer (da man die Flucht nicht vergessen kann oder es falsch macht/für den falschen Zeichensatz), oft schneller und oft sogar einfacher als das Mischen der Parameter in die Aussage. z.B.
$pdo = new PDO('mysql:host=localhost;dbname=test', '..', '..');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("
INSERT INTO
foo (x,y,z)
VALUES
(:x,:y,:z)
");
$stmt->bindParam(':x', $x);
$stmt->bindParam(':y', $y);
$stmt->bindParam(':z', $z);
// insert all records (0,0,0) ... (0,1,0) ... (9,9,9)
for($x=0; $x<10; $x++) {
for($y=0; $y<10; $y++) {
for($z=0; $z<10; $z++) {
$stmt->execute();
}
}
}
edit: und addslashes (mysql_real_escape_string()) ist nicht nur übertrieben, sondern auch falsch.
+1 für den Vorschlag vorbereitete Aussagen/PDO – karim79
Für die Verwendung von mysql_real_escape_string() muss in Ihrem Skript bereits eine mysql-Verbindung eingerichtet sein.
Haben Sie versucht, PDO?
Es verhindert automatisch Angriffe durch mysql-Injection.
$db = new PDO("mysql:host=$dbhost;dbname=$default_dbname", $dbusername, $dbuserpassword);
$st = $db->prepare ('SELECT * from my_table WHERE owner= ? and dog = ?');
$st->execute (array('Bob', 'Rex'));
$data = $st->fetchAll();
Vielleicht möchten obwohl htmlentities() auf Ausgang verwenden.
mögliche Duplikate von [Beste Art, SQL Injection in PHP zu stoppen] (http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) – outis