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

Я понимаю, что правильный способ защитить БД от внедрения SQL - использовать подготовленные операторы. Я хотел бы понять, как подготовленные заявления защищают мою базу данных.

Для начала подготовленные операторы - это то же самое, что и "параметризованные запросы"?

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

В «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

Ответы [ 4 ]

22 голосов
/ 28 октября 2010

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

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

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

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

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

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

3 голосов
/ 28 октября 2010

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

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

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

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

2 голосов
/ 28 октября 2010

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

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

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

0 голосов
/ 19 февраля 2017

ваш источник защищен от 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...