当我将它们传递给准备好的SQL语句时,是否需要转义我的数据值?

时间:2013-12-05 17:30:44

标签: php sql mysqli prepared-statement sql-injection

当我使用预准备语句时,我是否必须使用mysqli_real_escape_string等函数或自动执行?

例如我应该使用这个

$stmt = $mysqli->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam('sd', $name, $value);

或者我必须使用这样的东西

$stmt = $mysqli->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam('sd', mysqli_real_escape_string($name), mysqli_real_escape_string($value));

建议使用哪些函数来避免sql注入?

3 个答案:

答案 0 :(得分:3)

不,您不需要转义参数。事实上,转移到参数化查询中的变量是一个错误,会给你不正确的结果。

答案 1 :(得分:2)

使用参数化查询时,转义由API完成。你的第一种方法是正确的。

如果您正在进行原始文本查询,那么您应该转义参数值。

答案 2 :(得分:1)

预备语句会自动清除您要插入的内容。执行以下操作时:

$stmt = $mysqli->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

bindParam函数正在为您执行所有必要的清理工作,然后将该值插入查询字符串。

有趣的事实,准备好的陈述是建立在他们基本想法的黑客之上的黑客:)