【发布时间】:2012-12-10 07:38:13
【问题描述】:
我想消除sql注入,应该使用mysqli_real_escape_string()还是在mysqli中明确?
例如
$nick = mysqli_real_escape_string($_POST['nick'])
【问题讨论】:
我想消除sql注入,应该使用mysqli_real_escape_string()还是在mysqli中明确?
例如
$nick = mysqli_real_escape_string($_POST['nick'])
【问题讨论】:
您应该使用prepared statements 并将字符串数据作为参数传递,但您不应该对其进行转义。
此示例取自文档:
/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
/* bind parameters for markers */
$stmt->bind_param("s", $city);
/* execute query */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($district);
/* fetch value */
$stmt->fetch();
printf("%s is in district %s\n", $city, $district);
/* close statement */
$stmt->close();
}
请注意,该示例不调用mysqli_real_escape_string。如果您将字符串直接嵌入到查询中,您只需要使用mysqli_real_escape_string,但我建议您永远不要这样做。尽可能使用参数。
相关
【讨论】:
是的,如果您要使用占位符或某种查询构建器实现自己的查询处理器,您可以使用 mysqli_real_escape_string 来格式化字符串。
如果您打算在代码中使用裸 API 函数(这显然是错误的做法,但在当地人中非常流行)- 最好使用准备好的语句。
无论如何,单独使用这个函数是无法“消除sql注入”的。 mysql(i)_real_escape_string 函数不会阻止注入,也不应该用于任何保护。
【讨论】: