Aanvraagvalidatie : scriptaanvallen voorkomen

In dit document wordt de aanvraagvalidatiefunctie van ASP.NET beschreven, waarbij standaard wordt voorkomen dat de toepassing niet-gecodeerde HTML-inhoud verwerkt die naar de server wordt verzonden. Deze aanvraagvalidatiefunctie kan worden uitgeschakeld wanneer de toepassing is ontworpen om HTML-gegevens veilig te verwerken.

Is van toepassing op ASP.NET 1.1 en ASP.NET 2.0.

Aanvraagvalidatie, een functie van ASP.NET sinds versie 1.1, voorkomt dat de server inhoud accepteert die niet-gecodeerde HTML bevat. Deze functie is ontworpen om bepaalde aanvallen met scriptinjectie te voorkomen, waarbij code van clientscripts of HTML onbewust kan worden verzonden naar een server, opgeslagen en vervolgens aan andere gebruikers kan worden gepresenteerd. We raden u nog steeds ten zeerste aan om alle invoergegevens en HTML-codering zo nodig te valideren.

U maakt bijvoorbeeld een webpagina die het e-mailadres van een gebruiker aanvraagt en dat e-mailadres vervolgens opslaat in een database. Als de gebruiker <SCRIPT>alert("hello from script")</SCRIPT> invoert in plaats van een geldig e-mailadres, kan dit script worden uitgevoerd als de inhoud niet juist is gecodeerd. De functie voor aanvraagvalidatie van ASP.NET voorkomt dat dit gebeurt.

Waarom deze functie nuttig is

Veel sites zijn niet op de hoogte dat ze openstaan voor eenvoudige scriptinjectieaanvallen. Of het doel van deze aanvallen is om de site te ontkennen door HTML weer te geven of om mogelijk clientscripts uit te voeren om de gebruiker om te leiden naar de site van een hacker, scriptinjectieaanvallen zijn een probleem waarmee webontwikkelaars te maken moeten hebben.

Aanvallen met scriptinjectie zijn een probleem van alle webontwikkelaars, ongeacht of ze gebruikmaken van ASP.NET, ASP of andere technologieƫn voor webontwikkeling.

De ASP.NET aanvraagvalidatiefunctie voorkomt proactief deze aanvallen doordat niet-gecodeerde HTML-inhoud niet door de server kan worden verwerkt, tenzij de ontwikkelaar besluit die inhoud toe te staan.

Wat u kunt verwachten: foutpagina

In de onderstaande schermafbeelding ziet u een voorbeeld van ASP.NET code:

Schermopname van een voorbeeld van ASP.NET code.

Als u deze code uitvoert, wordt een eenvoudige pagina weergegeven waarmee u tekst in het tekstvak kunt invoeren, op de knop kunt klikken en de tekst in het label besturingselement kunt weergeven:

Schermopname van het uitvoeren van deze code resulteert in een eenvoudige pagina waarmee u tekst in het tekstvak kunt invoeren, op de knop kunt klikken en de tekst in het label besturingselement kunt weergeven.

Echter, als JavaScript, zoals <script>alert("hello!")</script>, zou worden ingevoerd en ingediend, zou er een uitzondering optreden.

Als JavaScript is ingevoerd en verzonden, krijgt u een uitzondering.

Het foutbericht geeft aan dat er een 'potentieel gevaarlijke Request.Form-waarde is gedetecteerd' en dat er meer informatie wordt weergegeven in de beschrijving over wat er is opgetreden en hoe het gedrag kan worden gewijzigd. Voorbeeld:

Aanvraagvalidatie heeft een mogelijk gevaarlijke clientinvoerwaarde gedetecteerd en de verwerking van de aanvraag is afgebroken. Deze waarde kan duiden op een poging om de beveiliging van uw toepassing te beschadigen, zoals een aanval op meerdere sites voor scripts. U kunt aanvraagvalidatie uitschakelen door in de paginarichtlijn of in de configuratiesectie validateRequest=false in te stellen. Het wordt echter sterk aangeraden dat uw toepassing alle invoer in dit geval expliciet controleert.

Aanvraagvalidatie uitschakelen op een pagina

Als u aanvraagvalidatie op een pagina wilt uitschakelen, moet u het validateRequest kenmerk van de pagina-instructie falseinstellen op:

<%@ Page validateRequest="false" %>

Waarschuwing

Wanneer aanvraagvalidatie is uitgeschakeld, kan inhoud worden verzonden naar een pagina; het is de verantwoordelijkheid van de paginaontwikkelaar om ervoor te zorgen dat inhoud correct is gecodeerd of verwerkt.

Aanvraagvalidatie uitschakelen voor uw toepassing

Als u aanvraagvalidatie voor uw toepassing wilt uitschakelen, moet u een Web.config-bestand voor uw toepassing wijzigen of maken en het kenmerk validateRequest van de <pages /> sectie instellen op false:

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

Als u aanvraagvalidatie wilt uitschakelen voor alle toepassingen op uw server, kunt u deze wijziging aanbrengen in uw Machine.config-bestand.

Waarschuwing

Wanneer aanvraagvalidatie is uitgeschakeld, kan inhoud worden verzonden naar uw toepassing; het is de verantwoordelijkheid van de ontwikkelaar van de toepassing om ervoor te zorgen dat inhoud correct is gecodeerd of verwerkt.

De onderstaande code wordt gewijzigd om aanvraagvalidatie uit te schakelen:

Schermopname van de onderstaande code is gewijzigd om aanvraagvalidatie uit te schakelen.

Als het volgende JavaScript nu is ingevoerd in het tekstvak <script>alert("hello!")</script> , zou het resultaat zijn:

Schermopname die laat zien of het JavaScript is ingevoerd in het tekstvak: het resultaat is een knop 'Klik op mij!' en een dialoogvenster met de tekst 'hallo!'.

Om te voorkomen dat dit gebeurt, moeten we de inhoud coderen door de aanvraagvalidatie uit te schakelen.

HTML-coderen van inhoud

Als u aanvraagvalidatie hebt uitgeschakeld, is het raadzaam om inhoud te coderen die wordt opgeslagen voor toekomstig gebruik. HTML-codering vervangt automatisch alle '<' of '>' (samen met verschillende andere symbolen) door de bijbehorende HTML-gecodeerde weergave. Bijvoorbeeld, '' wordt vervangen door '<' en '' wordt vervangen door '>'. Browsers gebruiken deze speciale codes om de '<' of '>' in de browser weer te geven.

Inhoud kan eenvoudig met HTML-codering op de server worden gecodeerd met behulp van de Server.HtmlEncode(string) API. Inhoud kan ook eenvoudig worden gedecodeerd met HTML, dat wil gezegd, teruggezet naar standaard HTML met behulp van de Server.HtmlDecode(string) methode.

Schermopname van inhoud die eenvoudig html-gecodeerd op de server kan zijn met behulp van de Server.HtmlEncode(string) API. Inhoud kan ook eenvoudig html-decoderen, dat wil gezegd, worden teruggezet naar standaard-HTML met behulp van de methode Server.HtmlDecode(string).

Resulteert in:

Schermopname van een knop 'Klik op mij!' en een geslaagd JavaScript-invoerbericht in het tekstvak.