So erhalten Sie einen QueryString, wenn sie urlencodiert ist oder prozentuale Zeichen in ASP.NET hat
-
08-07-2019 - |
Frage
Wie bekomme ich das tatsächliche QueryString aus dem Anforderungsobjekt, wenn der QueryString urlencodiert ist oder Prozentzeichen in ASP.NET aufweist?
Grundsätzlich, wenn ich eine URL wie diese habe: Default.aspx?p=%b4
, Wie bekomme ich eine Saite mit "%b4"?
Request.QueryString["p"]
Gibt einen nicht druckbaren Charakter zurück.
Request.RawUrl
Gibt default.aspx? p =%Ufffd "
Request.Url.AbsoluteUri
Rendite default.aspx? P =%EF%BF%bd
Wie kann ich "%b4" zurückbekommen?
Lösung
Ich habe mich weiter in diese Weise ausgegriffen und glaube, ich weiß, was dies verursacht: Ein HTTP-Client sendet eine URL an den Server, der nicht ordnungsgemäß URL-codiert ist. Insbesondere gibt es in der URL ein ungültiges Zeichen.
Um zu reproduzieren, fügen Sie Folgendes am Ende Ihrer URL in IE8 ein: default.aspx?p=´
Wenn Sie die Bytes untersuchen, die über den Draht gehen (z. B. verwenden Geiger) Sie werden sehen, dass ein tatsächlicher Hex -B4 -Charakter vom Client in die URL an Server gesendet wird. Dies ist ein illegaler Charakter in einer URL, da die URLs auf CHOD-Codes unter 0x80 beschränkt sind (alle größeren als 0 x 80 CHAR-Codes müssen prozentuell aufgetaucht sein).
Ihr Client gibt also ein ungültiges Zeichen, und Ihr Server ersetzt (richtig) das falsche Zeichen durch%EF%BF%BD, was die UTF-8-Codierung für die ist Unicode -Ersatzzeichen (U+0ffd), was passiert, wenn ein Charakter auftritt, was in der lokalen Codierung kein Äquivalent enthält.
Afaik, das ist ein Fehler in IE. Wenn Sie dieselbe URL in Firefox eingeben, codiert Firefox die URL ordnungsgemäß (als %b4 anstelle von ´). Beachten Sie, dass auch AFAIK das Problem nur auftritt, wenn man ungültige Zeichen manuell in IEs Adressleiste einfügt- wenn das gleiche Zeichen in einem Link vorhanden ist, scheint der IE die URL ordnungsgemäß zu codieren (zumindest in den von mir getesteten Fällen).
Sie sollten also herausfinden, wer diese falsche URL an Sie sendet, und ihnen sagen, dass sie ihre URLs richtig codieren sollen!
Andere Tipps
ASP.NET wird automatisch URL -Decodien -Sachen bei der Request.queryString ["Key"]. Sie müssen es nur noch einmal codieren.
HttpUtility.UrlEncode(Request.QueryString["p"])
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]
wird die rohe Abfragezeichenfolge zurückgeben
Ich hatte das gleiche Problem. Ich habe es gelöst, indem ich JavaScript "Escape ('Text % text')" hinzugefügt habe, während ich den QueryString verstoßen habe!