Альтернатива конкатенации SQL для параметров поиска?

Я начинающий программист, и я унаследовал приложение, разработанное и созданное человеком, который сейчас покинул компанию. Это сделано в PHP и SQL Server 2008R2. В этом приложении есть страница с таблицей, отображающей список элементов, заполненных из базы данных, с некоторыми параметрами фильтров на боковой панели — поиск по идентификатору, ключевому слову, дате и т. Д. Эта таблица заполняется гигантским запросом и фильтры применяются путем объединения их в указанный запрос. Например, если кто-то хотел элемент № 131:

$filterString = "Item.itemID = 131";
$filter = " AND " . $filterString;

SELECT ...
FROM ...
WHERE...
$filter

Фильтр включен в конец URL-адреса страницы поиска. Это не очень хорошо, и я вполне уверен, что в результате есть некоторые уязвимости в SQL-инъекциях, но он чрезвычайно гибок — строка фильтра создается до ее конкатенации и может иметь множество различных условий: Например, $ filterString может быть «условие И условие И условие или условие».

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

Я что-то упускаю?

0

Решение

Используйте 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-инъекций, устраняя необходимость вручную заключать в кавычки параметры.

http://no1.php.net/manual/en/pdo.prepare.php

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]