Безопасны ли хранимые процедуры SQL? - PullRequest
1 голос
/ 21 июня 2009

Они менее уязвимы для SQL-инъекций, чем такие вещи, как mysql_query("SELECT important_data FROM users WHERE password = $password")?

Ответы [ 5 ]

5 голосов
/ 21 июня 2009

Они более безопасны, чем то, что вы делаете. Ваш запрос отправляет необработанный SQL в базу данных, что означает, что ваши параметры не рассматриваются как параметры sql, а как простой старый sql.

Вот что я имею в виду.

При сохраненной процедуре переменная пароля не может быть sql, она должна быть частью информации, которую ищет система. В вашем примере, что на самом деле отправляется в БД:

SELECT * FROM Пользователь, где пароль = ('ваш пароль здесь' - переменная $ Password) ..... так что кто-то может сделать что-то вроде

SELECT * FROM пользователя WHERE Password = («здесь ваш пароль»; SELECT * FROM User - переменная $ password).

или еще хуже:

SELECT * FROM пользователя WHERE Password = ('ваш пароль здесь; DROP Database Database_Name - переменная $ password).

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

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

4 голосов
/ 21 июня 2009

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

2 голосов
/ 21 июня 2009

Пока вы используете параметры и не используете конкатенацию строк для введенных пользователем значений, риска внедрения SQL-кода не будет. Хранимые процедуры немного «безопаснее» в этом аспекте, потому что они побуждают вас использовать параметры. Но если в процедуре вы делаете что-то вроде

EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password

Тогда вы вернетесь к квадрату 1 и будете очень уязвимы для SQL-инъекций.

Также существует такая вещь, как «подготовленные операторы», которые не являются хранимыми процедурами, но могут также использовать параметры. Таким образом, они также могут использоваться, чтобы избежать внедрения SQL.

0 голосов
/ 21 июня 2009

, если они параметризованы правильно, и вы не выполняете динамический sql, тогда они более безопасны, и вы также выиграете от повторного использования плана выполнения

0 голосов
/ 21 июня 2009

Безопасных технологий нет. Технологии могут использоваться только безопасным или небезопасным образом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...