Подтвердить что ты не робот

Я невосприимчив к инъекциям SQL, если я использую хранимые процедуры?

Давайте скажем в базе данных MySQL (если это имеет значение).

4b9b3361

Ответ 1

Нет, вы не будете полностью в безопасности. Как отмечали другие, параметризованные запросы всегда идут в путь - независимо от того, как вы обращаетесь к базе данных.

Это небольшая городская легенда, в которой вы прочувствуете безопасность. Я думаю, причина, по которой люди находятся под этим заблуждением, состоит в том, что большинство людей предполагает, что вы вызовете procs с параметризованными запросами из вашего кода. Но если вы этого не сделаете, если, например, вы делаете что-то вроде ниже, вы широко открыты:

SqlCommand cmd = new SqlCommand("exec @myProc " + paramValue, con);
cmd.ExecuteNonQuery();

Потому что вы используете нефильтрованное содержимое от конечного пользователя. Опять же, все, что им нужно сделать, это прекратить линию ( ";" ), добавить их опасные команды, а бум - вы попали.

(В стороне, если вы находитесь в Интернете, не принимайте нефильтрованный мусор из строки запроса браузера, что делает абсурдно легко делать очень плохие вещи для ваших данных.)

Если вы параметризируете запросы, вы находитесь в лучшей форме. Однако, как упомянули другие, если ваш proc по-прежнему создает динамический SQL и его выполнение, все равно могут возникать проблемы.

Я должен отметить, что я не антипрок. Procs может быть очень полезен для решения определенных проблем с доступом к данным. Но procs - это не "решение для серебряных пулей для SQL-инъекций.

Ответ 2

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

Если вы вызываете хранимую процедуру, добавляя аргументы путем конкатенации, я могу добавить случайный запрос в конце одного из полей ввода - например, если у вас есть CALL CheckLogin @username = '$ username', @password = '$ password', с $-показаниями, представляющими непосредственно конкатенированные переменные, ничто не мешает мне изменить переменную $password, чтобы читать "'; DROP DATABASE; -".

Очевидно, что если вы предварительно очищаете ввод, это также способствует предотвращению внедрения SQL, но это может потенциально отфильтровать данные, которые не нужно было очищать.

Ответ 3

Это зависит от ваших хранимых процедур. Если они динамически генерируют SQL на основе их параметров, а затем выполняют этот SQL, то вы по-прежнему уязвимы. В противном случае вы, скорее всего, будете в порядке, но я стесняюсь звучать на 100% уверенно!

Ответ 4

Нету. Если вы создаете SQL, который вызывает хранимую процедуру, вы все еще являетесь целью.

Вы должны создавать параметризованные запросы на стороне клиента.

Ответ 5

Нет, поскольку вы все еще можете использовать D-SQL в своих хранимых процедурах... и в любом случае проверка и ограничение ввода будет хорошей идеей.

Ответ 6

Хранимые процедуры не являются гарантией, поскольку на самом деле уязвим любой динамический код и включает код внутри хранимых процедур и динамически сгенерированные вызовы хранимых процедур.

Параметрированные запросы и хранимые процедуры, вызываемые с параметрами, являются неуязвимыми для инъекций, если они не используют произвольные входы для генерации кода. Обратите внимание, что существует много динамического кода, который также не уязвим для инъекций (например, целочисленные параметры в динамическом коде).

Преимущества в значительной степени (я не уверен, что 100% - это действительно возможно), хранящая архитектуру на основе procs, однако, заключается в том, что инъекцию можно даже защитить от (но не идеально) для динамического кода на стороне клиента,

Разрешения только для EXEC предоставляются любому пользовательскому контексту, к которому подключается приложение, поэтому любые запросы SELECT, INSERT, UPDATE, DELETE просто терпят неудачу. Разумеется, DROP и т.д. Не должны допускаться. Таким образом, любая инъекция должна быть в форме EXEC, поэтому в конечном итоге только операции, которые вы определили в своем SP-слое, будут доступны (не произвольный SQL) для инъекций.

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

Ответ 7

Кроме того, рассмотрите возможность использования мелкозернистого доступа к базе данных (также называемого, как правило, контролем доступа на основе ролей). Основной пользователь вашей базы данных должен иметь именно разрешения, необходимые для выполнения своей работы, и ничего больше. Не нужно создавать новые таблицы после установки? REVOKE это разрешение. У вас нет законной необходимости запускать как sysdba? Тогда не надо! Интенсивная инъекция, инструктирующая пользователя "DROP DATABASE", будет заблокирована, если пользователь не предоставил это разрешение. Тогда все, о чем вам нужно беспокоиться, это операторы SELECT с утечкой данных.