Intereting Posts
Magento – Пользовательский вопрос для заказа по электронной почте Есть ли простой PHP-код, чтобы отличить «Передача объекта в качестве ссылки» vs «Передача ссылки объекта как значения»? Проблема с информацией о членстве API MailChimp Создание диапазона в поле ввода, таком как сообщения Facebook как отображать ошибки на MAMP? Базовая библиотека проверки подлинности и управления сессиями для PHP? Magento: автоматически создавайте CSV-файл для каждого заказа Как отправить SMS с помощью функции PHP CURL сопоставление импорта magento xml Bootstrap – требуется скрывать контент до тех пор, пока модальные нагрузки Как изменить первоначальную цену на странице продукта OpenCart? Войдите в Google с помощью PHP и Curl, Cookie отключился? iOS 5- отправка json с использованием NSURLRequest и разбор в php через $ _POST Загрузка файла не проверяет существующий файл Выходные данные массива и формат даты

SQL Injection – безопасен ли этот запрос?

У меня есть страница, которая добавляет различные параметры к URL-адресу, который используется для запроса.

Например

http://www.example.com/search.php?category=Schools&country[]=Belgium&country[]=Czech+Republic 

Мой код похож на этот

 if(isset($_GET['country'])){ $cties = "'" . implode("','", $_GET['country']) . "'"; } else { $cties = "'Albania','Andorra','Austria','Belarus','Belgium','Bosnia & Herzegovina','Bulgaria','Croatia','Czech Republic','Denmark','Estonia','Faroe Islands','Finland','France','Germany','Gibraltar','Great Britain','Greece','Hungary','Iceland','Ireland','Isle of Man','Italy','Latvia','Liechtenstein','Lithuania','Luxembourg','Macedonia','Malta','Moldova','Monaco','Montenegro','Netherlands','Norway','Poland','Portugal','Serbia','Romania','San Marino','Slovakia','Slovenia','Spain','Sweden','Switzerland','Ukraine','United Kingdom'"; } if(isset($_GET['category'])){ $cat = $_GET['category']; } else{ $cat = " "; } try{ // create the Prepared Statement $stmt = $con->prepare("SELECT * FROM MyTable WHERE MyDate >= DATE(NOW()) AND (Category=:cat or '' = :cat) AND Country IN ($cties) ORDER BY MyDate ASC"); $stmt->bindValue(':cat', $cat, PDO::PARAM_STR); $stmt->execute(); 

Мне было интересно, безопасен ли этот запрос, а если нет, то что я делаю неправильно. Заранее спасибо!

Я, наконец, получил его (благодаря вашему здравому смыслу):

 if(isset($_GET['country'])){ $arr = $_GET['country']; } else { $arr = array('Albania','Andorra','Austria','Belarus','Belgium','Bosnia & Herzegovina','Bulgaria','Croatia','Czech Republic','Denmark','Estonia','Faroe Islands','Finland','France','Germany','Gibraltar','Great Britain','Greece','Hungary','Iceland','Ireland','Isle of Man','Italy','Latvia','Liechtenstein','Lithuania','Luxembourg','Macedonia','Malta','Moldova','Monaco','Montenegro','Netherlands','Norway','Poland','Portugal','Serbia','Romania','San Marino','Slovakia','Slovenia','Spain','Sweden','Switzerland','Ukraine','United Kingdom'); } if(isset($_GET['category'])){ $cat = $_GET['category']; } else{ $cat = " "; } // create the Prepared Statement $in = str_repeat('?,', count($arr) - 1) . '?'; $sql = "SELECT * FROM MyTable WHERE MyDate >= DATE(NOW()) AND Country IN ($in) AND (Category=? or '' = ?) ORDER BY MyDate ASC"; $stmt = $con->prepare($sql); $arr[] = $cat; // adding category to array $arr[] = $cat; // we need it twice here // finally - execute $stmt->execute($arr); 

Related of "SQL Injection – безопасен ли этот запрос?"

Да, теперь я вижу твою проблему. Ну, PDO не слишком удобна для библиотеки для такой задачи. Итак, прежде всего, я покажу вам, как это можно сделать с моей собственной библиотекой:

 $sql = "SELECT * FROM MyTable WHERE MyDate >= CURDATE() AND (Category=?s or '' = ?s) AND Country IN (?a) ORDER BY MyDate ASC" $data = $db->getAll($sql, $cat, $cat, $_GET['country']); 

Но я вполне понимаю, что вы все так склонны к знакомым методам. Ну, давайте уточним с уродливым PDO

Прежде всего, какова цель? Целью является

  1. для создания запроса, который содержит заполнители для всех данных. Я буду придерживаться позиционных заполнителей, поскольку их легче реализовать.
  2. Чтобы создать массив со всеми переменными, которые должны быть привязаны к заполнителям

Кажется, нам нужны два заполнителя для категории и неизвестное число городов. Хорошо, эта строка создаст строку заполнителей:

 $in = str_repeat('?,', count($arr) - 1) . '?'; 

которые мы собираемся вставить в запрос.

 // $arr is array with all the vars to bind. at the moment it contains cities only $arr = $_GET['country']; // creating string of ?s $in = str_repeat('?,', count($arr) - 1) . '?'; // building query $sql = "SELECT * FROM MyTable WHERE MyDate >= DATE(NOW()) AND Country IN ($in) AND (Category=? or '' = ?) ORDER BY MyDate ASC"; $stm = $db->prepare($sql); $arr[] = $_GET['category']; // adding category to array $arr[] = $_GET['category']; // we need it twice here // finally - execute $stm->execute($arr); $data = $stm->fetchAll(); - // $arr is array with all the vars to bind. at the moment it contains cities only $arr = $_GET['country']; // creating string of ?s $in = str_repeat('?,', count($arr) - 1) . '?'; // building query $sql = "SELECT * FROM MyTable WHERE MyDate >= DATE(NOW()) AND Country IN ($in) AND (Category=? or '' = ?) ORDER BY MyDate ASC"; $stm = $db->prepare($sql); $arr[] = $_GET['category']; // adding category to array $arr[] = $_GET['category']; // we need it twice here // finally - execute $stm->execute($arr); $data = $stm->fetchAll(); 

Нет, код SQL можно было бы ввести в параметр $_GET['country'] . Вы никуда не убегаете.

См. PHP PDO: Можно ли привязать массив к условию IN ()?