使用PDO API保护SQL注入?

时间:2012-12-02 15:48:27

标签: php pdo sql-injection

  

可能重复:
  Are PDO prepared statements sufficient to prevent SQL injection?

我主要担心推出一个新的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注入和其他漏洞?

编辑:

查询正在从“index.php”页面进行传递到API。

一行是:

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

但是后来,当我用这个覆盖了我的轨道。我想使用它更高级,因此它将传递用户定义的变量(因此SQL注入问题)

但目前,传递的查询是由管理员定义的。

1 个答案:

答案 0 :(得分:4)

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

例如,如果您从网络获得$userid并构建:

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

SQL语句是为SQL注入打开的,因为如果$userid的值是0; DROP TABLE users;,那么您将创建的SQL将是

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

如果您通过PDO执行该操作并不重要:您仍在执行坏人发送给您的代码。

要正确使用PDO,您需要bind your parameters


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

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

会更好地写成

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