ЗОП Готовить заявления - PullRequest
4 голосов
/ 06 февраля 2012

Могу ли я просто быстро получить разъяснения по этому поводу, просто обсуждение, которое я веду:

Используя это в качестве примера:

$conn->prepare ( 'SELECT * FROM table WHERE id = "' . $_POST['id'] . '"' );

Разве не предотвращает внедрение SQL, вы должны связать параметры или санировать значения перед тем, как вставить в оператор подготовки? Или я ошибаюсь, и вполне нормально просто использовать приготовление?

Ответы [ 3 ]

5 голосов
/ 06 февраля 2012

Подготовленные операторы используют заполнители для вставляемых значений.Фрагмент кода в вашем вопросе уже интерполирует значение в запрос и поэтому склонен к внедрению SQL.

В следующем псевдокоде выделены подготовленные операторы:

$stmt = $conn->prepare('SELECT * FROM `table` WHERE `id` = ?');
$stmt->execute($_POST['id']);

В этом примерелогика этого «кода» позаботится о правильном цитировании всего, что находится в $_POST['id'] и замене знака вопроса ? этим.Вы также можете встретить следующие заполнители:

$stmt = $conn->prepare('SELECT * FROM `table` WHERE `id` = :id');
$stmt->execute(array(
    'id' => $_POST['id']
));

Обратите внимание, однако, что подготовленные операторы не освобождают вас от обязанности проверять вводимые пользователем данные перед передачей их в (My) SQL-оператор: ifid ожидается как целое число, в качестве входных данных принимаются только целые числа.

2 голосов
/ 06 февраля 2012

Да, это не мешает внедрению SQL, вы должны использовать

$conn->prepare ( 'SELECT * FROM table WHERE id = ?' );

0 голосов
/ 06 февраля 2012

Правильно, вы должны связать параметры, чтобы воспользоваться преимуществами защиты от инъекций PDO.

И помните, что PDO не добавляет htmlspecialchars, поэтому, если это важно для вас, вы должны сделать это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...