使用mysql_real_escape_string来清除我的查询

时间:2009-07-22 19:25:23

标签: php mysql

这是最好的方法吗?

我应该对每个查询中的每个值执行此操作吗? GET和POST?

addslashes(mysql_real_escape_string())过度杀伤吗?

2 个答案:

答案 0 :(得分:6)

如果你正在使用mysql_query()那么是的,mysql_real_escape_string()是最好的方法。是的,您必须将它应用于您混合到sql语句中的每个参数。 E.g。

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

但你也可以使用预备语句,例如使用pdo模块。参数将从sql语句中传输,因此不需要转义。它更安全(因为你不能忘记转义或错误/错误的字符集),通常比将参数混合到语句中更快,甚至更简单。 e.g。

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

编辑:和addslashes(mysql_real_escape_string())不仅有点矫枉过正,而且也是错误的。

答案 1 :(得分:1)

您需要在脚本中建立一个mysql连接才能使用mysql_real_escape_string()。

您是否尝试过PDO?
它会自动阻止mysql注入攻击。

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

可能希望在输出中使用htmlentities()。