Opened 5 years ago
Closed 11 days ago
#879 closed дефект (готово)
Уязвимость для SQL injection
| Reported by: | san | Owned by: | Denis_N |
|---|---|---|---|
| Priority: | major | Component: | БД изделий АДС |
| Keywords: | Cc: |
Description
Возможно в базе остались уязвимости для SQL injection.
Нужно проинспектировать код и устранить уязвимости
Change History (16)
comment:1 by , 4 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:3 by , 4 years ago
Replying to san:
Однако в таком случае невозможно будет использовать множественные запросы, что, как я понял, подразумевается в #870.
Хотел бы услышать ещё мнения.
Во-первых, предложение #870 по-моему никак не связано с мультизапросами. Предложение #870 решается (в общем случае) четырьмя запросами:
START TRANSACTION; UPDATE `peoducts` SET ....; INSERT INTO `history` .....; COMMIT;
и ничто не мешает выполнять их отдельными вызовами API.
Во-вторых я нигде не видел утверждения о том, что prepared statements не могут использовать мультизапросы (хотя не встречал и утверждений обратного), типа таких:
$mysqli->prepare("UPDATE peoducts SET a=?, b=?; INSERT INTO history(a, b) VALUES(?, ?);")->bind_param("isis", 123, "abc", 456, "def");
comment:4 by , 4 years ago
Во-первых, предложение #870 по-моему никак не связано с мультизапросами. Предложение #870 решается (в общем случае) четырьмя запросами:
О, спасибо за уточнение, на слово транзакция я не обратил внимание.
утверждения о том, что prepared statements не могут использовать мультизапросы
Вот тут:
Использование множества выражений в подготавливаемом запросе не поддерживается.
https://www.php.net/manual/ru/mysqli.quickstart.multiple-statement.php
И, я так понимаю, ничего не помешает внутри транзакции использовать подготовленные запросы и мои опасения, что это помешает #870, не оправдаются.
В таком случае предлагаю использовать в интерфейсе базы только подготовленные запросы, для обеспечения гарантированной защиты от инъекций.
comment:6 by , 3 years ago
| Resolution: | → готово |
|---|---|
| Status: | assigned → closed |
comment:7 by , 3 years ago
| Resolution: | готово |
|---|---|
| Status: | closed → reopened |
Денис вспомнил, что на главной странице подготавливаемые запросы ещё не реализованы.
follow-up: 13 comment:11 by , 21 months ago
Replying to Denis_N:
Также для вставляемой строки для сортировки (order by) сделал отдельную функцию checkStr()
А это так и задумано, что строка
$str2 = substr($checkStr, $substrParam1, $substrParam2);
выполняется всегда, а переменные $substrParam1 и $substrParam2 определены только при некоторых услових?
И еще, простите за любопытство, но раз уж все равно пишу комментарий, спрошу - а зачем в запросе "distinct"? Разве может быть несколько столбцов с одним и тем же именем?
comment:13 by , 21 months ago
Привет, Алесей =)
Спасибо, согласен, не правильно сделал, что "переменные $substrParam1 и $substrParam2 определены только при некоторых условиях". Исправил это в https://trac.adc-line.ru/mc-04/changeset/368/base
А про distinct в запросе - при выводе (без distinct) дублируются столбцы UID, comment. Они есть и в products, и в history
comment:15 by , 11 days ago
Проверено текущее состояние по тикету.
Ранее были выполнены основные правки:
- r99/base: запросы в интерфейсе “Заказы” переведены на подготовленные запросы и транзакции;
- r365/base r367/base: Главная страница переведена на подготовленные запросы;
- r368/base: исправлена ошибка в проверке строки сортировки;
- r371/base: добавлена дополнительная проверка POST[orderHide].
Дополнительно проверил активный код интерфейса базы. Найденные оставшиеся хрупкие места были исправлены:
- в интерфейсе сканера запрос получения сводки по изделиям с тем же наименованием переведён на подготовленный запрос;
- в интерфейсе отгрузки формирование списка серийных номеров для выборки данных заказа переведено на параметризованный IN (?, ...) с bind_param.
После повторной проверки прямой подстановки пользовательского ввода в SQL в активном коде не обнаружено. Оставшиеся динамические SQL-фрагменты либо статические, либо ограничены whitelist, либо используют prepared statements.
Закрываю как исправленное.
comment:16 by , 11 days ago
| Resolution: | → готово |
|---|---|
| Status: | reopened → closed |
![[MC-04 logo]](/mc-04/chrome/site/logo.png)
Для того чтобы навсегда забыть про возможные инъекции, я хотел предложить использовать подготовленные запросы.
Однако в таком случае невозможно будет использовать множественные запросы, что, как я понял, подразумевается в #870.
С другой, стороны множественные вопросы сами по себе повышают риск инъекций, по сравнению с обычными:
Хотел бы услышать ещё мнения.