Como obter uma tentativa de consulta quando é urle
-
08-07-2019 - |
Pergunta
Como obter o consultor real do objeto Solicitação quando a consulta é Urlencoded ou tem caracteres percentuais no ASP.NET?
Basicamente, se eu tenho um URL como este: Default.aspx?p=%b4
, como faço para obter uma corda preenchida com "%b4"?
Request.QueryString["p"]
Retorna um caractere não imprimível.
Request.RawUrl
Retorna default.aspx? p =%ufffd "
Request.Url.AbsoluteUri
retorna default.aspx? p =%ef%bf%bd
Como posso recuperar o "%B4"?
Solução
Eu me aproveitei mais e acredito que sei o que está causando isso: um cliente HTTP está enviando um URL para o servidor que não é adequadamente codificado por URL. Especificamente, existe um caractere inválido no URL.
Para reproduzir, cole o seguinte no final do seu URL no IE8: default.aspx?p=´
Se você examinar os bytes passando por cima do fio (por exemplo, usando Violinista), você verá que um caractere hexadecimal B4 está sendo enviado de cliente para servidor no URL. Este é um caráter ilegal em um URL, uma vez que os URLs são limitados a códigos de char sob 0x80 (qualquer código de char maior do que o 0x80 deve ser porcentagem).
Portanto, seu cliente está passando em um caractere inválido, e seu servidor está (corretamente) substituindo o caractere falso por%ef%bf%bd, que é a codificação UTF-8 para o Caractere de substituição unicode (u+0ffd), que é o que acontece quando um personagem é encontrado, o que não tem equivalente na codificação local.
Afaik, este é um bug no IE. Se você digitar o mesmo URL no Firefox, o Firefox codificará o URL corretamente (como %B4 em vez de '). Observe que, também AFAIK, o problema só acontece ao colar manualmente caracteres inválidos na barra de endereços do IE- se o mesmo personagem estiver presente em um link, ou seja, parece codificar o URL corretamente (pelo menos nos casos que testei).
Então, você deve descobrir quem está enviando esse URL falso para você e diga a eles para começarem a codificar seus URLs corretamente!
Outras dicas
O ASP.NET irá automaticamente o URL decodificar coisas quando você solicitar.QueryString ["key"]. Você só precisa codificá -lo novamente.
HttpUtility.UrlEncode(Request.QueryString["p"])
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]
Vai devolver a corda de consulta bruta
Eu tive o mesmo problema. Eu resolvi apenas adicionando o JavaScript "Escape ('text % text')" enquanto contruta a história!