Vaatame järgmisi kahte URL-i, kas need läbivad samu parametreid? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Tundub, et see on erinev, kuid tegelikult kasutavad nad kõik UrlEncode'i ".net tehnoloogia" jaoks, kuid üks on GB2312 kodeerimine ja teine Utf-8 kodeerimine. Järgmine kood võib saavutada ülaltoodud kodeerimisefekti:
string tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); string tmp2 = System.Web.HttpUtility.UrlEncode(".net tehnoloogia", System.Text.Encoding.UTF8);
Meie veebilehti võivad kutsuda ka teised teenused. Näiteks hiina lihtsustatud ASP leht operatsioonisüsteemis peab edastama hiina parameetri ASP.net lehele. Vaikimisi kodeerib Hiina lihtsustatud operatsioonisüsteemidel ASP Server.UrlEncode meetod hiina keelt GB2312 kodeeringuga. Kuid vaikimisi kodeeritakse ASP.net lehekülgi UTF-8 formaadis. Sellisel juhul, kui kasutad Request.QueryString["Tag"] väärtuse vastuvõtmiseks, ei saa sa hiina infot vastu võtta ning näed samm-sammult siludes segaseid märke. Praegu, kuigi Request.QueryString["Tag"] aktsepteeritakse segaste tähemärkidega, ei ole URL sel ajal segane.
Lahendus on analüüsida URL-i parameetrid ise ja seejärel dekrüpteerida parameetrite väärtused vastavalt GB2312 kodeerimisele, selle asemel et kasutada vaikimisi UTF-8 kodeeringut .net. Tegelikult pakub Microsoft samamoodi vastavaid funktsioone, nii et me ei pea ise URL-i stringide analüüsimiseks kasutama regulaarseid avaldisi.
Demokood on järgmine:
string q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Tag"]);
Kasutame Lutz Roederi .NET peegeldajat, et vaadata System.Web.HttpUtility.ParseQueryString meetodi teostust: Kui me jätkame kontrollimist, näeme, et kood, mis lõpuks haldab URL-parameetrite stringi analüüsi, on järgmine:
Järgmine funktsioon System.Web.HttpValueCollection klassis rakendab URL-parameetri parsimist Siin näeme, et iga tegelase analüüs on läbi.
Mis puudutab kodeerimismeetodit, mida teine pool meile edastab, siis on kõige parem edastada see parameetrina, et saaksime selle kasutaja parameetri järgi dekrüpteerida. |