экранировать апострофы в вызовах хранимых процедур на основе Linq, когда SP содержит динамический SQL

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

Вопрос

Я заметил следующее:

Разрабатываемый веб-сайт ASP.NET MVC получает ошибку SQL «Незакрытая кавычка...» при вызове LINQ хранимой процедуры, содержащей динамический SQL.

Например:

SP GetEmployees, вызванный с параметром [filter_name], имеющим значение [n'for], выдает эту ошибку

Я могу решить проблему, выполнив .replace("'", "''") следующим образом:

[Function(Name = "dbo.GetEmployees")]
public ISingleResult<EmployeeRow> GetEmployees(
            [Parameter(DbType = "NVarChar(MAX)")] string filter_name)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), filter_name.Replace("'", "''"));
    return ((ISingleResult<EmployeeRow>)(result.ReturnValue));
}

Теперь мне не хочется просматривать все свои SP и делать это вручную.Есть ли способ сделать это общим правилом, которое должно применяться ко всем вызовам Linq SP, которые я совершаю сейчас и буду совершать в будущем?

Кроме того, есть ли что-то еще, чего мне следует избегать, чтобы предотвратить атаки с использованием SQL-инъекций?

РЕДАКТИРОВАТЬ:

Добавлен вопрос:Не вызовет ли это проблемы с SP, которые не включают динамический SQL?Я имею в виду, что когда я добавлю это имя в базу данных, оно будет сохранено как [n''for]?Я только что понял, что это, вероятно, так и будет, и тогда мне все равно придется делать это вручную.

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

Решение 2

Я собираюсь дать здесь (возможный) ответ на свой вопрос.(дайте знать в комментариях, если согласны)

Кажется более правильным, что это должно быть обработано внутри SP.Приложению не нужно беспокоиться о том, содержит ли определенный SP динамический SQL или нет.

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

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

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

Что произойдет, если имя_фильтра содержит \' или --?

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