Laten we eens kijken naar de volgende twee URL's, geven ze dezelfde parameters door? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Het lijkt anders te zijn, maar in feite gebruiken ze allemaal UrlEncode voor ".net-technologie", waarbij de ene GB2312-codering is en de andere Utf-8-codering. De volgende code kan het bovenstaande coderingseffect verkrijgen:
string tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); string tmp2 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.UTF8);
Onze websites kunnen door andere programma's worden aangeroepen. Bijvoorbeeld, Chinese vereenvoudigde een ASP-pagina op het besturingssysteem moet een Chinese parameter doorgeven aan een ASP.net pagina. Standaard codeert de Server.UrlCode-methode van ASP op Chinese vereenvoudigde besturingssystemen het Chinees met GB2312-codering. Maar standaard zijn ASP.net pagina's gecodeerd in UTF-8. In dit geval, wanneer je Request.QueryString["Tag"] gebruikt om de waarde te accepteren, kun je geen Chinese informatie accepteren en zie je verwarde tekens bij stapsgewijze debugging. Op dit moment wordt Request.QueryString["Tag"] wel geaccepteerd met verwarde tekens, maar de URL is op dit moment niet vervormd.
De oplossing is om zelf de parameters in de URL te analyseren en vervolgens de waarden van de parameters te ontsleutelen volgens de codering van GB2312, in plaats van de standaard UTF-8-codering van .net te gebruiken. Microsoft biedt zelfs vergelijkbare functies, zodat we zelf geen reguliere expressies hoeven te gebruiken om URL-strings te analyseren.
De democode is als volgt:
string q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Tag"]);
Laten we Lutz Roeder's .NET Reflector gebruiken om de implementatie van de System.Web.HttpUtility.ParseQueryString-methode te bekijken: Als we blijven terugkijken, zien we dat de code die uiteindelijk de analyse van URL-parameterstrings afhandelt als volgt is:
De volgende functie van de System.Web.HttpValueCollection-klasse implementeert het parsen van de URL-parameter Hier zien we dat het een analyse is die door elk personage wordt uitgevoerd.
Wat betreft het soort coderingsmethode dat de andere partij aan ons doorgeeft, is het het beste om die als een parameter door te geven, zodat we deze kunnen ontsleutelen volgens deze parameter van de gebruiker. |