4

可能重复:
PDO 准备好的语句是否足以防止 SQL 注入?

我对推出一个我已经工作了几天的新 API 的主要关注是安全性。

我是 PDO 用法的初学者,但知道主要结构。但我不知道如何保护查询免受 SQLInjection 的影响。

我的代码如下:

<?php
    $Start = new Db();
    class Db 
    {
        private $dbh = null;

        public function __construct()
        {
            $this->dbh = new PDO('mysql:host=localhost;dbname=pdo', 'root', 'xxxxx');
        }

        public function PDOFetch($Var)
        {
            $sth = $this->dbh->prepare("$Var");
            $sth->execute();
            $result = $sth->fetchAll();
            return $result; 
        }

        public function PDONumb ($Var)
        {
            $sth = $this->dbh->prepare("$Var");
            $sth->execute();
            $count = $sth->rowCount();
            return $count;
        }

        public function PDODel ($Var)
        {
            $Delete = $this->dbh->exec("$Var");
            return $Delete;
        }

        public function PDOQuery ($Var)
        {
            $Query = $this->dbh->query("$Var");
            return $Query;
        }
    }
?>

我将如何防止 SQL 注入和其他漏洞?

编辑:

例如,传递到 API 的查询是从“index.php”页面完成的。

一行是:

    $Num = $Start->PDONumb("SELECT * FROM news");

但后来,当我用这个掩盖了我的踪迹时。我想更高级地使用它,所以它会传递用户定义的变量(因此是 SQL 注入问题)

但目前,通过的查询是由管理员定义的。

4

1 回答 1

4

如果没有看到您传入的 SQL,我们就无法判断。如果您正在使用不受信任的数据创建不安全的 SQL 语句,那么它们是否在 PDO 中执行并不重要。您仍然可以接受 SQL 注入。

例如,如果您$userid从 Web 获取并构建:

$sql = "SELECT * FROM users WHERE userid=$userid";

该 SQL 语句对 SQL 注入开放,因为如果值为$userid0; DROP TABLE users;那么您将创建的 SQL 将是

SELECT * FROM users WHERE userid=0; DROP TABLE users;

不管你是否通过 PDO 执行它都没有关系:你仍然在执行一个坏人发给你的代码。

要正确使用 PDO,您需要绑定您的参数


与您的问题无关,但新手经常遇到的重要一点:没有必要在您的单个变量周围加上双引号。你的代码

$Delete = $this->dbh->exec("$Var");

最好写成

$Delete = $this->dbh->exec($Var);
于 2012-12-02T15:55:46.483 回答