Avatar billede atke Nybegynder
11. maj 2005 - 10:24 Der er 3 kommentarer og
2 løsninger

A potentially dangerous Request.Form detected - Ingen tags i inpu

Den her fejl er set før ved ASP.NET v1.1:

A potentially dangerous Request.Form value was detected from the client (UserProfileIdHidden="...o9vJjsggW2ONZg==").

Jeg ved at jeg bare kan skrive (hvilket jeg gerne vil undgå):
<%@ Page validateRequest="false"  %>

Det hedder sig at denne fejl kommer, når der er <> tegn i et request felt. Mit problem er, at jeg ikke kan se nogen af disse ulovlige tegn i mine input. Så hvorfor brokker den sig ???

Feltet UserProfileIdHidden er en <input type="hidden"... som jeg selv fylder ud fra backenden, med en kort string på ca 20 karakterer, som bliver krypteret, og derefter base64-encoded.

Systemet har virket fint længe nu, men med lige nøjagtig denne værdi opstår fejlen:

value="WHjp7c1Io9vJjsggW2ONZg=="

Man kunne tro at det er de to lighedtegn der er problemet, men følgende eksempel-værdier laver ikke fejl:

value="LttwzPci3IN/F4bfsw8R0w=="
value="St+F6Y00LOQ0M69h6TAIFQ=="
value="ivtU/31gJLUBwAPlGp5m8w=="

Jeg håber nogen kan komme med et bud på en forklaring, eller et link til hvor Microsoft forklarer hvad det er de validerer, ud over < og >.

Venlig hilsen Atke
Avatar billede snepnet Nybegynder
11. maj 2005 - 11:01 #1
kan du bruge denne her til noget (der er links til nogle udemærkede steder) ?
http://blogs.madtechnology.net/chris/archive/2004/03/20/366.aspx
mvh
Avatar billede atke Nybegynder
11. maj 2005 - 17:06 #2
>snepnet

Tak for linket, men det gav ikke svar på mit spørgsmål. Det er kun endnu flere sider der siger at man kan slå valideringen fra, og man man så selv skal passe på XSS.

Jeg mangler stadig at vide hvad, udover < og >, der beskyttes imod.
Avatar billede snepnet Nybegynder
11. maj 2005 - 23:31 #3
Om en given string er "farlig" synes at blive undersøgt sådan her :

internal static bool IsDangerousString(string s, out int matchIndex)
{
      int num2;
      matchIndex = 0;
      int num1 = 0;
Label_0005:
      num2 = s.IndexOfAny(CrossSiteScriptingValidation.startingChars, num1);
      if (num2 < 0)
      {
            return false;
      }
      if (num2 == (s.Length - 1))
      {
            return false;
      }
      matchIndex = num2;
      char ch1 = s[num2];
      if (ch1 <= 'O')
      {
            if (ch1 <= '<')
            {
                  if (ch1 == '&')
                  {
                        if (s[num2 + 1] == '#')
                        {
                              return true;
                        }
                        goto Label_00BE;
                  }
                  if ((ch1 == '<') && (CrossSiteScriptingValidation.IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')))
                  {
                        return true;
                  }
                  goto Label_00BE;
            }
            if (ch1 == 'E')
            {
                  goto Label_00B3;
            }
            if (ch1 == 'O')
            {
                  goto Label_009D;
            }
            goto Label_00BE;
      }
      if (ch1 <= 'e')
      {
            if (ch1 == 'S')
            {
                  goto Label_00A8;
            }
            if (ch1 == 'e')
            {
                  goto Label_00B3;
            }
            goto Label_00BE;
      }
      if (ch1 != 'o')
      {
            if (ch1 == 's')
            {
                  goto Label_00A8;
            }
            goto Label_00BE;
      }
Label_009D:
      if (CrossSiteScriptingValidation.IsDangerousOnString(s, num2))
      {
            return true;
      }
      goto Label_00BE;
Label_00A8:
      if (CrossSiteScriptingValidation.IsDangerousScriptString(s, num2))
      {
            return true;
      }
      goto Label_00BE;
Label_00B3:
      if (CrossSiteScriptingValidation.IsDangerousExpressionString(s, num2))
      {
            return true;
      }
Label_00BE:
      num1 = num2 + 1;
      goto Label_0005;
}

og det ser ud til at den kaldes fra HttpRequest.ValidateString(...)

private void ValidateString(string s, string valueName, string collectionName)
{
      s = this.RemoveNullCharacters(s);
      int num1 = 0;
      if (CrossSiteScriptingValidation.IsDangerousString(s, out num1))
      {
            string text1 = valueName + "=\"";
            int num2 = num1 - 10;
            if (num2 <= 0)
            {
                  num2 = 0;
            }
            else
            {
                  text1 = text1 + "...";
            }
            int num3 = num1 + 20;
            if (num3 >= s.Length)
            {
                  num3 = s.Length;
                  text1 = text1 + s.Substring(num2, num3 - num2) + "\"";
            }
            else
            {
                  text1 = text1 + s.Substring(num2, num3 - num2) + "...\"";
            }
            throw new HttpRequestValidationException(HttpRuntime.FormatResourceString("Dangerous_input_detected", collectionName, text1));
      }
}

en af de links der var i det jeg sendte før linkede til denne :

http://weblogs.asp.net/vga/archive/2003/05/02/6329.aspx

som beskriver lidt om hvad der valideres, og metoden til at validere collections ser ud til at være som følger :

private void ValidateNameValueCollection(NameValueCollection nvc, string collectionName)
{
      int num1 = nvc.Count;
      for (int num2 = 0; num2 < num1; num2++)
      {
            string text1 = nvc.GetKey(num2);
            if (text1 != "__VIEWSTATE")
            {
                  string text2 = nvc.Get(num2);
                  if ((text2 != null) && (text2.Length > 0))
                  {
                        this.ValidateString(text2, text1, collectionName);
                  }
            }
      }
}

jeg ved ikke om du kan få noget ud af det, men det kan jo være at der er et eller andet der springer dig i øjnene som relevant.

mvh
Avatar billede atke Nybegynder
16. maj 2005 - 12:49 #4
>snepnet:
Tak for at lede opmærksomheden hen på Reflector. Det skulle dog nogle flere forsøg til at finde problemet.

Klassen System.Web.CrossSiteScriptingValidation er internal, så jeg kan ikke bruge den i et test-script.

Jeg har hentet en Lutz Roeder's .NET Reflector til at decompile med herfra:
http://www.aisto.com/roeder/dotnet/

Med den har jeg trukket koden ud for System.Web.CrossSiteScriptingValidation, og pasted den ind i et projekt, så jeg kunne teste forskellige strings.

Det viser sig at den søger efter følgende startingChars:
startingChars = new char[8] { '<', '&', 'o', 'O', 's', 'S', 'e', 'E' } ;

i IsDangerousScriptString leder den efter:    "script"
i IsDangerousOnString leder den efter:        "onXXX="  (ex onLoad=)
i IsDangerousExpressionString leder den efter: "expression("

Konklusionen er at den farlige del af min string er: "ONZg="
Den tror jeg vil lave en script-event på "on Zg", som den mener er ulovligt.

Da værdien kommer fra en krypteret bytestream der er base64 encoded, ser jeg ingen pæn løsning på mit problem, men jeg finder nok på noget.

Dette gælder for .NET v1.1 . Der er lavet noget om på validateren i .Net v2.0beta2, så den ser ikke min string som farlig. Men den tid, den tid.


>snepnet
Smid et svar, så får du halvdelen af pointsne, for en halv besvarelse. Tak for hjælpen.
Avatar billede snepnet Nybegynder
16. maj 2005 - 12:53 #5
Der fik du godt nok hænderne i mulden der må man sige .... meget godt gået synes jeg.
du skulle næsten smide en artikel ind om det herude.
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester