asp:QueryStringParameter и пустой параметр строки запроса

У меня есть asp:GridView отображение клиентских запросов с помощью asp:SqlDataSource. Я хочу ограничить отображаемую информацию клиентом:

View.aspx должен отображать все, View.aspx?client=1 должен отображать только запросы от клиента с идентификатором #1.

Поэтому я использую <asp:QueryStringParameter Name="client" QueryStringField="client" /> для запроса "EXEC getRequests @client".

Все работает корректно, когда указан какой-то клиент. Но не надо - если нет.

Я протестировал свой SP с помощью SSMS - он работает правильно в обоих случаях - когда параметр указан и когда он не указан (NULL передается явно).

Что я сделал?


person abatishchev    schedule 21.04.2010    source источник
comment
Похоже, при таком подходе вы открываете себя для довольно серьезных векторов атак с помощью SQL-инъекций.   -  person womp    schedule 22.04.2010
comment
@womp: Как я открываюсь? QueryStringParameter добавляется в код программной части только для пользователей с соответствующими правами и после ряда проверок.   -  person abatishchev    schedule 22.04.2010
comment
Ах, если вы его дезинфицируете, тогда все в порядке. Из вашего вопроса это выглядело так, как будто вы использовали его напрямую.   -  person womp    schedule 22.04.2010
comment
@womp: я беру только идентификатор клиента (int) и передаю его в SP. Я уверен, что это безопасно. Я не делаю таких глупостей, как "SELECT ... WHERE ID=" + Request["client"] :)   -  person abatishchev    schedule 22.04.2010


Ответы (2)


SqlDataSource не сработает, если какой-либо из его параметров имеет значение null, если вы не укажете иное:

<asp:SqlDataSource CancelSelectOnNullParameter="False" />

Также может потребоваться добавить нулевое значение по умолчанию в параметр строки запроса:

<asp:QueryStringParameter Name="client" QueryStringField="client" DefaultValue="" ConvertEmptyStringToNull="True" />
person richeym    schedule 21.04.2010
comment
Большое спасибо! Первый вариант делает то, что мне нужно. - person abatishchev; 22.04.2010
comment
Это действительно неудобное значение по умолчанию (т. е. оно должно срабатывать с параметрами NULL по умолчанию). Я почти уверен, что параметры NULL для указания «всего» очень распространены. - person Ryan; 06.08.2014

Вам необходимо определить значение по умолчанию для параметра для таких ситуаций, например:

<asp:QueryStringParameter Name="client" QueryStringField="client" DefaultValue="0"/>

а затем в SP вам нужно проверить, является ли клиент 0, вернуть всех клиентов, иначе конкретный.

person Tony    schedule 21.04.2010
comment
Можно ли установить значение по умолчанию NULL (DBNull.Value)? - person abatishchev; 22.04.2010
comment
Хм я так не думаю. Но есть ли смысл использовать NULL вместо 0, -1 или чего-то еще? - person Tony; 22.04.2010
comment
Для NULL легко использовать встроенную функцию SQL ISNULL(,). Такие значения, как 0 или -1, требовали дополнительной инструкции CASE-WHEN-THEN в запросе. - person abatishchev; 22.04.2010
comment
С этим URL-адресом View.aspx?client= я думаю, что параметр автоматически преобразуется в нуль, потому что он пуст. Попробуйте это и оставьте отзыв, - person Tony; 22.04.2010
comment
Спасибо за ваше участие! :) Проблема решена. Смотри ниже - person abatishchev; 22.04.2010