В PHP, как PDO защищает от SQL-инъекций? Как работают подготовленные заявления?

Я понимаю, что правильный способ защитить db от SQL-инъекции – это использование подготовленных операторов. Я хотел бы понять, как подготовленные заявления защищают мой db.

Во-первых, готовые заявления имеют то же самое, что и «параметризованные запросы»?

В качестве примера, я вставляю ниже своего кода для вставки нового пользователя в таблицу пользователя. Это безопасно? Как PDO работает, чтобы защитить его? Нужно ли еще что-то сделать, чтобы обезопасить db от инъекций?

В 'Class_DB.php':

class DB { private $dbHost; private $dbName; private $dbUser; private $dbPassword; function __construct($dbHost, $dbName, $dbUser, $dbPassword) { $this->dbHost=$dbHost; $this->dbName=$dbName; $this->dbUser=$dbUser; $this->dbPassword=$dbPassword; } function createConnexion() { return new PDO("mysql:host=$this->dbHost;dbName=$this->dbName", $this->dbUser, $this->dbPassword); } } 

В «DAO_User.php»:

 require_once('Class_DB.php'); class DAO_User { private $dbInstance; function __construct($dbInstance){ $this->dbInstance=$dbInstance; } function createUser($user){ $dbConnection=$this->dbInstance->createConnexion(); $query=$dbConnection->prepare("INSERT INTO users (userName, hashedPassword, userEmail) VALUES (?,?,?)"); $query->bindValue(1, $user->userName); $query->bindValue(2, $user->hashedPassword); $query->bindValue(3, $user->userEmail); $query->execute(); } } 

Благодаря,

JDelage

Хорошо, я нашел ответ на свой вопрос в этом связанном вопросе: подготовлены ли PDO заявления, достаточные для предотвращения SQL-инъекции?

Спасибо Хаиму за то, что он указал мне на это.

В нетехнических терминах, вот как подготовленные заявления защищают от инъекций:

Когда запрос отправляется в базу данных, он обычно отправляется как строка. Движок db попытается проанализировать строку и отделить данные от инструкций, опираясь на кавычки и синтаксис. Поэтому, если вы отправляете данные пользователя «SELECT * WHERE» «имя строки таблицы EQUALS», движок сможет проанализировать инструкцию.

Если вы разрешаете пользователю вводить то, что будет отправлено внутри «пользовательских данных», тогда они могут включать в это что-то вроде «…» ИЛИ IF 1 = 1 БАЗОВАЯ БАЗА ДАННЫХ ». У механизма db будет проблема с разбором этого и будет возьмите вышеуказанное как инструкцию, а не бессмысленную строку.

Способ PDO заключается в том, что он отдельно отправляет инструкцию (готовят («INSERT INTO …)) и данные. Данные отправляются отдельно, четко понимаются как данные и данные. ДБ-движок даже не пытается проанализируйте содержимое строки данных, чтобы увидеть, содержит ли она инструкции, и любой потенциально опасный код snipet не рассматривается.

Вот мое несколько ограниченное мнение по этому вопросу …

Подготовленный оператор компилируется на сервере БД с помощью заполнителей для ввода переменных.

Когда вы связываете параметр, вы сообщаете БД, какие значения использовать при выполнении запроса. Затем он передаст значение в скомпилированный оператор.

Разница между параметрами привязки и простой старой инъекцией строк заключается в том, что с первым значение не интерполируется, а скорее назначается. Во время выполнения СУБД обращается к заполнителю и запрашивает значение для использования. Таким образом, нет никаких шансов, чтобы символы цитат или другие гадости пробирались в фактическое утверждение.

Без использования подготовленных инструкций вы не могли бы использовать заполнители (?) В своем запросе.

Вместо этого вам нужно будет включить значение, которое вы хотите вставить непосредственно в оператор SQL. Это приведет к тому, что для каждой вставки (плохой для производительности) будет использоваться другой оператор SQL, и если вы не будете осторожны в том, какие строки вы вставляете в оператор, вы также можете получить заявление, которое делает что-то еще, а затем то, что вы намеревались (например SQL-инъекция может произойти).

Эта ситуация несколько похожа на функцию Javascript, которая делает некоторый фиксированный код с переменными входными параметрами, вместо вставки входных параметров в источник Javascript и последующего его определения.

ваш источник sqli от атаки sqli .

это пример и не безопасно, когда вы выбираете одного пользователя из своей базы данных.

 // example: localhost/user.php?username=admin $getdata = $_GET['username']; $dbConnection=$this->dbInstance->createConnexion(); $query=$dbConnection->prepare("SELECT * FROM users WHERE username=".$getdata."); // PHP simple