benim sorguları temizler için mysql_real_escape_string kullanarak

2 Cevap php

Bu bunu yapmak için en iyi yolu nedir?

Ben her sorgu, her değer bu yapmalıyım? GET ve POST?

addslashes(mysql_real_escape_string()) overkill?

2 Cevap

Eğer mysql_query kullanıyorsanız () o zaman evet, mysql_real_escape_string () en iyi yoldur. Ve evet, size sql deyimi içine karıştırıp her parametre uygulamak zorunda. Örneğin

$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) . "'
 ";

Ama aynı zamanda hazırlanmış ifadeleri kullanabilirsiniz, örneğin, pdo modülü ile. Parametreleri sql deyimi dışında transfer edilir ve bu nedenle kaçan gerekmez. (Eğer kaçan veya yanlış charset için / yanlış yaptığını unutmak değil çünkü) Daha güvenli, daha hızlı ve sık sık ifadesine parametreleri karıştırma daha çok sık daha basit. örneğin

$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: ve addslashes (mysql_real_escape_string ()) değil, sadece overkill ama aynı zamanda yanlış.

Bir mysql bağlantı zaten mysql_real_escape_string () kullanmak için komut kurulmuş olması gerekir.

Have you tried PDO?
It prevents mysql injection attacks automatically.

$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();

Ama çıkışta htmlentities () kullanmak isteyebilirsiniz.