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

问题描述 投票:0回答:4

鉴于以下代码,我需要转义并清理

$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();
?>

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

php mysqli prepared-statement sanitization
4个回答
13
投票

不,您不必为了注射保护而逃脱它或对其进行消毒。对于其他应用程序特定的内容,您可以对其进行清理。

不久前我也有过类似的问题:

mysqli_stmt_bind_param SQL注入


10
投票

您直接从 php.net 上有关 mysqli::prepare 的手册复制了该代码片段。在同一页上有以下文字:

准备好的语句的目的是不在 SQL 语句中包含数据。将它们包含在 SQL 语句中是不安全的。始终使用准备好的语句。它们使用起来更干净(代码更容易阅读)并且不易受到 SQL 注入。

这就是你问题的答案;)


1
投票

此外。另外。

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

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

再次强调:不会取代数据库转义或准备好的语句,但确保使用一致的数据。


1
投票

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

Sander 说你不需要消毒,但是在 http://www.w3schools.com/php/php_mysql_prepared_statements.asp (我意识到 w3schools 并不总是一个完全最新且准确的信息来源,但我发现它以一种明智、易于理解的方式阐明了事情),他们说“注意:如果我们想插入来自外部来源的任何数据(例如用户输入),那么对数据进行清理和验证非常重要。 ”

所以看来当使用表单并接受用户输入时,你应该进行清理。

© www.soinside.com 2019 - 2024. All rights reserved.