【问题标题】:PDO - Putting all sql data into an html table using prepared statementPDO - 使用准备好的语句将所有 sql 数据放入 html 表中
【发布时间】: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>";

【问题讨论】:

    标签: php mysql sql pdo phpmyadmin


    【解决方案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 服务等获取的任何内容。
      猜你喜欢
      • 2017-11-29
      • 2016-12-30
      • 2013-12-28
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2012-11-13
      • 2014-07-20
      • 1970-01-01
      相关资源
      最近更新 更多