Защита От Внедрения 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)
Но на данный момент проходящие запросы определяются администратором.
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);