Opened 3 years ago

Last modified 15 months ago

#879 reopened дефект

Уязвимость для SQL injection

Reported by: san Owned by: Denis_N
Priority: major Component: БД изделий АДС
Keywords: Cc:

Description

Возможно в базе остались уязвимости для SQL injection.
Нужно проинспектировать код и устранить уязвимости

Change History (8)

comment:1 by san, 18 months ago

Owner: changed from san to Denis_N
Status: newassigned

comment:2 by san, 17 months ago

Для того чтобы навсегда забыть про возможные инъекции, я хотел предложить использовать подготовленные запросы.
Однако в таком случае невозможно будет использовать множественные запросы, что, как я понял, подразумевается в #870.
С другой, стороны множественные вопросы сами по себе повышают риск инъекций, по сравнению с обычными:

Рассмотрение аспектов безопасности
Функции API mysqli::query() и mysqli::real_query() во время работы не устанавливают на сервере специальный флаг, необходимый для выполнения мультизапросов. Отдельная API-функция для мультизапросов позволяет снизить вероятность случайных SQL-инъекций. Злоумышленник может попытаться добавить в конец запроса выражения, вроде ; DROP DATABASE mysql или ; SELECT SLEEP(999). Если ему это удастся, но не будет использоваться функция mysqli::multi_query, сервер не выполнит внедрённое и опасное SQL-выражение.

Хотел бы услышать ещё мнения.

Last edited 17 months ago by san (previous) (diff)

in reply to:  2 comment:3 by alx, 17 months 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 san, 17 months ago

Во-первых, предложение #870 по-моему никак не связано с мультизапросами. Предложение #870 решается (в общем случае) четырьмя запросами:

О, спасибо за уточнение, на слово транзакция я не обратил внимание.

утверждения о том, что prepared statements не могут использовать мультизапросы

Вот тут:

Использование множества выражений в подготавливаемом запросе не поддерживается.

https://www.php.net/manual/ru/mysqli.quickstart.multiple-statement.php

И, я так понимаю, ничего не помешает внутри транзакции использовать подготовленные запросы и мои опасения, что это помешает #870, не оправдаются.
В таком случае предлагаю использовать в интерфейсе базы только подготовленные запросы, для обеспечения гарантированной защиты от инъекций.

Last edited 17 months ago by san (previous) (diff)

comment:5 by Denis_N, 15 months ago

Сделано и закончено в r99/base

comment:6 by Denis_N, 15 months ago

Resolution: готово
Status: assignedclosed

comment:7 by san, 15 months ago

Resolution: готово
Status: closedreopened

Денис вспомнил, что на главной странице подготавливаемые запросы ещё не реализованы.

comment:8 by san, 15 months ago

milestone: 1 очередь

Milestone deleted

Note: See TracTickets for help on using tickets.