Безопасно ли использовать DbCommand.CreateParameter?

#c# #sql-server #sql-injection

#c# #sql-сервер #sql-инъекция

Вопрос:

Я хочу спросить вас, использую ли я этот метод (DbCommand.CreateParameter) в C # для передачи значения моих параметров в мои хранимые процедуры, тогда я снова в безопасности от SQL-инъекции? Или что я могу сделать иначе против SQL-инъекции?

Заранее большое вам спасибо!

Комментарии:

1. Что заставляет вас думать, что это может быть «небезопасно»? И каким образом?

2. Параметры в SQL Server всегда защищены от внедрения SQL, за исключением динамического SQL на стороне сервера.

3. @DanGuzman Параметры в SQL Server почти всегда защищены от SQL-инъекции, я видел код, отправляющий пользовательский ввод в параметрах, отправленных EXEC команде. Учитывая это, использование параметров — это всегда правильный путь, когда речь идет о внедрении sql

4. Большое вам спасибо за ваши ответы. Есть ли какие-либо официальные источники, где это написано? Не то чтобы я вам не верю, но я должен доказать эту информацию для своей компании? Таким образом, это означает, что если я не использую динамически SQL-код, я защищен от SQL-инъекции с параметрами.

5. @GianPaolo, я подробно остановился на этом в своем ответе. Хранимые процедуры сами по себе не предотвращают внедрение, но параметры предотвращают.

Ответ №1:

Объекты параметров SQL Server всегда защищены от внедрения SQL, за исключением динамического SQL на стороне сервера, использующего значения параметров. Это потому, что параметризованные запросы выполняются как RPC-вызов по протоколу TDS. Значения параметров передаются отдельно от инструкции в собственном формате и не анализируются сервером как SQL. Поскольку значения параметров не анализируются как элементы языка SQL, значения не могут быть выполнены, и уязвимость при внедрении SQL отсутствует.

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