Как SqlCommand дезинфицирует параметры?

Использование SqlParameters - рекомендуемый метод предотвращения SQL-инъекций в запросах базы данных. Где я могу найти код/​​функцию, которая внутренне санирует эти параметры? Я хотел бы повторно использовать эту функцию в моей собственной реализации. Я попытался найти его с помощью Reflector, но не увенчался успехом.

Ответ 1

Он защищает от SQL Injection, а не XSS, а не существует кода или функции, которая санирует данные параметров.

Защита осуществляется путем передачи значений параметров на сервер отдельно от строки запроса, так что значения никогда не будут заменяться непосредственно в инструкции sql.

Поэтому вместо sql-сервера работает что-то вроде этого:

SELECT * FROM [table] WHERE [column] = ParameterValue

Это похоже на то, что он запускал что-то вроде этого:

DECLARE @ParamValue int
  -- //@ParamValue variable is populated from the framework in a safe way
SELECT * FROM [table] WHERE [column] = @ParamValue

Это быстрее и безопаснее и надежнее, чем функция, которая должна была бы оценивать данные параметров. Такая функция должна быть очень сложной (читай: ошибка), чтобы обрабатывать такие вещи, как пользовательские escape-символы и будущие улучшения.

Эта аккуратная сторона ставит всю проблему: данные - это данные, код - код, и никогда не будет встречаться два.


Ваш комментарий к другому, теперь удален, ответьте:

Если я передам значение O'Rourke, он кодирует его как O''Rourke, чтобы он не нарушил запрос. Верный?

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