13

我想消除sql注入,我应该使用mysqli_real_escape_string()还是在mysqli中明确?例如

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

2 回答 2

23

您应该使用准备好的语句并将字符串数据作为参数传递,但您不应该对其进行转义。

此示例取自文档:

/* 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仅当您将字符串直接嵌入查询中时才需要使用,但我建议您永远不要这样做。尽可能始终使用参数。

有关的

于 2012-12-23T14:52:03.593 回答
2

是的,您可以使用 mysqli_real_escape_string 来格式化字符串,如果您要实现自己的查询处理器,使用占位符或某种查询构建器。

如果您打算在代码中使用裸 API 函数(这显然是错误的做法,但在当地人中非常流行) - 最好使用准备好的语句。

无论如何,你不能单独使用这个函数来“消除 sql 注入”。mysql(i)_real_escape_string功能不会阻止注射,也不应该用于任何保护。

于 2012-12-23T14:56:24.337 回答