2010-08-11 13 views
5

Quando l'utente immette un'e-mail sul mio sito Web, invio una e-mail di verifica e-mail che contiene un collegamento. Collegamento sembra qualcosa di simile:Fuga + (più) nell'URI

http://mysite.com/[email protected]&token=12341234

e-mail Questo particolare dell'utente contiene '+' (più), quindi collegamento assomiglia:

http://mysite.com/[email protected]&token=12341234

quando link viene cliccato (almeno in Firefox) plus è sostituito da uno spazio.

Domanda: Quale funzione di codifica URL utilizzo in .net per evitare il vantaggio.

Nota: Uri.EscapeUriString(email) lascia più intatto.

risposta

12

È possibile utilizzare Uri.EscapeDataString invece - Ho appena verificato che che converte "Foo + Bar" in "Pippo% 2BBar".

Per essere onesti, sarei grato se MS fornisse un po 'più di indicazioni sulla differenza tra questi metodi, nonché HttpUtility.UrlEncode (che non è disponibile su tutte le piattaforme).

2

Si potrebbe provare il metodo UrlEncode:

string encodedEmail = HttpUtility.UrlEncode(email); 
0

La cosa migliore che puoi fare è hash o crittografare l'indirizzo e-mail, o "includerlo" sul tuo token.

questo modo, il collegamento può essere simile: http://mysite.com/VerifyEmail?token=12341234480348204023

Oppure: http://mysite.com/VerifyEmail?emailcode=A124E4F325O425FE5F4J6636K66L&token=12341234

Se si segue il percorso di hash, si ricordi che Base64 utilizza anche + come un carattere valido durante la codifica. La pratica comune è quella di sostituirlo con un @ o qualcosa d'altro:

var emailcode = Convert.ToBase64String(GetHashBytes(email)).Replace('+', '@'); 

Poi, quando si esegue la conferma:

var emailcodebytes = Convert.FromBase64String(Request["code"].Replace('@', '+')); 
+1

Penso che l'esempio di codice è un po 'che non va? Il primo ')' è nel posto sbagliato: 'var emailcodebytes = Convert.FromBase64String (Request [" code "]. Replace ('@', '+'));' – rtpHarry

+0

Grazie, @rptHarry, ho corretto l'esempio. –