2009-07-22 8 views

Antwort

6

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

+1 für den Vorschlag vorbereitete Aussagen/PDO – karim79

1

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.

Verwandte Themen