Domanda

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

Esempio:

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

produce:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

Le persone hanno suggerito URLEncoding del querystring:

System.Web.HttpUtility.UrlEncode(yourString) 

Non posso farlo perché non ho alcun controllo sulla routine di chiamata (che funziona bene con altre lingue).

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

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

Ci avevo pensato, ma la mia preoccupazione, e avrei dovuto menzionarlo per iniziare, è che non so quali altri potrebbero essere malformati oltre al segno più.

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

A tal fine ho provato a guardare Request.QueryString.toString () ma questo conteneva le stesse informazioni non valide. Esiste un modo per esaminare il QueryString non elaborato prima che è URLDecoded?

Dopo ulteriori test sembra che .Net si aspetti che tutto ciò che proviene da QuerString sia codificato nell'URL ma il browser non codifica automaticamente l'URL delle richieste GET.

È stato utile?

Soluzione

Puoi sostituire manualmente il valore ( topic.Replace ('', '+') ) o consultare HttpRequest.ServerVariables [" QUERY_STRING "] (anche meglio HttpRequest.Url.Query) e analizzalo tu stesso.

Dovresti comunque 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 altrimenti uno spazio.

Se non controlli gli URL in entrata, la prima opzione sarebbe preferita poiché eviti la maggior parte degli errori in questo modo.

Altri suggerimenti

La soluzione suggerita:

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

Dovrebbe funzionare bene. Per quanto riguarda la tua preoccupazione:

  

Ci avevo pensato, ma la mia preoccupazione, e avrei dovuto menzionarlo per iniziare, è che non so quali altri personaggi potrebbero essere malformati oltre al segno più.

Questo è facile da alleviare leggendo su base64 . Gli unici caratteri non alfanumerici che sono legali nella base64 moderna sono " / " ;, " + " e " = " (che viene utilizzato solo per l'imbottitura).

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 costituire un problema.

Quindi penso che dovresti essere a posto.

Sto riscontrando lo stesso identico problema, tranne per il fatto che ho il controllo del mio URL. Anche con Server.URLDecode e Server.URLEncode non lo converte in un segno + , anche se la mia stringa di query ha il seguente aspetto :

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

Quando eseguo quanto segue.

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

continua a non convertire il % 2b in un segno + . Invece devo fare quanto segue:

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

Quindi funziona correttamente. Davvero strano.

Ho avuto un problema simile con un parametro che contiene il valore Base64 e quando si tratta di '+'. Solo Request.QueryString [" VLTrap "]. Sostituisci (" " ;, " + "); ha funzionato bene per me; nessun UrlEncode o altra codifica utile perché anche se mostri il link codificato sulla pagina da solo con '+' codificato come '% 2b', allora è il browser che lo cambia in '+' all'inizio quando viene visualizzato e quando fai clic su di esso, il browser 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 e-mail html.

Se URLEncode la stringa prima di aggiungerla all'URL non si verificherà alcuno di questi problemi (il codice URL automatico lo riporterà allo stato originale).

Beh, ovviamente dovresti avere la stringa Base64 URLEncoded prima di inviarla al server.
Se non riesci a farlo, suggerirei semplicemente di sostituire qualsiasi spazio incorporato in +; dal momento che le stringhe b64 non sono supposte per avere spazi, è una tattica legittima ...

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

Come hack rapido potresti sostituire lo spazio con il carattere più prima della decodifica base64.

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

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

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

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

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

;)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top