Come ottenere una stringa di querystring quando è URLEncoded o ha caratteri percentuali in ASP.NET
-
08-07-2019 - |
Domanda
Come ottenere la stringa di query effettiva dall'oggetto Request quando la stringa di query è UrlEncoded o ha caratteri percentuali in ASP.NET?
In sostanza, se ho un URL come questo: Default.aspx? p =% b4
, come posso ottenere una stringa popolata con "% b4 " ;?
Request.QueryString [" p "]
restituisce un carattere non stampabile.
Request.RawUrl
restituisce Default.aspx? p =% ufffd "
Request.Url.AbsoluteUri
restituisce Default.aspx? p =% EF% BF% BD
Come posso ottenere "% b4 " indietro?
Soluzione
Ho approfondito ulteriormente e credo di sapere cosa sta causando questo: un client HTTP sta inviando un URL al server che non è correttamente codificato. Nello specifico, nell'URL è presente un carattere non valido.
Per ripetere, incolla quanto segue alla fine dell'URL in IE8: default.aspx?p=´
Se esamini i byte che vanno oltre il filo (ad es. usando Fiddler ), vedrai un l'effettivo carattere Hex B4 viene inviato dal client al server nell'URL. Questo è un carattere illegale in un URL, poiché gli URL sono limitati a codici char inferiori a 0x80 (tutti i codici char più grandi di 0x80 devono essere sottoposti a escape percentuale).
Quindi il tuo client sta passando un carattere non valido e il tuo server sta sostituendo (correttamente) il carattere fasullo con% EF% BF% BD che è la codifica UTF-8 per Carattere sostitutivo Unicode (U + 0FFD) , che è ciò che accade quando si incontra un personaggio che non ha equivalenti nella codifica locale.
AFAIK, questo è un bug in IE. Se si digita lo stesso URL in Firefox, Firefox codificherà correttamente l'URL (come% b4 anziché ´). Si noti che, anche AFAIK, il problema si verifica solo quando si incollano manualmente caratteri non validi nella barra degli indirizzi di IE: se lo stesso carattere è presente in un collegamento, IE sembra codificare correttamente l'URL (almeno nei casi che ho testato).
Quindi dovresti capire chi ti sta inviando questo falso URL e dire loro di iniziare a codificare correttamente i loro URL!
Altri suggerimenti
Asp.net eseguirà automaticamente la decodifica URL delle cose quando esegui Request.Querystring [" key "]. Devi solo codificarlo di nuovo.
HttpUtility.UrlEncode(Request.QueryString["p"])
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]
restituirà la stringa di query RAW
Ho avuto lo stesso problema. L'ho risolto semplicemente aggiungendo in javascript " escape ('text% text') " mentre eseguo il querystring!