2013-10-15 3 views
2

Я пишу небольшую вспомогательную библиотеку, которая создает некоторый SQL и выполняет это в отношении базы данных SQL Server.Каковы все символы, которые следует избегать из строки, чтобы избежать атак SQL-инъекций в SQL Server?

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

Каковы все символы, с которыми я должен убежать, прежде чем помещать эту строку в запрос и выполнять ее?

Я знаю, что одна цитата ' является обязательной, но мне нужно заботиться о чем-то еще?

Вот некоторые примеры кода:

var condition = new Condition(); 
var table = new PersonTable(); 
condition.Add(table.Name.IsEqualTo("John's")); 

это будет преобразовано в

WHERE [dbo].[Person].[Name] = N'John''s' 

Как вы атакуете, что если я принимать только string в IsEqualTo метод и уйти от одного ' с ''?

Насколько я знаю, SQL Server принимает только ' для разделителя строк.

+8

Почему наилучший подход «не вариант»? –

+2

Чтобы ответить на этот вопрос и помочь вам решить вашу проблему, нам нужно знать, почему вы не можете использовать параметризованные запросы, чтобы мы могли быть уверены, что помогаем вам исправить вашу проблему, не вызывая больше. –

+0

Это потому, что у нас есть требование хранить/регистрировать запрос «как есть», и нам не разрешено использовать какие-либо «неясные» вещи, которые скроют фактическое значение параметров вместо varbinary/image/и очень «большого» «те, которые занимают слишком много места для регистрации. –

ответ

9

Каждый символ в любом известном наборе символов.

Теперь используйте проверенные и принятые методы.

+2

«Маленькие столы Бобби» согласны! http://bobby-tables.com/img/xkcd.png – granadaCoder

+1

Маленькие таблицы Бобби должны использовать параметры. –

+0

Пожалуйста, будьте добры, чтобы снова прочитать вопрос. В нем есть некоторые дополнительные разъяснения. –

-3

Вы должны избежать следующие символы:

'-' because of '--' (comment) 
'=' because of 1=1 
'>' or '<' because of 1>0 
'%' because of Like '%%' 
char(39) because of it is equivalent to ' 
'"' because it can use in delimiters 
'[',']' because it can use in delimiters 
+0

Каков источник этого ответа? если это MSDN или какой-либо другой сайт, было бы полезно иметь ссылку на этот сайт, а на всякий случай там больше информации. –

+1

Странный список. Почему вы рекомендуете избегать '=', но не ';'? Фактически AFAIK '' '* является * единственным обязательным для значений, вставленных в середину цитированного строкового литерала, но я не хотел бы полагаться на правильность. –

+2

После вашего редактирования, почему '1 = 1' будет проблемой, но' 1> 0' OK? Также, что касается полностью законного использования '=' в запросах. Например, поиск строки, содержащей '='? –

Смежные вопросы