Функция поиска не работает должным образом - PullRequest
2 голосов
/ 26 декабря 2011

У меня есть функция, которая вызывается с параметром "name", теперь она работает нормально ... пока я не выполню поиск с '' в ней .. поэтому я отправляю это как имя

Plastic & Foam 3'X5' XLT

Когда я отправляю, он возвращается пустым на веб-сайте (без ошибок), но если я отправляю jusr Plastic & Foam, он работает нормально, он возвращается нормально.Теперь в части SQL я получаю это, когда я отправляю запрос через Management Studio, как это

exec sp_productSearch 'Plastic & Foam 3''X5'' XLT'

SELECT Name FROM PProducts WHERE NAME LIKE '%Plastic & Foam 3'X5' XLT'
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'X5'.

В C # я отправляю текстовый список это

Server.HtmlEncode(txtproductname.Text.Trim().Replace("'", "''"))

Любые идеи, что я могуделать что-то не так?

PS: Хранимая процедура проста, что-то вроде этого

Select Name from PProducts Where NAME LIKE '%' + @NAME  + '%' ;   

Спасибо.

Ответы [ 3 ]

3 голосов
/ 26 декабря 2011

Вы передаете ' символов "raw" на запрос в SQL?Вы столкнулись с проблемой под названием SQL-инъекция .

. Пожалуйста, найдите решение для безопасной передачи данных на ваш SQL-сервер.Для C # вы должны проверить например.этот вопрос для более близких советов.

1 голос
/ 26 декабря 2011

РЕДАКТИРОВАНИЕ

Эта последняя часть ваших вопросов немного страшна

Select Name from PProducts Where NAME LIKE ''%' + @NAME  + '%'''

Мне было интересно, почему вы используете так много кавычек, и вы можете выполнитьSQL через конкатенацию строк:

EXEC 'Select Name from PProducts Where NAME LIKE ''%' + @NAME  + '%'''

Если дело обстоит именно так, то быстрый / грязный способ решить его - дважды убрать кавычки, что означает что-то вроде:

EXEC sp_productSearch 'Plastic & Foam 3''''X5'''' XLT'

Этот оператор долженбез проблем запускается , но это действительно плохой способ выполнить SQL-запрос с пользовательским вводом .Другие ответы уже охватывают это.

С другой стороны, & становится & при вызове Html Encode в соответствии с этой страницы , так что будьте осторожны с этим тоже.

1 голос
/ 26 декабря 2011

Похоже, у вас уже есть параметр с именем @NAME

Итак, ваша хранимая процедура просто должна сделать

SELECT Name
FROM   PProducts
WHERE  NAME LIKE '%' + @NAME + '%' 

Или, что лучше, чтобы она возвращала правильные результаты в событиичто любое из названий вашего продукта содержит символы шаблона, такие как %, вообще не используют LIKE и используют

SELECT Name
FROM   PProducts
WHERE  CHARINDEX(@NAME,NAME) > 0

Или, что еще лучше, используйте полнотекстовый поиск

IПредположим, что вы строите строку запроса внутри хранимой процедуры, а затем выполняете ее.Это необязательно в зависимости от того, что вы уже опубликовали, и это риск внедрения SQL.

Также не экранируйте значение txtproductname.Text вручную.Передайте его как есть, используя параметры.

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