Когда безопасно использовать непараметризованные переменные в командах SQL?

StackOverflow https://stackoverflow.com/questions/929873

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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

Решение

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

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

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

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

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

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

';DROP DATABASE xxx;--

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

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