2011-01-20 66 views
6

鉴于以下代码,我需要转义和消毒$city如果使用准备好的PHP/MySQL查询,我需要清理输入吗?

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

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

回答

8

@Gary: 您复制了直接从约mysqli的php.net手册的代码片段::准备。在同一页面上是以下文本:

“准备好的语句的目的是不包含SQL语句中的数据,将它们包含在您的SQL语句中并不安全,请始终使用预准备语句,代码更易于阅读)并且不容易出现SQL注入。“

这是你的问题的答案;)

+4

树木挡在树林中。 ;) – 2011-01-20 21:37:09

+0

是的,但准备好的语句通常在应用程序层和数据层都需要更多的资源 - 当你看到有人说“总是使用准备好的语句”时要小心。 – Jmoney38 2013-09-24 11:41:05

1

另外。此外。

准备好的statemens如果使用正确,几乎可以完全缓解SQL注入困境。但是,您应该在适当的地方格式化输入数据。清洁输入不是一项安全功能,但对健壮性和可用性而言是明智的。在你的$城市的情况下,你可能想去掉所有非单词字符:

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

再次:不更换数据库逃逸或准备语句,但确保一致的数据进行工作。

0

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

桑德说,你不需要消毒,但在http://www.w3schools.com/php/php_mysql_prepared_statements.asp(我知道w3schools并不总是一个完全的最新和准确的信息来源,但我觉得它的东西明智,易于他们说:“如果我们想从外部来源插入任何数据(比如用户输入),那么对数据进行消毒和验证是非常重要的。”

所以看来当使用表格和接受用户输入,你应该消毒。

相关问题