Я начинающий программист, и я унаследовал приложение, разработанное и созданное человеком, который сейчас покинул компанию. Это сделано в PHP и SQL Server 2008R2. В этом приложении есть страница с таблицей, отображающей список элементов, заполненных из базы данных, с некоторыми параметрами фильтров на боковой панели — поиск по идентификатору, ключевому слову, дате и т. Д. Эта таблица заполняется гигантским запросом и фильтры применяются путем объединения их в указанный запрос. Например, если кто-то хотел элемент № 131:
$filterString = "Item.itemID = 131";
$filter = " AND " . $filterString;
SELECT ...
FROM ...
WHERE...
$filter
Фильтр включен в конец URL-адреса страницы поиска. Это не очень хорошо, и я вполне уверен, что в результате есть некоторые уязвимости в SQL-инъекциях, но он чрезвычайно гибок — строка фильтра создается до ее конкатенации и может иметь множество различных условий: Например, $ filterString может быть «условие И условие И условие или условие».
Я изучал хранимые процедуры, как лучший способ противостоять проблеме SQL-инъекций, но мне не повезло, когда я решал, как воспроизвести этот уровень гибкости. Я не знаю заранее, какой из фильтров (если есть) будет выбран.
Я что-то упускаю?
Используйте Mysqli или PDO, которые поддерживают подготовленные / параметризованные запросы для борьбы с внедрением SQL. В PDO это может выглядеть примерно так
$conditions = '';
$params = array();
if(isset($form->age)) {
$conditions .= ' AND user.age > ?'
$params[] = $form->age;
}
if(isset($form->brand)) {
$conditions .= ' AND car.brand = ?'
$params[] = $form->brand;
}
$sql = "SELECT ...
FROM ...
LEFT ...
WHERE $conditions
";
$sth = $dbh->prepare($sql);
$sth->execute($params);
$result = $sth->fetchAll();
Из руководства:
Вызов PDO :: prepare () и PDOStatement :: execute () для операторов, которые будут выполняться несколько раз с разными значениями параметров, оптимизирует производительность вашего приложения, позволяя драйверу согласовывать кэширование на стороне клиента и / или сервера плана запроса и метаинформации и помогает предотвратить атаки с использованием SQL-инъекций, устраняя необходимость вручную заключать в кавычки параметры.
Других решений пока нет …