Pobieranie komunikatu „Wykryto potencjalnie niebezpieczną wartość Request.Path od klienta (&)”


114

Mam problem ze starszym kodem, który wymaga obsługi losowych adresów URL, tak jakby były one żądaniami strony głównej. Niektóre adresy URL zawierają znaki, które generują błąd „Wykryto potencjalnie niebezpieczną wartość Request.Path na kliencie (&)” . Witryna jest napisana w programie ASP.Net MVC 3 (w języku C #) i działa w usługach IIS 7.5.

Oto przykładowy adres URL ...

http://mywebsite.com/Test123/This_&_That

Oto jak mam konfigurację trasy typu catch-all (mam inne trasy do przechwytywania określonych stron) ...

routes.MapRoute(
    "Default", // Route name
    "{garb1}/{garb2}", // URL with parameters
    new { controller = "Website", action = "Home", garb1 = UrlParameter.Optional, garb2 = UrlParameter.Optional } // Parameter defaults
);

Dodałem następujące rzeczy do mojego pliku web.config ...

<configuration>
    <system.web>
        <pages validateRequest="false" />
        <httpRuntime requestValidationMode="2.0" />
    </system.web>
<configuration>

Dodałem również atrybut ValidateInput do akcji, która powinna przechwytywać adresy URL ...

public class WebsiteController : Controller
{
    [ValidateInput(false)]
    public ActionResult Home()
    {
        return View();
    }
}

Ale nadal otrzymuję błąd. Jakieś pomysły, dlaczego? Przegapiłem coś? W tej chwili pracuję tylko na moim lokalnym serwerze deweloperskim (nie próbowałem jeszcze tych poprawek w środowisku produkcyjnym).


1
Jest ustawienie zezwalające na pewne znaki, które sprawdzę wkrótce po powrocie na komputer ...... ale czy możesz zakodować adres URL?
Adam Tuliper - MSFT


Nie wiem, z jakiego powodu witryna wewnętrznie próbowała przekierować, tworząc adres URL, taki jak „ localhost /: // localhost / myWebsiteName ”, który dawał mi ten sam błąd. Nie wiem, dlaczego potok ASP.net uważa to za niebezpieczny adres URL żądania.
RBT

W moim przypadku w adresie URL brakowało ukośnika. Pierwszą rzeczą do zrobienia byłoby sprawdzenie, czy w adresie URL nie ma literówki.
Kishan Vaishnav

Odpowiedzi:


162

Chociaż możesz wypróbować te ustawienia w pliku konfiguracyjnym

<system.web>
    <httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" />
    <pages validateRequest="false" />
</system.web>

Unikałbym używania znaków takich jak „&” w ścieżce adresu URL, zastępując je podkreśleniami.


13
Wygląda na to, że requestPathInvalidCharacters = "" załatwił sprawę. Dzięki. Zdecydowanie zgadzam się, że nie powinieneś używać & na ścieżce, niestety pozwalamy na to od lat, więc musimy nadal to wspierać.
Brian

5
czy nie jest to kwestia bezpieczeństwa?
Marius Stănescu

3
@MariusStanescu - To nie jest z natury kwestia bezpieczeństwa; zależy to od tego, co z nim zrobisz. Jeśli dane wejściowe zostaną pobrane, zastąpione kodami ucieczki i dołączone do danych wyjściowych, wszystko będzie dobrze. Jeśli nie ucieknie, możesz otworzyć się na atak.
Justin Helgerson

2
To rozwiązanie może spowodować następujący błąd: Błąd HTTP 500.19 - wewnętrzny błąd serwera Nie można uzyskać dostępu do żądanej strony, ponieważ powiązane dane konfiguracyjne strony są nieprawidłowe.
Tom Stickel

2
Otrzymałem również błąd 500 podczas używania tej odpowiedzi. Wynikało to z posiadania już tagów <httpRuntime> i <pages>, dlatego wystąpił konflikt duplikacji. Po rozwiązaniu tego, ta odpowiedź również działa dobrze.
Kallum Tanton

5

Spotkałem się z tego typu błędem. wywołać funkcję z brzytwy.

public ActionResult EditorAjax(int id, int? jobId, string type = ""){}

rozwiąż ten problem, zmieniając linię

z

<a href="/ScreeningQuestion/EditorAjax/5&jobId=2&type=additional" /> 

do

<a href="/ScreeningQuestion/EditorAjax/?id=5&jobId=2&type=additional" />

gdzie jest mój route.config

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new string[] { "RPMS.Controllers" } // Parameter defaults
        );

1

Jeśli chcesz zezwolić na tagi HTML tylko dla kilku pól tekstowych w mvc

Możesz zrobić jedną rzecz

w kontrolerze

 [ValidateInput(false)]
public ActionResult CreateNewHtml()  //view
{
    return View();
}
[ValidateInput(false)]
[HttpPost]
public ActionResult CreateNewHtml(cbs obj)//view cbs is database class
{
    repo.AddHtml(obj);
    return View();
}

1
OP wyraźnie mówi o adresach URL, które musi obsługiwać (nie o zawartości pola tekstowego), a także nie ma wzmianki o HTML - więc twoja odpowiedź naprawdę nie dotyczy danego pytania.
Oliver

2
Nie dotyczy to pytania, ale zagłosowałem za, ponieważ jest to coś, o czym nie wiedziałem, że jest opcją. Dzięki @Pavan
MickJuice

0

Ten sam błąd występował w aplikacji Fiddler podczas próby ustalenia, dlaczego nasza przeglądarka map Silverlight ArcGIS nie ładowała mapy. W naszym przypadku była to literówka w adresie URL w kodzie. Z jakiegoś powodu był tam znak równości.
http: = // someurltosome / awesome / place
zamiast
http: // someurltosome / awesome / place

Po usunięciu tego znaku równości działało świetnie (oczywiście).


0

Sprawdź, czy poniższe linie znajdują się w Twoim pliku web.config

<system.web> <httpRuntime requestPathInvalidCharacters="" /> </system.web>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.