Параметризирани низове и оператор LIKE и заместващ знак

Виждал съм в моите търсения използването на параметризирани низове в SQL заявки, формирани както следва:

SqlCommand comm = new SqlCommand();
comm.CommandText="SELECT * FROM table WHERE field LIKE '%'+@var+'%'";
comm.Parameters.AddWithValue("var","variabletext");
SqlDataReader reader = comm.ExecuteReader();

В този форум обаче беше споменато, че подлежи на инжектиране на sql, въпреки че се използва в параметризиран низ. Мога само да предположа, че свързаните низове заобикалят цялата параметризирана сигурност и просто вмъкват стойността директно като низ. Ако случаят е такъв, как се използват операторите със заместващи знаци в параметризирана заявка, като се избягва инжектирането на sql код?


person steventnorris    schedule 30.10.2012    source източник


Отговори (2)


Това не е уязвимо към SQL инжектиране.

Който и да ти го е казал, греши. '%'+@var+'%' се третира като данни, а не като изпълним код. Той се оценява като низ, след което се използва като модел от дясната страна на LIKE.

Ще имате проблем само ако трябва да EXEC резултата от такова свързване. Простото изпълнение на конкатенация на низ в самата заявка не е проблем.

person Martin Smith    schedule 30.10.2012
comment
-1 Трябва да проверите всички изключения относно проблема с инжектирането на sql. Разгледайте тук: stackoverflow.com/questions/1429866/ - person Rikki; 30.10.2012
comment
@MohammadGoudarzi - Грешите. Тук няма проблем с инжектирането на SQL. OP вече използва параметризирани заявки. Те просто свързват нещо към параметъра. Те не създават изпълним низ чрез конкатенация. - person Martin Smith; 30.10.2012
comment
@MohammadGoudarzi Вярвам, че Мартин е прав. Добавям редакция, за да направя употребата ми по-ясна. - person steventnorris; 30.10.2012
comment
Не знаете начина за изпълнение на споменатия код във въпроса, защото не е посочен. Може да бъде нещо като sp_executesql или exec или може да бъде SqlCommand. Така че мисля, че най-доброто предложение би бил безопасният начин за изпълнение на кода. наздраве - person Rikki; 30.10.2012
comment
@KenWhite - Параметризирано с променлива или параметър. Няма разлика. Никой от тях не би бил проблем. Първоначалният въпрос обаче конкретно споменава parameterized string.. - person Martin Smith; 30.10.2012
comment
@MohammadGoudarzi - специално споменах EXEC в отговора си. - person Martin Smith; 30.10.2012
comment
@MohammadGoudarzi Добавих и метода за изпълнение. (Прочетох във връзка към вашия отговор проблемите с sp_executesql, но няма да го използвам). - person steventnorris; 30.10.2012
comment
Също така проверете връзката, която току-що споменах в публикацията и коментара. Има разлика. - person Rikki; 30.10.2012
comment
Така че @steventnorris го реши с въпроса! :D Наздраве на всички - person Rikki; 30.10.2012
comment
@steventnorris - Да. Ще получите проблем само ако правите тази конкатенация, за да генерирате низ, който след това изпълнявате. Правенето на LIKE '%'+@var+'%'" в самата заявка е добре. - person Martin Smith; 30.10.2012

Трябва да използвате "SqlParameter", за да изпратите стойностите към съхранената процедура, която извършва търсене. Целта на "SqlParameter" е да отхвърли всички неща за инжектиране в стойностите. Освен това, ако трябва да изпълните текст, съдържащ sql код или да свържете параметрите, отново трябва да зададете свойството "CommandType" на командата на "Text" и да използвате "SqlParameter", за да изпратите стойността си към този текст.

Проверете документацията на Microsoft за това тук:

http://msdn.microsoft.com/en-us/library/ff648339.aspx

и още един въпрос относно stackoverflow тук:

Как SQLParameter предотвратява SQL инжектиране?

Разгледайте и тук, за да видите някои конкретни примери:

Примери за SQL инжектиране дори при използване на SQLParameter в .NET?

Актуализация:

Тъй като актуализирахте въпроса и сега начинът на изпълнение е точно посочен, вече няма проблем с инжектирането на sql в кода, който споменахте.

наздраве

person Rikki    schedule 30.10.2012
comment
Вече опитах, човече, заключено е, докато не редактираш отговора. Ще го направя! обещание. ;) Наздраве - person Rikki; 30.10.2012
comment
Първо трябва да редактирате отговора! Не мога да го отменя, заключено е. - person Rikki; 30.10.2012
comment
Направих го. :D винаги C#,,, Наздраве - person Rikki; 30.10.2012