2013-03-12 18 views
5

Po umieszczeniu w formularzu znaków HTML, takich jak <br />, program ASP.NET generuje wewnętrzny wyjątek 500 zgodnie z opisem here.Kiedy przesyłam znaki HTML w formularzu, dlaczego program ASP.NET generuje błąd serwera wewnętrznego (500)?

A potentially dangerous Request.Form value was detected from the client (Name="<br />").

Ok, więc to mnie chronić od niekodowanej znaków, które mogłyby zostać wykorzystane do złych powodów.

Problem polega na tym, że odpowiedź na to pytanie nie ma miejsca w moich długich poszukiwaniach, to co z tym zrobić:. To znaczy. moja aplikacja nie powinna po prostu wyrzucać ogólny wewnętrzny błąd serwera, gdy użytkownik wprowadza złe znaki (co jeśli narysują strzałkę, taką jak < -).

Co jest lepsze, to po prostu wrócić do strony z błędem ModelState z napisem "Proszę nie używać znaków HTML" lub czymś znaczącym.

Ale jak to osiągnąć? Błąd jest zgłaszany, zanim dojdzie do mojego kodu. Ponadto nie chcę po prostu wyłączać go poprzez validateRequest="false", a następnie trzeba sprawdzić poprawność każdego formularza w mojej aplikacji dla znaków HTML i zwrócić błąd.

Czy istnieje sposób na pozostawienie tego rodzaju sprawdzania poprawności włączonego, ale po prostu obsługuje go inaczej?

Kod dla wyjaśnienia:

Model

Public Class SomeModel 
    Public Property SomeField As String 
End Class 

Controller

<HttpPost> 
Function SomeController(ByVal model As SomeModel) 
    ' model.SomeField contains some HTML characters :O 
    ' but it doesn't matter, since an internal error has occured :(
End Function 
+0

Zaktualizowałem mój problem, aby uwzględnić kod, w kontekście. –

Odpowiedz

2

Jest zdecydowanie możliwe, aby pokazać swoją własną stronę błędu z wszelkimi komunikatami, które uznasz za stosowne.
Do tego celu służą strony customError.

Można skonfigurować te strony błędów, aby były wyświetlane dla odpowiedniego kodu błędu.

<configuration> 
    <system.web> 
     <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" 
        defaultRedirect="GenericError.htm"> 
     <error statusCode="500" redirect="InternalError.aspx"/> 
     </customErrors> 
    </system.web> 
</configuration> 

Displaying a Custom Error Page

Na stronie błędu można wykryć ostatni błąd z Server.GetLastError() i używać go wyświetlić odpowiedni komunikat, jeśli chcesz to przypadek danych html być traktowane inaczej.

+0

Idealnie chciałbym powrócić do tej samej strony (formularza), a nie zupełnie innej strony z ogólnymi "wykrytymi znakami HTML". czy to możliwe? –

+0

'' redirectMode = "ResponseRewrite" 'utrzymuje adres URL taki sam. Jeśli użytkownik miałby przesłać bez wysyłania wadliwych danych, otworzy się właściwa strona. – nunespascal

2

Czy próbowałeś dodając atrybut AllowHtml do majątku swojej viewmodel?

+0

Tak, i to działa, ale ludzie mówią, że musisz sam sprawdzić wszystko. Jeśli jedyną alternatywą jest używanie wszędzie, dlaczego ASP.NET sprawdza wszystko w pierwszej kolejności? Moje główne pytanie brzmi: dlaczego i jaki jest najlepszy (standardowy) sposób rozwiązania tego problemu? –

+1

Rozumiem. Jednak prawdopodobnie nie powinieneś używać atrybutu AllowHtml w każdym miejscu. Tylko we właściwościach, które potencjalnie mogą zawierać HTML. Cóż, jeśli chcesz inaczej obsłużyć błąd, możesz dodać filtr akcji HandleError i określić wyjątek, aby był System.Web.HttpRequestValidationException. To powinno pozwolić ci dostosować sposób obsługi błędu. Jeśli chcesz rzeczywiście zmienić sposób sprawdzania poprawności wewnętrznej, konieczne może być rozszerzenie domyślnego modułu wiążącego modelu. –

0

Aby zezwolić na ograniczone dane wejściowe w modelu, należy użyć właściwości AllowHtmlAttribute we właściwości modelu. To pierwszy krok.

Następnie utwórz własny weryfikator lub użyj funkcji RegularExpressionAttribute w celu sprawdzenia danych wejściowych do specyfikacji.

Lub, jeśli chcesz zezwolić użytkownikowi na wprowadzanie zastrzeżonych znaków, użyj HttpUtility.HtmlEncode do zakodowania wartości.

+0

Idealnie chciałbym powrócić do tej samej strony (formularza) z dodanym modelemState.Error. Ale oznacza to zastosowanie do każdego pola, a następnie użycie sprawdzania poprawności dla każdego pola (tj. Atrybutu sprawdzania poprawności). Co za ból głowy :(Myślę, że nie ma na to szybkiej poprawki –

1

Wygląda na to, że chcesz wyłączyć go globalnie.

Twoja troska o weryfikację każdego pojedynczego wkładu w aplikacji jest mniej problematyczna niż w przypadku zwykłej składni stron WWW i składni stron internetowych. Jedynymi polami aplikacji, które trzeba ręcznie zweryfikować, aby upewnić się, że nie zawierają kodu HTML, byłyby pola wyświetlane jako nieprzetworzony nieprzetworzony tekst.

+0

Zgadzam się Zauważyłem, że wszystko jest bardzo bezpieczne, więc dlaczego ASP.NET rzucił ten błąd na pierwszym miejscu? Spróbuj tego: Przejdź do dowolnej sieci MVC aplikację, którą możesz wymyślić, przejdź do formularza (takiego jak login) i wprowadź
w polu i prześlij. Jeśli pojawi się błąd, to administratorzy sieci nie uwzględnili tego: P –

Powiązane problemy