mysqli真正的转义字符串,我应该用吗?

时间:2012-12-23 14:49:24

标签: mysqli

我想消除sql注入,我应该使用mysqli真正的转义字符串还是在mysqli中清楚? 例如

$nick=mysqli_real_escape_string($_POST['nick'])

2 个答案:

答案 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函数不会阻止注射,也不应用于任何保护。