2016-01-07 5 views
-1

Я использую свободный NHibernate. При фильтрации данных, таких как «Суп & Caesar», т.е. для строки, включая знак «амперсанд», выдает ошибку: - Unterminated string начинается с 12. Я попытался провести исследование в нем и обнаружил, что файл ODataExpression.cs использует ниже код для фильтра из-за который он забросил.OData Символ амперсанда выражения для ошибки фильтра фильтра

private void ParseQueryString(string queryString) 
    { 
     if (queryString.Length == 0) 
      return; 

     var queryElements = queryString.Split('&'); 

     for (int i = 0; i < queryElements.Length; i++) 
     { 
      string[] elementParts = queryElements[i].Split(new[] { '=' }, 2); 

      string key = HttpUtil.UriDecode(elementParts[0]); 
      string value = elementParts.Length == 2 ? HttpUtil.UriDecode(elementParts[1]) : ""; 

      ProcessQueryStringPart(key, value); 
     } 
    } 

Я хотел знать, есть ли способ избежать этого. Проверка текстового поля не будет подходящим решением для меня, поскольку я ушел далеко в свой проект, и изменение все будет проблематично.

Обратите внимание: я использую EXTJS, который отправляет данные в закодированной форме, поэтому имеет что-то позади кода.

Спасибо.

+0

, когда строковый литерал 'Soup & Caesar' входит как часть строки запроса http, тогда он должен быть скрытым с помощью url, потому что то, что делает вышеуказанная функция, - это токенизация http query string, где & является разделителем. Как выглядит ваша полная строка запроса? Кроме того, я думаю, что данные из текстового поля лучше были POSTED, а не GETted, поэтому вы будете читать его из коллекции форм ASP.NET, а не строки запроса. (текущий сценарий похож на классическую уязвимость атаки в sql-инъекции). – dlatikay

+0

ExtJS не отправляет автоматически все данные в кодированной форме. Пожалуйста, разместите соответствующие клиентские части своего кода. – Alexander

ответ

1

Обязательно UriEncode свой QueryString, прежде чем он будет представлен, так что это будет выглядеть примерно так:

http://www.example.com?text=Soup%20%26%20Caesar 

Рассмотрим с помощью POST и чтение содержимого текстового поля из коллекции Request.Form ASP.NET, чтобы преодолеть возможно другое последствия (ограничения длины, разрывы строк)

+0

Это не работает. Я использую EXTJS, которые уже отправляют данные в закодированной форме. –

+0

Вы можете проверить фактическую строку запроса в отладчике, чтобы подтвердить, что она правильно закодирована в uri? части кода на стороне клиента и значения времени выполнения также будут полезны. Вы звоните в Ext.Ajax.Request? если это так, кодирование не выполняется автоматически, попробуйте Ext.urlEncode ({text: 'Soup & Caesar'}) – dlatikay

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