У клієнта було виявлено потенційно небезпечне значення Request.Path (*)


218

Я отримую досить пояснювальну помилку:

У клієнта (*) було виявлено потенційно небезпечне значення Request.Path.

Проблема пов’язана з *URL-адресою запиту:

https://stackoverflow.com/Search/test*/0/1/10/1

Цей URL використовується для заповнення сторінки пошуку, де "test *" - пошуковий термін, а решта URL-адреси стосується різних інших фільтрів.

Чи є простий спосіб дозволити ці спеціальні символи в URL? Я спробував змінити web.configбезрезультатно.

Чи слід вручну кодувати / декодувати спеціальні символи? Або є найкраща практика для цього, я хотів би уникати використання рядків запитів. - але це може бути варіант.

Сама програма - це c# asp.netпрограма для веб-форм, яка використовує маршрутизацію для створення приємної URL-адреси вище.


1
Чи має ваша сторінка ValidateRequest=falseвгорі?
Ніл Найт

Я не знаю, з якої причини веб-сайт намагався перенаправити, який створював URL-адресу на зразок " localhost /: // localhost / myWebsiteName ", яка давала мені ту саму помилку. Я не знаю, чому трубопровід ASP.net вважає це небезпечною URL-адресою запиту.
RBT

Відповіді:


97

*Символ не допускаються в шляху URL, але немає ніяких проблем використовувати його в рядку запиту:

http://localhost:3286/Search/?q=test*

Це не проблема кодування, *символ не має особливого значення в URL-адресі, тому не має значення, кодуєте ви його чи ні. Вам потрібно буде кодувати його за іншою схемою, а потім розшифрувати.

Наприклад, використовуючи довільний символ як символ втечі:

query = query.Replace("x", "xxx").Replace("y", "xxy").Replace("*", "xyy");

І розшифровка:

query = query.Replace("xyy", "*").Replace("xxy", "y").Replace("xxx", "x");

15
Гра "xxx" "xxy" "xyy" досить розумна. Можливо, ви хочете детальніше розібратися в логіці, щоб не бентежити читачів.
SimpleVar

2
Запит полягав у тому, щоб використовувати його в рядку запитів, PATHа не в ньому.
Гюго Делсінг

Я зіткнувся з тим же сценарієм, де одним із моїх параметрів була URL-адреса. Навіть коли правильно закодована URL-адреса, я отримаю цю помилку. Нарешті я просто base64 зашифрував параметр (і розшифрував у моєму api), що було набагато простіше, ніж намагатися з'ясувати, що відбувається. Можливо, кращий вибір, щоб реалізація власної замінила також рутину.
SpokaneDJ

1
Ви не можете використовувати aa<=> aі ab<=> *як більш просту схему кодування?
Слова, як Джаред

Наразі це врятувало мене, дякую, але вчасно я хочу перевірити цю пораду: stackoverflow.com/a/603962/1830909, і я буду галявити, якщо почую вашу думку.
QMaster

316

Якщо ви використовуєте .NET 4.0, ви повинні мати можливість дозволити ці URL-адреси через web.config

<system.web>
    <httpRuntime 
            requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" />
</system.web>

Зауважте, щойно я видалив зірочку (*), початковий рядок за замовчуванням:

<httpRuntime 
          requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />

Дивіться це питання для більш детальної інформації.


5
Будь-який спосіб зробити це за допомогою атрибута mvc для дії, тому мені не доведеться вимикати це для всього додатка? Подібно до цього відповідь тут: stackoverflow.com/a/1540976/298758
Longda

4
@longda: Можливо, спробуйте обгорнути його елементом <location path = "my / path"> для потрібного URL-адреси. Використовувати рефлексію було б досить просто з глобальної точки зору, але я не впевнений у встановленні цього на основі контролера / дії. Може, почати питання?
Дейв Трансом

Це просто не працює над проектом MVC ASP.net, отримавши процес запуску для визначення макета у viewStart, отримала цю помилку: Незаконне значення в шляху.
QMaster

7

Для мене я працюю. викликати цю проблему.

<system.web>
     <httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
     <pages  >
      <namespaces>
     ....
 </namespaces>
    </pages> 
  </system.web>

** Зауважте, що це не є хорошою практикою, може бути повідомлення з цим параметром, оскільки атрибут об'єкта краще або спробувати кодувати спеціальний символ. - Після пошуку найкращої практики для проектування відпочинку api, я виявив, що в пошуку, сортуванні та пагінації ми повинні обробити такий параметр запиту, як цей

/companies?search=Digital%26Mckinsey

і це вирішить проблему, коли ми кодуємо & та замінимо її на URL на% 26 будь-яким чином, на сервері ми отримаємо правильний параметр Digital & Mckinsey

це посилання може допомогти з найкращої практики розробки веб-програм api https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9


6

Ви повинні кодувати значення маршруту, а потім (якщо потрібно) декодувати це значення перед пошуком.


Дякую за Вашу відповідь. Ви маєте на увазі, що Effectivley робить заміну на такі елементи, як *, а потім замінює їх назад, коли ви читаєте його?

Чи можете ви показати приклад коду кодування та декодування значень?
Ciaran Gallagher

1

Для мене під час введення URL-адреса користувач випадково використовував a / замість a? для запуску параметрів запиту

наприклад:

url.com/endpoint/parameter=SomeValue&otherparameter=Abody+value

яка мала бути:

url.com/endpoint?parameter=SomeValue&otherparameter=Abody+value


Так, навіть для мене url.com/endpoint¶meter=SomeValue&otherparameter=AgetherValue
Bhargav Konda

0

Цей виняток стався в моїй заяві і був досить оманливим.

Він був кинутий, коли я викликав веб-метод сторінки .aspx за допомогою виклику методу ajax, передаючи об'єкт масиву JSON. Підпис методу Веб-сторінки містив масив сильно набраного об’єкта .NET, OrderDetails. Властивість Actual_Qty було визначено як int, а об'єкт JSON Actual_Qty містив "4" (символ додаткового простору). Після вилучення додаткового місця перетворення стало можливим, метод веб-сторінки успішно досягнуто викликом ajax.


0

Спробуйте встановити власність сервера веб-проекту як Local IIS, якщо це IIS Express. Переконайтесь, що URL-адреса проекту правильна та створіть вірусний каталог.


0

При роботі з Уніфікованим локатором ресурсів (URL-адресами) існують певні стандарти синтаксису , в цій конкретній ситуації ми маємо справу з зарезервованими символами. .

Що стосується RFC 3986 , Зарезервовані символи можуть (або не можуть) бути визначені як роздільники за загальним синтаксисом, кожним синтаксисом, специфічним для схеми, або синтаксисом, орієнтованим на реалізацію алгоритму перенаправлення URI; А зірочка (*) - Зарезервований персонаж.

Найкраща практика - використання символів без резерву в URL-адресах або спробувати їх кодувати.

Продовжуйте копати:


1
Ця помилка також виникає, якщо зарезервований символ у URL-адресі кодується у відсотках, наприклад, %25замість цього %, тому IIS може повернути цю помилку для цілком дійсної URL-адреси.
Флоріан Зима
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.