如果使用准备好的PHP / MySQL查询,我是否需要清理输入?

时间:2011-01-20 20:10:15

标签: php mysqli prepared-statement sanitization

鉴于以下代码,我是否需要转义并清理$city

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* 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();
}

/* close connection */
$mysqli->close();
?>

使用准备好的查询时,是否需要清理任何输入?

4 个答案:

答案 0 :(得分:13)

不,你不必为了注射保护而逃避它或消毒它。对于其他应用程序特定的东西,你可以消毒它。

我前面有一个类似的问题:

mysqli_stmt_bind_param SQL Injection

答案 1 :(得分:9)

@Gary: 你直接从php.net手册中复制了代码片段,关于mysqli :: prepare。在同一页面上有以下文字:

“预准备语句的目的是不在SQL语句中包含数据。将它们包含在SQL语句中是不安全的。始终使用预准备语句。它们使用起来更清晰(代码更易于阅读)而且不易出现SQL注射“。

您的问题的答案是什么;)

答案 2 :(得分:1)

另外。另外。

准备好的statemens,如果使用得当,几乎可以完全缓解SQL注入问题。但是,您应该在适当的情况下格式化/清理输入数据。清洁输入不是安全功能,但对于稳健性和可用性是可取的。对于您的$ city,您可能想要删除所有非单词字符:

$city = trim(preg_replace("/[^\w-]+/", " ", $city));

再次:不替换数据库转义或预处理语句,但确保使用连贯的数据。

答案 3 :(得分:1)

我意识到这个问题很老了。我在自己搜索相同的信息时偶然发现了它。我对Sander的回答发表评论,但我还没有足够的声誉发表评论。

桑德说你不需要消毒,但在http://www.w3schools.com/php/php_mysql_prepared_statements.asp(我意识到w3schools并不总是一个完整的最新和准确的信息来源,但我发现它可以解决问题他们说&#34;注意:如果我们想要从外部来源插入任何数据(如用户输入),那么对数据进行消毒和验证非常重要。&#34 ;

因此,当使用表单并接受用户输入时,似乎应该进行清理。