Когда использовать подготовленные операторы в PHP Mysqli?- Пользовательский ввод поиска формы против запросов выбора - PullRequest
2 голосов
/ 29 июня 2019

Я пытаюсь понять, когда мне следует использовать подготовленные операторы в php / mysqli. Должен ли каждый запрос php / mysqli использовать подготовленные операторы или просто запросы и экземпляры, в которые вовлечен пользовательский ввод ... например, HTML-форма, которая просит пользователя ввести данные для поиска в базе данных?

Я переношу свой старый код php5 / mysql в php7 / mysqli. У меня есть много файлов PHP, которые запрашивают MySQL DB. Я хотел бы получить разъяснения, если мне нужно использовать подготовленные операторы для каждого php-файла, который подключается к базе данных mysql ... например, php-файлы, на которые ссылается «php require», и включают простые операторы sql select для отображения изображений и ссылок на html. страница

<?php

//establish connection

$con = new mysqli('localhost','uid','pw','db');

//check connection

if ($con->connect_error) {
die("Connection failed: " . $con->connect_error);  
}

//search variable that stores user input

$search = "%{$_POST['search']}%";

//prepare, bind and fetch

$stmt = $con->prepare("SELECT image, caption FROM `tblimages`
WHERE catid = 3 AND caption LIKE ? order by caption ASC");
$stmt->bind_param("s", $search);
$stmt->execute();
$stmt->bind_result($image,$caption);

while ($stmt->fetch()) {
echo "{$image} <br> {$caption} <br>";    
}

$stmt->close();

//close database connection

mysqli_close($con);

?>

Приведенный выше код работает и является первым, когда я использовал подготовленные операторы. Он принимает пользовательский ввод из формы (пустое поле для ввода поискового запроса - POST) и выполняет поиск в БД ..., а затем выводит результаты на HTML-страницу. Это кажется логичным использованием подготовленных утверждений. Однако ... У меня есть другие php-файлы, где пользователи выбирают данные из выпадающего списка в форме, чтобы отобразить результат (пользователь не вводит данные в поле поиска, как указано выше). Использую ли я подготовленные заявления для этого случая также? Кроме того, я использую подготовленные операторы для файлов php, на которые есть ссылка через «php require», и включаю простые операторы sql select для отображения изображений и ссылок на html-страницу? Я еще не нашел разъяснения о конкретных случаях использования подготовленных операторов для предотвращения SQL-инъекций. Любые разъяснения или ссылки приветствуются. Спасибо.

1 Ответ

2 голосов
/ 29 июня 2019

Краткий ответ: Всегда используйте подготовленные высказывания.

Длинный ответ:

Подготовленные операторы отделяют ваши данные от команд SQL. Они предоставляются PDO или MySQLi . Их самое большое преимущество в том, что внедрение SQL невозможно, если ваши данные обрабатываются как данные. Еще одним преимуществом является то, что вы можете выполнять один и тот же запрос снова и снова с другим набором данных, что может быть лучше для вашей производительности и часто делает ваш код чище.

Однако бывают случаи, когда вы хотите иметь какой-то динамический запрос, основанный на выборе пользователя или действиях. Как вы, наверное, знаете, имена таблиц и столбцов - это не данные, а часть SQL-запроса, поэтому их нельзя разделять. Тогда альтернатива подготовленным операторам - иметь белый список возможных значений и разрешать проверку пользователя только по белому списку.

Вы можете спросить, для чего подходят query, real_query, multi_query и PDO::exec?
Как показывает руководство по PHP, они хороши в тех случаях, когда вам нужно только выполнить постоянный запрос без каких-либо переменных или когда у вас есть запрос, который не может быть подготовлен. например,

$mysqli->query('SELECT Name FROM City LIMIT 10');
$pdo->exec('DELETE FROM fruit');
$mysqli->multi_query('DELETE FROM fruit; DELETE FROM pets;');

Что если вы знаете тип и значения ваших данных? Вы также должны подготовить / связать?
Да! Привыкайте связывать все данные, идущие с запросом SQL. Нет причин делать исключения. Гораздо сложнее отследить эти исключения в вашем коде и всегда быть уверенным, что вы не перезаписываете «безопасное» значение каким-то неизвестным вводом.

Если вы все еще не знаете, как использовать подготовленные операторы, или считаете, что они слишком сложные (они не являются), вы можете взглянуть на удивительное руководство по PHP по https://phpdelusions.net

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