Использование SqlParameters
- рекомендуемый метод предотвращения SQL-инъекций в запросах базы данных. Где я могу найти код/функцию, которая внутренне санирует эти параметры? Я хотел бы повторно использовать эту функцию в моей собственной реализации. Я попытался найти его с помощью Reflector, но не увенчался успехом.
Как SqlCommand дезинфицирует параметры?
Ответ 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, чтобы он не нарушил запрос. Верный?
Нет, это неверно. Переменная создается непосредственно из блока данных, и поэтому не требуется специального экранирования или кодирования.