Защита От Внедрения SQL С Помощью PDO API? [дубликат]


Возможный Дубликат:
Являются ли подготовленные инструкции 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)

Но на данный момент проходящие запросы определяются администратором.

Author: Community, 2012-12-02

1 answers

Мы не можем сказать, не увидев 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, вам необходимо привязать свои параметры.


Не имеет отношения к вашему вопросу, но важный момент, с которым часто сталкиваются новички: нет необходимости заключать ваши одиночные переменные в двойные кавычки. Ваш код

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

Было бы лучше записать как

$Delete = $this->dbh->exec($Var);
 4
Author: Andy Lester, 2012-12-02 15:55:46