我想消除sql注入,我应该使用mysqli真正的转义字符串还是在mysqli中清楚? 例如
$nick=mysqli_real_escape_string($_POST['nick'])
答案 0 :(得分:23)
您应该使用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
,但我建议您永远不要这样做。始终尽可能使用参数。
相关强>
答案 1 :(得分:2)
是的,如果要使用占位符或某种查询构建器来实现自己的查询处理器,可以使用mysqli_real_escape_string来设置字符串的格式。
如果您计划在代码中使用裸API函数(这显然是错误的做法,但是当地人非常普遍) - 最好选择准备好的语句。
无论如何,你不能单独使用这个功能“消除sql注入”。 mysql(i)_real_escape_string
函数不会阻止注射,也不应用于任何保护。