QueryString non corretto dopo URLDecode


15

Sto provando a passare una stringa Base64 in un'applicazione web C# .Net tramite QueryString. Quando arriva la stringa, il segno "+" (più) viene sostituito da uno spazio. Sembra che il processo automatico URLDecode stia facendo questo. Non ho alcun controllo su ciò che viene passato tramite QueryString. C'è un modo per gestire questo lato server?

Esempio:

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

produce:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg== 

persone hanno suggerito urlencoding querystring:

System.Web.HttpUtility.UrlEncode(yourString) 

io non posso farlo, come non ho alcun controllo sulla chiamata routine (che funziona bene con altre lingue).

C'era anche il suggerimento di sostituire gli spazi con un segno più:

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

ho avuto anche se di questo, ma la mia preoccupazione con esso, e avrei dovuto parlato di questo per iniziare, è che non lo faccio sapere cosa altri caratteri potrebbero essere malformati in aggiunta al segno più.

Il mio obiettivo principale è intercettare QueryString prima che venga eseguito attraverso il decodificatore.

A tal fine, ho provato a cercare su Request.QueryString.toString() ma questo conteneva le stesse informazioni malformate. C'è un modo per guardare QueryString prima prima di è URLDecoded?

Dopo ulteriori test sembra che .Net si aspetti che tutto proveniente da QuerString sia codificato in URL ma il browser non codifica automaticamente URL richieste GET.

  0

OK, quindi ora sono completamente a perdita di come funziona così.La domanda afferma esplicitamente che non c'è modo di cambiare ciò che è passato in QueryString, ma tutte le risposte corrette (vale a dire, sostituire lo spazio con plus prima di decodificare base64) sono state eliminate. Vai a ... 23 set. 082008-09-23 22:32:06

11

si potrebbe sostituire manualmente il valore (argument.Replace(' ', '+')) oppure consultare il HttpRequest.ServerVariables["QUERY_STRING"] (ancora meglio la HttpRequest.Url.Query) e analizzare da soli.

Si dovrebbe tuttavia provare a risolvere il problema in cui viene fornito l'URL; un segno più deve essere codificato come "% 2B" nell'URL perché un plus rappresenta in altro modo uno spazio.

Se non si controllano gli URL in entrata, la prima opzione sarebbe preferibile in quanto si evitano più errori in questo modo.

+2

Il modo più semplice per farlo è utilizzare Uri.EscapeDataString/Uri.UnescapeDataString. 09 dic. 112011-12-09 20:46:47


1

Se si codifica l'URL nella stringa prima di aggiungerla all'URL, non si verificheranno tali problemi (l'URLDecode automatico lo restituirà allo stato originale).


0

Non sono affatto uno sviluppatore C# ma sembra che tu debba url ENCODE la tua stringa Base64 prima di inviarla come url.

+1

Non ha il controllo dell'URL - guarda la sua domanda. 23 set. 082008-09-23 21:36:24


0

Non puoi semplicemente supporre che uno spazio sia un + e sostituirlo?

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

;)


1

Beh, ovviamente, si dovrebbe avere la stringa Base64 urlencoded prima di inviarlo al server.
Se non riesci a farlo, ti suggerirei semplicemente di sostituire qualsiasi spazio incorporato a +; dal momento che le stringhe B64 non sono dovuto inviarci ad avere spazi, la sua una tattica legittima ...

  0

"Beh, ovviamente dovresti avere la stringa Base64 URLEncoded prima di inviarla al server" .... ha detto che non ha il controllo su questo però. 23 set. 082008-09-23 21:43:03

  0

Quindi ovviamente ... e l'alternativa in seguito. 23 set. 082008-09-23 23:06:10


1

System.Web.HttpUtility.UrlEncode(yourString) farà il trucco.


1

Come un rapido trucco, è possibile sostituire lo spazio con il carattere più prima della decodifica in base64.


14

La soluzione suggerita:

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

dovrebbe funzionare bene. Per quanto riguarda la tua preoccupazione:

Avevo pensato a questo, ma la mia preoccupazione, e avrei dovuto dire questo per iniziare, è che non so quali altri caratteri potrebbero essere malformati in aggiunta al segno più .

Questo è facile da alleviare da reading about base64. Gli unici caratteri non alfanumerici che sono legali nella base64 moderna sono "/", "+" e "=" (che è usato solo per il riempimento).

Di questi, "+" è l'unico che ha un significato speciale come rappresentazione di escape negli URL. Mentre gli altri due hanno un significato speciale negli URL (delimitatore di percorso e separatore di stringhe di query), non dovrebbero rappresentare un problema.

Quindi penso che dovresti essere OK.


4

Sto avendo esattamente lo stesso problema tranne che ho il controllo sul mio URL. Anche con Server.URLDecode e Server.URLEncode non si converte di nuovo a segno +, anche se la mia stringa di ricerca si presenta come segue:

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

Quando si esegue quanto segue.

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

ancora non converte il %2b di nuovo in un segno +. Invece devo fare quanto segue:

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

allora funziona correttamente. Davvero strano

+5

Ho avuto esattamente lo stesso problema. Sembra che 'Request.QueryString [" TokenID "]' restituisca già la stringa URLdecoded. Passandolo a Server.UrlDecode esegui urldecoding due volte. 11 gen. 122012-01-11 19:55:17


2

Ho avuto un problema simile con un parametro che contiene il valore Base64 e quando viene fornito con '+'. Solo Request.QueryString ["VLTrap"]. Sostituire ("", "+"); ha funzionato bene per me; no UrlEncode o altra codifica che aiuta perché anche se mostri il link codificato sulla pagina tu stesso con '+' codificato come '% 2b', allora il browser lo cambia in '+' all'inizio quando viene mostrato e quando lo fai clic sul browser lo cambia nello spazio vuoto. Quindi non c'è modo di controllarlo come dice il poster originale anche se mostri i link da solo. La stessa cosa con tali collegamenti anche nelle email html.


1

Se si utilizza System.Uri.UnescapeDataString(yourString), verrà ignorata la +. Questo metodo dovrebbe essere utilizzato solo in casi come il tuo, quando la stringa è stata codificata utilizzando una sorta di approccio legacy sul client o sul server.

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