Когда безопасно использовать непараметрические переменные в командах SQL? - PullRequest
4 голосов
/ 30 мая 2009

Я пишу запрос на выборку в методе C #, который позволяет клиентскому коду предоставлять идентификатор строки и возвращать объект, созданный из данных строки. Если идентификатор строки является целым числом, и я подтвердил, что оно положительное, есть ли какой-то вред, просто передавая его с помощью string.Format? Я не понимаю, как можно было бы нанести какой-либо ущерб, если бы им было разрешено передавать только int, а не строку.

Ответы [ 2 ]

12 голосов
/ 30 мая 2009

Вы правы, было бы безопасно передать таким образом целое число. Однако есть и другая сторона истории.

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

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

Даже если вы не заботитесь о выигрыше в производительности, я бы все равно использовал параметризованный запрос для всех запросов к базе данных, даже для тех, которые можно считать «безопасными», как вы указали, - просто чтобы быть последовательными в способ, которым приложение обращается к данным. Если вы всегда используете параметризованный запрос, это также избавит вас от необходимости определять, является ли запрос каждый раз безопасным, чтобы решить, каким способом запрашивать базу данных.

1 голос
/ 30 мая 2009

Вы отвечаете на свой вопрос здесь. System.Int32 не может содержать

';DROP DATABASE xxx;--

Если это то, что тебя беспокоит. Даже передача отрицательного целого числа не окажет негативного влияния на вашу базу данных!

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