Вопрос

Являются ли они менее уязвимыми для внедрения SQL, чем такие вещи, как mysql_query (" ВЫБРАТЬ важные_данные от пользователей, ГДЕ пароль = $ пароль ") ?

Это было полезно?

Решение

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

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

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

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

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

или еще хуже:

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top