[SendIt 2.5.0] Дополнительная защита от SQL-инъекций
Приветствую! Если коротко, то с версии 2.5.0 компонент принудительно прогоняет все поступающие с фронта данные через паттерн для очистки о возможных SQL-инъекций. Чуть подробнее под катом
В целом, я надеюсь что вы используете для формирования запросов к базе данных методы класса xPDOQuery. Предполагается, что там уже есть защита от SQL-инъекций, но безопасности не бывает много. В связи с этим я добавил класс Sanitazer с одним единственным методом process для обработки данных.
Паттерн по которому происходит фильтрация выглядит так
Входе испытаний было выявлено, что данный паттерн портит адреса электронной почты, поэтому значения похожие на них были исключены из проверки следующим образом
Спасибо за внимание!
В целом, я надеюсь что вы используете для формирования запросов к базе данных методы класса xPDOQuery. Предполагается, что там уже есть защита от SQL-инъекций, но безопасности не бывает много. В связи с этим я добавил класс Sanitazer с одним единственным методом process для обработки данных.
Паттерн по которому происходит фильтрация выглядит так
private const DANGEROUS_PATTERNS = [
'/\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|EXEC|EXECUTE|TRUNCATE|ALTER|CREATE|SHOW|DESCRIBE|GRANT|REVOKE|COMMIT|ROLLBACK|MERGE|CALL)\b/i',
'/;.*--/',
'/\/\*.*\*\//',
'/--\s+/',
'/#.*$/',
'/WAITFOR\s+DELAY/i',
'/XP_/i',
'/sp_/i',
'/@@/',
'/@\w+/',
'/CHAR\(\d+\)/',
'/0x[0-9A-Fa-f]+/',
'/BENCHMARK\(/i',
'/SLEEP\(/i',
'/LOAD_FILE\(/i',
'/INTO\s+(OUTFILE|DUMPFILE)/i',
'/CONCAT_WS\(/i',
'/GROUP_CONCAT\(/i',
'/INFORMATION_SCHEMA/i',
'/sys\./i',
'/pg_/i'
];Придумал его Deepseek, так что все претензии к нему)))Входе испытаний было выявлено, что данный паттерн портит адреса электронной почты, поэтому значения похожие на них были исключены из проверки следующим образом
if(preg_match(self::EMAIL_REGEXP, $input)){
return $input;
}И конечно же, чтобы вы, дорогие коллеги, могли творить любую дичь, было добавлено событие senditOnSetValue, в котором можно оставить исходное значение или сделать дополнительные проверки, или исключить отдельные поля из проверки.Спасибо за внимание!
Комментарии: 5
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Вроде не уязвимо :-). Почти все через pdoFetch идет. Только иногда использую сложное условие вроде (id IN (2,3) and (parent = 4 or parent IS NULL)) в where. Тогда… хм. проверю :-).
Код для проверки:
На запрос gettables.ru/test.html?id=4+OR+1 выдало:
Выдало все id страниц. То есть
Уязвимо для инъекций. Будем знать.