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 表中的主要内容,如果未能解决你的问题,请参考以下文章