Za każdym razem, gdy użytkownik publikuje coś w mojej aplikacji internetowej <
lub >
na stronie, pojawia się ten wyjątek.
Nie chcę wchodzić w dyskusję na temat mądrości zgłaszania wyjątku lub zawieszania całej aplikacji internetowej, ponieważ ktoś wpisał znak w polu tekstowym, ale szukam eleganckiego sposobu, aby sobie z tym poradzić.
Przechwytywanie wyjątku i wyświetlanie
Wystąpił błąd, wróć i ponownie wpisz cały formularz, ale tym razem nie używaj <
nie wydaje mi się wystarczająco profesjonalny.
Wyłączenie post validation ( validateRequest="false"
) z pewnością pozwoli uniknąć tego błędu, ale pozostawi stronę podatną na wiele ataków.
Idealnie: gdy wystąpi zwrotny zwrot zawierający znaki HTML, ta zaksięgowana wartość w kolekcji Form zostanie automatycznie zakodowana w HTML. Tak więc .Text
właściwość mojego pola tekstowego będziesomething & lt; html & gt;
Czy mogę to zrobić w programie obsługi?
<httpRuntime requestValidationMode="2.0" />
do web.configOdpowiedzi:
Myślę, że atakujesz go pod niewłaściwym kątem, próbując zakodować wszystkie opublikowane dane.
Pamiętaj, że „
<
” może również pochodzić z innych zewnętrznych źródeł, takich jak pole bazy danych, konfiguracja, plik, kanał i tak dalej.Ponadto „
<
” nie jest z natury niebezpieczne. Jest to niebezpieczne tylko w określonym kontekście: podczas pisania ciągów, które nie zostały zakodowane na wyjściu HTML (z powodu XSS).W innych kontekstach różne podciągi są niebezpieczne, na przykład, jeśli wpiszesz podany przez użytkownika adres URL w podlinkowaniu, podciąg „
javascript:
” może być niebezpieczny. Z drugiej strony pojedynczy znak cudzysłowu jest niebezpieczny podczas interpolacji ciągów w zapytaniach SQL, ale jest całkowicie bezpieczny, jeśli jest częścią nazwy przesłanej z formularza lub odczytanej z pola bazy danych.Najważniejsze jest to: nie można filtrować losowych danych wejściowych pod kątem niebezpiecznych znaków, ponieważ każda postać może być niebezpieczna w odpowiednich okolicznościach. Powinieneś zakodować w miejscu, w którym niektóre określone znaki mogą stać się niebezpieczne, ponieważ przechodzą na inny podjęzyk, w którym mają specjalne znaczenie. Kiedy piszesz ciąg znaków do HTML, powinieneś zakodować znaki, które mają specjalne znaczenie w HTML, używając Server.HtmlEncode. Jeśli przekażesz ciąg do dynamicznej instrukcji SQL, powinieneś zakodować różne znaki (lub lepiej, pozwól, aby środowisko to zrobiło za Ciebie, używając przygotowanych instrukcji itp.).
Gdy masz pewność, że kodujesz HTML wszędzie, gdzie przekazujesz ciągi znaków do HTML, ustaw
validateRequest="false"
w<%@ Page ... %>
dyrektywie.aspx
plik (i).W .NET 4 może być konieczne zrobienie czegoś więcej. Czasami konieczne jest również dodanie
<httpRuntime requestValidationMode="2.0" />
do pliku web.config ( odniesienie ).źródło
<httpRuntime requestValidationMode="2.0" />
tag lokalizacji, aby uniknąć zabicia użytecznej ochrony zapewnianej przez sprawdzanie poprawności z reszty witryny.[AllowHtml]
to właściwość modelu.GlobalFilters.Filters.Add(new ValidateInputAttribute(false));
wApplication_Start()
.<pages validateRequest="false" />
w<system.web />
. Spowoduje to zastosowanie tej właściwości do wszystkich stron.Istnieje inne rozwiązanie tego błędu, jeśli używasz ASP.NET MVC:
Próbka C #:
Próbka Visual Basic:
źródło
[AllowHtml]
jest lepsze niżValidateInput(false)
, ponieważ[AllowHtml]
jest definiowane od razu dla właściwości, tj. Pola Edytora i za każdym razem, gdy jest używana, nie trzeba jej używać do kilku działań. Co sugerujesz?W ASP.NET MVC (od wersji 3) możesz dodać
AllowHtml
atrybut do właściwości w swoim modelu.Pozwala żądaniu uwzględnić znaczniki HTML podczas wiązania modelu, pomijając sprawdzanie poprawności żądania dla właściwości.
źródło
ValidateInput(false)
iAllowHtml
? Jaka jest przewaga jednego nad drugim? Kiedy chciałbym użyćAllowHtml
zamiastValidateInput(false)
? Kiedy chcę użyćValidateInput(false)
w ciąguAllowHtml
? Kiedy chciałbym korzystać z obu? Czy warto używać obu?Jeśli korzystasz z .NET 4.0, upewnij się, że dodajesz to do pliku web.config wewnątrz
<system.web>
tagów:W .NET 2.0 sprawdzanie poprawności
aspx
żądań dotyczyło tylko żądań. W .NET 4.0 został on rozszerzony o wszystkie żądania. Możesz przywrócić sprawdzanie poprawności XSS tylko podczas przetwarzania.aspx
, określając:Możesz całkowicie wyłączyć sprawdzanie poprawności , określając:
źródło
<system.web>
tagów.W przypadku ASP.NET 4.0 można zezwolić na znaczniki jako dane wejściowe dla konkretnych stron zamiast dla całej witryny, umieszczając je w jednym
<location>
elemencie. Dzięki temu wszystkie Twoje strony będą bezpieczne. NIE musisz umieszczaćValidateRequest="false"
strony .aspx.Bezpieczniej jest to kontrolować w pliku web.config, ponieważ na poziomie witryny można zobaczyć, które strony zezwalają na znaczniki jako dane wejściowe.
Nadal musisz programowo sprawdzić poprawność danych wejściowych na stronach, na których sprawdzanie poprawności żądania jest wyłączone.
źródło
Poprzednie odpowiedzi są świetne, ale nikt nie powiedział, jak wykluczyć jedno pole z weryfikacji pod kątem wstrzyknięć HTML / JavaScript. Nie wiem o poprzednich wersjach, ale w MVC3 Beta możesz to zrobić:
To nadal sprawdza poprawność wszystkich pól z wyjątkiem jednego wykluczonego. Zaletą tego jest to, że twoje atrybuty sprawdzania poprawności nadal sprawdzają poprawność pola, ale po prostu nie otrzymujesz wyjątków „Potencjalnie niebezpieczne żądanie. Wykryto formularz od klienta”.
Użyłem tego do sprawdzania poprawności wyrażenia regularnego. Zrobiłem własny atrybut ValidationAttribute, aby sprawdzić, czy wyrażenie regularne jest prawidłowe, czy nie. Ponieważ wyrażenia regularne mogą zawierać coś, co wygląda jak skrypt, zastosowałem powyższy kod - wyrażenie regularne jest nadal sprawdzane, czy jest poprawne, czy nie, ale nie, jeśli zawiera skrypty lub HTML.
źródło
[AllowHtml]
właściwości modelu zamiast[ValidateInput]
akcji, aby osiągnąć ten sam efekt końcowy.[AllowHtml]
nie ma opcji. Polecam sprawdzenie tego artykułu: weblogs.asp.net/imranbaloch/... , ale on też jest nieco stary i może być nieaktualny.W ASP.NET MVC należy ustawić requestValidationMode = "2.0" i validateRequest = "false" w pliku web.config i zastosować atrybut ValidateInput do akcji kontrolera:
i
źródło
validateRequest="false"
nie było to konieczne, tylkorequestValidationMode="2.0"
Możesz kodować zawartość HTML w polu tekstowym, ale niestety nie powstrzyma to wyjątku. Z mojego doświadczenia wynika, że nie ma takiej możliwości i musisz wyłączyć sprawdzanie poprawności strony. Robiąc to, mówisz: „Będę ostrożny, obiecuję”.
źródło
W przypadku MVC zignoruj sprawdzanie poprawności danych wejściowych przez dodanie
powyżej każdej akcji w kontrolerze.
źródło
Możesz złapać ten błąd w Global.asax. Nadal chcę sprawdzić poprawność, ale pokażę odpowiedni komunikat. Na blogu wymienionym poniżej dostępna była taka próbka.
Przekierowanie na inną stronę również wydaje się rozsądną odpowiedzią na wyjątek.
http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html
źródło
Odpowiedź na to pytanie jest prosta:
Spowoduje to wyłączenie sprawdzania poprawności dla konkretnego żądania.
źródło
Request
?Należy pamiętać, że niektóre kontrolki .NET automatycznie kodują dane wyjściowe w formacie HTML. Na przykład ustawienie właściwości .Text w kontrolce TextBox spowoduje jej automatyczne zakodowanie. Oznacza to w szczególności konwersję
<
na<
,>
na>
i&
na&
. Uważaj więc na to ...Jednak właściwość .Text dla HyperLink, Literal i Label nie koduje HTML, więc otacza Server.HtmlEncode (); wszystko, co jest ustawione w tych właściwościach, jest koniecznością, jeśli chcesz zapobiec
<script> window.location = "http://www.google.com"; </script>
wyświetlaniu ich na stronie, a następnie wykonywaniu.Wykonaj małe eksperymenty, aby zobaczyć, co zostanie zakodowane, a co nie.
źródło
W pliku web.config w tagach wstaw element httpRuntime z atrybutem requestValidationMode = „2.0”. Dodaj także atrybut validateRequest = "false" w elemencie Pages.
Przykład:
źródło
Jeśli nie chcesz wyłączać ValidateRequest, musisz zaimplementować funkcję JavaScript, aby uniknąć wyjątku. To nie jest najlepsza opcja, ale działa.
Następnie w kodzie z tyłu, w zdarzeniu PageLoad, dodaj atrybut do kontrolki za pomocą następnego kodu:
źródło
Wygląda na to, że nikt jeszcze nie wspomniał o tym poniżej, ale rozwiązuje to problem. I zanim ktokolwiek powie: tak, to Visual Basic ... fuj.
Nie wiem, czy są jakieś wady, ale dla mnie zadziałało to niesamowicie.
źródło
Innym rozwiązaniem jest:
źródło
Jeśli używasz frameworka 4.0, to wpis w pliku web.config (<pages validateRequest = "false" />)
Jeśli używasz frameworka 4.5, to wpis w pliku web.config (requestValidationMode = "2.0")
Jeśli chcesz tylko dla jednej strony, w pliku aspx powinieneś umieścić pierwszy wiersz w następujący sposób:
jeśli masz już coś w rodzaju <% @ Page, po prostu dodaj resztę =>
EnableEventValidation="false"
%>Polecam tego nie robić.
źródło
W ASP.NET możesz złapać wyjątek i coś z tym zrobić, na przykład wyświetlić przyjazną wiadomość lub przekierować na inną stronę ... Istnieje również możliwość samodzielnej obsługi sprawdzania poprawności ...
Wyświetl przyjazną wiadomość:
źródło
Myślę, że możesz to zrobić w module; ale to pozostawia otwarte pytania; co jeśli chcesz zapisać dane wejściowe w bazie danych? Nagle, ponieważ zapisujesz zakodowane dane w bazie danych, w końcu ufasz wejściom, co jest prawdopodobnie złym pomysłem. Idealnie przechowujesz nieprzetworzone nieprzetworzone dane w bazie danych i kodowaniu za każdym razem.
Lepszym rozwiązaniem jest wyłączenie ochrony na poziomie strony, a następnie kodowanie za każdym razem.
Zamiast korzystać z Server.HtmlEncode powinieneś przyjrzeć się nowszej, bardziej kompletnej bibliotece Anti-XSS od zespołu Microsoft ACE.
źródło
Przyczyna
Program ASP.NET domyślnie sprawdza poprawność wszystkich formantów wejściowych pod kątem potencjalnie niebezpiecznych treści, które mogą prowadzić do skryptów krzyżowych (XSS) i wstrzyknięć SQL . W związku z tym nie zezwala na taką treść, zgłaszając powyższy wyjątek. Domyślnie zaleca się zezwalanie na to sprawdzanie przy każdym opóźnieniu zwrotnym.
Rozwiązanie
W wielu przypadkach musisz przesłać treść HTML na swoją stronę za pomocą Rich TextBoxes lub Rich Text Editor. W takim przypadku możesz uniknąć tego wyjątku, ustawiając tag ValidateRequest w
@Page
dyrektywie na false.Spowoduje to wyłączenie sprawdzania poprawności żądań dla strony, dla której ustawiono flagę ValidateRequest na false. Jeśli chcesz to wyłączyć, sprawdź w swojej aplikacji internetowej; musisz ustawić wartość false w swojej sekcji web.config <system.web>
W przypadku platform .NET 4.0 lub nowszych należy również dodać następujący wiersz w sekcji <system.web>, aby powyższe działało.
Otóż to. Mam nadzieję, że pomoże to w pozbyciu się powyższego problemu.
Odniesienie do: Błąd ASP.Net: Wykryto potencjalnie niebezpieczną wartość Request.Form od klienta
źródło
Znalazłem rozwiązanie, które wykorzystuje JavaScript do kodowania danych, które są dekodowane w .NET (i nie wymaga jQuery).
Dodaj następującą funkcję JavaScript do nagłówka.
funkcja boo () {targetText = document.getElementById ("HiddenField1"); sourceText = document.getElementById („skrzynka użytkownika”); targetText.value = escape (sourceText.innerText); }W swoim obszarze tekstowym umieść onchange, który wywołuje boo ():
Wreszcie, w .NET, użyj
Wiem, że jest to jednokierunkowe - jeśli potrzebujesz dwukierunkowego, musisz wykazać się kreatywnością, ale zapewnia to rozwiązanie, jeśli nie możesz edytować pliku web.config
Oto przykład, który I (MC9000) wymyśliłem i używam przez jQuery:
I znaczniki:
To działa świetnie. Jeśli haker spróbuje opublikować, omijając JavaScript, zobaczy tylko błąd. Możesz również zapisać wszystkie dane zakodowane w bazie danych, a następnie usunąć z niego krajobraz (po stronie serwera) oraz przeanalizować i sprawdzić ataki przed wyświetleniem w innym miejscu.
źródło
escape(...)
może zająć dużo czasu. W moim przypadku znacznikiem był cały plik XML (2 MB). Możesz zapytać: „Dlaczego po prostu nie użyjesz<input type="file"...
i ... Zgadzam się z tobą :)Inne rozwiązania tutaj są fajne, jednak to trochę królewski ból z tyłu, gdy trzeba zastosować [AllowHtml] do każdej pojedynczej właściwości Modelu, szczególnie jeśli masz ponad 100 modeli na przyzwoitej stronie.
Jeśli tak jak ja, chcesz wyłączyć tę funkcję (całkiem bezcelową) z całej witryny, możesz zastąpić metodę Execute () w kontrolerze podstawowym (jeśli nie masz jeszcze kontrolera podstawowego, sugeruję, aby go utworzyć, mogą być całkiem przydatne do stosowania wspólnej funkcjonalności).
Tylko upewnij się, że kodujesz HTML wszystko, co jest wypompowywane do widoków pochodzących z danych wejściowych użytkownika (tak czy inaczej jest to domyślne zachowanie w ASP.NET MVC 3 z Razor, więc chyba że z jakiegoś dziwnego powodu używasz Html.Raw () nie powinien wymagać tej funkcji.
źródło
Wystąpił również ten błąd.
W moim przypadku użytkownik wprowadził znak akcentowany
á
w nazwie roli (w odniesieniu do dostawcy członkostwa ASP.NET).Przekazuję nazwę roli do metody, aby przyznać użytkownikom tę rolę, a
$.ajax
żądanie wysłania nie powiodło się ...Zrobiłem to, aby rozwiązać problem:
Zamiast
Zrób to
@Html.Raw
wykonał lewę.Otrzymałem nazwę roli jako wartość HTML
roleName="Cadastro bás"
. Ta wartość z jednostką HTMLá
była blokowana przez ASP.NET MVC. Teraz otrzymujęroleName
wartość parametru taką, jaka powinna być:roleName="Cadastro Básico"
a silnik ASP.NET MVC nie będzie już blokował żądania.źródło
Wyłączyć sprawdzanie strony, jeśli naprawdę potrzebujesz znaków specjalnych, takich jak,
>
,,<
, itd. Następnie upewnić się, że gdy wyświetlana jest wprowadzane przez użytkownika dane są kodowane w formacie HTML.Podczas sprawdzania poprawności strony występuje luka w zabezpieczeniach, więc można ją obejść. Nie należy polegać wyłącznie na sprawdzaniu poprawności strony.
Zobacz: http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf
źródło
Możesz również użyć funkcji Escape (ciąg znaków) JavaScript, aby zastąpić znaki specjalne. Następnie po stronie serwera użyj serwera. URLDecode (ciąg), aby przełączyć z powrotem.
W ten sposób nie musisz wyłączać sprawdzania poprawności danych wejściowych, a dla innych programistów stanie się jasne, że ciąg może zawierać treść HTML.
źródło
Skończyłem używać JavaScript przed każdym zwrotnym zwrotnym sprawdzaniem znaków, których nie chciałeś, takich jak:
Przyznaję, że moja strona to głównie wprowadzanie danych i jest bardzo mało elementów, które wykonują zwroty, ale przynajmniej ich dane są zachowywane.
źródło
Możesz użyć czegoś takiego jak:
Później
nvc["yourKey"]
powinno działać.źródło
Dopóki są to tylko znaki „<” i „>” (a nie sam znak podwójnego cudzysłowu) i używasz ich w kontekście takim jak <input value = " this " />, jesteś bezpieczny (podczas gdy dla <textarea > ten </textarea> oczywiście byłbyś narażony). Może to uprościć twoją sytuację, ale do wszystkiego innego użyj jednego z innych opublikowanych rozwiązań.
źródło
Jeśli chcesz tylko powiedzieć użytkownikom, że <i> nie będą używane, ALE, nie chcesz, aby cały formularz został ponownie przetworzony / wysłany z powrotem (i stracił wszystkie dane wejściowe), czy nie możesz po prostu umieścić walidator wokół pola, aby sprawdzić te (i może inne potencjalnie niebezpieczne) postacie?
źródło
Żadna z sugestii mi nie działała. I tak nie chciałem wyłączać tej funkcji dla całej witryny, ponieważ 99% czasu nie chcę, aby moi użytkownicy umieszczali HTML na formularzach internetowych. Właśnie stworzyłem własną metodę obejścia, ponieważ tylko ja używam tej konkretnej aplikacji. Przekształcam dane wejściowe na HTML w kodzie z tyłu i wstawiam do mojej bazy danych.
źródło