PDO - 使用准备好的语句将所有 sql 数据放入 html 表中

Posted

技术标签:

【中文标题】PDO - 使用准备好的语句将所有 sql 数据放入 html 表中【英文标题】:PDO - Putting all sql data into an html table using prepared statement 【发布时间】:2014-02-04 18:59:07 【问题描述】:

我想从我的表中获取所有数据并将其显示在一个 html 表中,但我不确定如何使用准备好的语句来保护我免受 sql 注入。

我读过它应该看起来像:

$getPlayers = $db->prepare("SELECT * FROM Player WHERE name = :name");

但我不确定如何使用使用“WHERE”的方法从数据库中获取我的所有数据。

到目前为止,这是我的代码。它可以工作并获取我所有的数据,但我认为它不会安全地通过 sql 注入,是吗?

$getPlayers = $db->prepare("SELECT * FROM Player");
$getPlayers->execute();

$players = $getPlayers->fetchAll();

echo "<table>";
echo "<tr><th>Name</th><th>Games Played</th><th>Tries</th></tr>";


foreach( $players as $row) 
    echo "<tr>";
    echo "<td>".$row['name']."</td>";
    echo "<td>".$row['games_played']."</td>";
    echo "<td>".$row['tries']."</td>";
    echo "</tr>";


echo "</table>";

【问题讨论】:

【参考方案1】:

SQL 注入只是用户输入的数据需要发送到数据库的问题。 SELECT * FROM Player 之类的查询不包含用户数据。由于这个原因,SQL 注入是完全安全的。

事实上,在这种情况下,使用准备好的语句没有任何好处。此处的准备好的语句将在一次调用时对数据库进行两次调用。

你可以这样做:

$getPlayers = $db->query("SELECT * FROM Player");
foreach ($getPlayers as $player) 
  // do something

无需准备,无需绑定,只需一次调用数据库。

【讨论】:

【参考方案2】:

SQL 注入使用提交的数据。有关示例,请参阅http://en.wikipedia.org/wiki/SQL_injection。在您的示例中,我没有看到提交数据的任何用法。

如果要按名称搜索,则搜索的文本可以是 sql 注入但给出 您将使用绑定参数这一事实不会成为问题。

$search  = $_GET['search'];
//mysql injection danger:
$getPlayers = $db->prepare("SELECT * FROM Player WHERE name = '$search'");

//因为我可以搜索字符串' OR 1=1 OR 1='

//binded, no mysql injection
$search  = $_GET['search'];
$getPlayers = $db->prepare("SELECT * FROM Player WHERE name = ?");
$db->bindParam(1, $search, PDO::PARAM_STR);

有关绑定的更多信息,请参阅http://www.php.net/manual/en/pdostatement.bindparam.php。

【讨论】:

SQL注入可由任何无效内容引起,不一定来自用户输入。 @BillKarwin 格式错误的查询并不真正符合注入的条件。 @BillKarwin 如果 sql 注入的来源不是来自用户输入(如 get、post、cookiers、referrer 等),那么它是一项功能而不是恶意意图 @CharlieS 我认为 BillKarwin 的意思是任何被用户输入触及的东西都应该被转义。您可以执行正确的 INSERT INTO tbl SET field=:name 但稍后您将数据从 tbl 提取到 $somevar 并直接执行选择查询,例如 SELECT * FROM tbl WHERE field='$somevar'。盲目插入数据也会导致xss问题。 是的,例如,您绝对可以在数据库中有一个包含单引号的字符串,如果您从数据库中获取它并随后在查询中使用它,则必须对其进行转义或使用查询参数。同样,您从文件或 Web 服务等获取的任何内容。

以上是关于PDO - 使用准备好的语句将所有 sql 数据放入 html 表中的主要内容,如果未能解决你的问题,请参考以下文章

PDO 准备好的语句如何帮助防止 SQL 易受攻击的语句?

在 PHP 中到处使用准备好的语句? (PDO)

带有位域的 PDO 准备好的语句

PDO 准备好的语句有多安全

从 PDO 准备好的语句中获取原始 SQL 查询字符串

从 PDO 准备好的语句中获取原始 SQL 查询字符串