Pergunta

Eu estou tentando passar uma cadeia Base64 em uma aplicação web C # .Net através da QueryString. Quando a corda chega o sinal "+" (mais) está sendo substituído por um espaço. Parece que o processo URLDecode automática está fazendo isso. Eu não tenho nenhum controle sobre o que está sendo passado através da QueryString. Existe alguma maneira de lidar com este lado do servidor?

Exemplo:

http://localhost:3399/Base64.aspx?VLTrap=VkxUcmFwIHNldCB0byAiRkRTQT8+PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

Produz:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

As pessoas têm sugerido URLEncoding a querystring:

System.Web.HttpUtility.UrlEncode(yourString) 

Eu não posso fazer isso como eu não tem controle sobre a rotina de chamada (que está funcionando bem com outras linguagens).

Houve também a sugestão de substituir espaços com um sinal positivo:

Request.QueryString["VLTrap"].Replace(" ", "+");

I teve embora deste, mas a minha preocupação com ela, e eu deveria ter mencionado isso para começar, é que eu não sei o outros caracteres podem ser mal formado, além do sinal de mais.

Meu principal objetivo é interceptar o QueryString antes de ser executado através do descodificador.

Para este fim Eu tentei olhar para Request.QueryString.toString (), mas este continha a mesma informação malformado. Existe alguma maneira de olhar para o QueryString raw antes é URLDecoded?

Depois de mais testes, parece que .Net espera tudo vindo do QuerString ser URL codificado, mas o navegador não faz automaticamente URL codificar GET pedidos.

Foi útil?

Solução

Você pode substituir manualmente o valor (argument.Replace(' ', '+')) ou consultar o HttpRequest.ServerVariables["QUERY_STRING"] (ainda melhor do HttpRequest.Url.Query) e analisá-lo você mesmo.

Você deverá, contudo, tentar resolver o problema em que o URL é dada; um sinal de mais precisa obter codificado como "% 2B" no URL porque um plus de outra forma representa um espaço.

Se você não controlar as URLs de entrada, a primeira opção seria preferível que você evite a maioria dos erros desta forma.

Outras dicas

A solução sugerida:

Request.QueryString["VLTrap"].Replace(" ", "+");

deve funcionar muito bem. Quanto a sua preocupação:

I teve embora deste, mas a minha preocupação com ela, e eu deveria ter mencionado isso para começar, é que eu não sei o que outros personagens podem ser mal formado, além do sinal de mais.

Isso é fácil de aliviar por ler sobre base64 . Os apenas caracteres não alfanuméricos que são legais em base64 modernos são "/", "+" e "=" (que só é utilizado para preenchimento).

Destes, "+" é o único que tem um significado especial como uma representação escapou em URLs. Enquanto os outros dois têm um significado especial em URLs (delimitador de caminho e separador de string de consulta), não deve representar um problema.

Então eu acho que você deve estar OK.

Eu estou tendo esse mesmo problema exato, exceto eu tenho controle sobre minha URL. Mesmo com Server.URLDecode e Server.URLEncode não convertê-lo de volta para um sinal +, embora minha consulta aparência de corda da seguinte forma:

http://localhost/childapp/default.aspx?TokenID=0XU%2fKUTLau%2bnSWR7%2b5Z7DbZrhKZMyeqStyTPonw1OdI%3d

Quando eu executar o seguinte.

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);

ainda não converte a volta %2b em um sinal de +. Em vez disso eu tenho que fazer o seguinte:

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);
tokenID = tokenID.Replace(" ", "+");

Em seguida, ele funciona corretamente. Realmente estranho.

Eu tive problema semelhante com um parâmetro que contém o valor Base64 e quando ele vem com '+'. Apenas Request.QueryString [ "VLTrap"] Substitua ("", "+").; funcionou bem para mim; não UrlEncode ou outra codificação ajudando porque mesmo se você mostrar codificado link na página se com '+' codificado como um '% 2b' Então é navegador que muda para '+' em primeiro lugar quando se showen e quando você clicar nele, em seguida, muda de navegador -lo para esvaziar espaço. Portanto, não há maneira de controlá-lo como seu autor diz que mesmo se você mostrar links de si mesmo. A mesma coisa com tais enlaces, ainda em e-mails HTML.

Se você UrlEncode a corda antes de adicionar o URL que você não terá nenhum desses problemas (o URLDecode automática irá retornar ao estado original).

Bem, obviamente você deve ter a seqüência de Base64 urlencoded antes de enviá-lo para o servidor.
Se você não pode fazer isso, gostaria de sugerir simplesmente substituindo quaisquer espaços incorporados voltar para +; desde B64 cordas não são suposto ter espaços, é uma tática legítima ...

System.Web.HttpUtility.UrlEncode(yourString) irá fazer o truque.

Como um corte rápido você poderia substituir o espaço com mais personagem antes base64-decodificação.

Se você usar System.Uri.UnescapeDataString(yourString) ele irá ignorar a +. Este método só deve ser usado em casos como o seu, onde quando a corda foi codificado usando algum tipo de abordagem legado tanto no cliente ou servidor.

Veja este post: http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx

Eu sou de nenhuma maneira um desenvolvedor C #, mas parece que você precisa url codificar seus Base64 cadeia antes de enviá-lo como um url.

Você não pode simplesmente assumir um espaço é um + e substituí-lo?

Request.QueryString["VLTrap"].Replace(" ", "+");

;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top