2008-09-23 12 views
15

Estoy tratando de pasar una cadena Base64 a una aplicación web C# .Net a través de QueryString. Cuando llega la cadena, el signo "+" (más) está siendo reemplazado por un espacio. Parece que el proceso de URLDecode automático está haciendo esto. No tengo control sobre lo que se pasa a través de QueryString. ¿Hay alguna forma de manejar este lado del servidor?QueryString mal formado después de URLDecode

Ejemplo:

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

Produce:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg== 

personas han sugerido URLEncoding la cadena de consulta:

System.Web.HttpUtility.UrlEncode(yourString) 

no puedo hacer eso ya que no tengo control sobre la vocación rutina (que funciona bien con otros idiomas).

También estaba la sugerencia de reemplazar los espacios con un signo más:

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

tuve embargo de esto, pero mi preocupación con él, y yo debería haber mencionado esto para empezar, es que no lo hago saber qué otros caracteres pueden estar mal formados además del signo más.

Mi objetivo principal es interceptar el QueryString antes de que se ejecute a través del decodificador.

Para este fin intenté buscar Request.QueryString.toString() pero contenía la misma información mal formada. ¿Hay alguna manera de ver la QueryString en bruto antes de está URLDecoded?

Después de más pruebas, parece que .Net espera que todo lo que proviene de QuerString tenga codificación URL pero el navegador no codifica URL automáticamente las solicitudes GET.

+0

OK, así que ahora estoy completamente a la pérdida de la forma en que funciona tan.La pregunta establece explícitamente que no hay forma de cambiar lo que se pasó a QueryString, pero se han rechazado todas las respuestas correctas (es decir, se reemplaza el espacio por más antes de la decodificación de base64). Ve figura ... – Alexander

Respuesta

11

podría reemplazar manualmente el valor (argument.Replace(' ', '+')) o consulte el HttpRequest.ServerVariables["QUERY_STRING"] (aún mejor la HttpRequest.Url.Query) y analizarlo usted mismo.

Sin embargo, debe intentar resolver el problema donde se proporciona la URL; un signo más debe codificarse como "% 2B" en la URL porque, de lo contrario, representa un espacio.

Si no controla las URL entrantes, se preferirá la primera opción ya que evita la mayoría de los errores de esta manera.

+2

La forma más fácil de hacerlo es usar Uri.EscapeDataString/Uri.UnescapeDataString. –

1

Si URLEncode la cadena antes de agregarla a la URL no tendrá ninguno de esos problemas (el URLDecode automático lo devolverá al estado original).

0

No soy de ninguna manera un desarrollador de C#, pero parece que necesita url CODIFICAR su cadena Base64 antes de enviarla como una url.

+1

Él no tiene el control de la URL - ver su pregunta. –

0

¿No puedes simplemente asumir que un espacio es un + y reemplazarlo?

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

;)

1

Bueno, es obvio que debe tener la cadena Base64 urlencoded antes de enviarlo al servidor.
Si no puede lograr eso, sugeriría simplemente reemplazar cualquier espacio incrustado de nuevo a +; Como las cadenas B64 no se suposed tener espacios, es una táctica legítima ...

+0

"Bueno, obviamente deberías tener la cadena de Base64 URLEncoded antes de enviarla al servidor" .... dijo que no tiene control sobre eso. –

+0

De ahí el obviamente ... y la alternativa después. – AviD

1

System.Web.HttpUtility.UrlEncode(yourString) hará el truco.

1

Como hackeo rápido, puede reemplazar el espacio con el carácter más antes de la decodificación base64.

14

La solución sugerida:

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

debería funcionar bien. En cuanto a su preocupación:

He pensado en esto, pero mi preocupación con él, y debería haberlo mencionado para empezar, es que no sé qué otros caracteres podrían estar mal formados además del signo más .

Esto es fácil de aliviar por reading about base64. Los únicos caracteres no alfanuméricos que son legales en base64 moderna son "/", "+" y "=" (que solo se utilizan para relleno).

De ellos, "+" es el único que tiene un significado especial como representación escapada en las URL. Mientras que los otros dos tienen un significado especial en las URL (delimitador de ruta y separador de cadena de consulta), no deberían suponer un problema.

Así que creo que deberías estar bien.

4

Estoy teniendo exactamente este mismo problema, excepto que tengo control sobre mi URL. Incluso con Server.URLDecode y Server.URLEncode no se convierte de nuevo a una señal +, aunque mi cadena de consulta es el siguiente:

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

Al realizar lo siguiente.

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

todavía no convierte el %2b de nuevo en una señal +. En su lugar, tengo que hacer lo siguiente:

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

Entonces funciona correctamente. Realmente extraño.

+5

Tuve exactamente el mismo problema. Parece que 'Request.QueryString [" TokenID "]' devuelve una cadena ya URLdecoded. Pasándolo a Server.UrlDecode estás haciendo urldecoding dos veces. – graycrow

2

Tuve un problema similar con un parámetro que contiene el valor de Base64 y cuando se trata de '+'. Solo Request.QueryString ["VLTrap"]. Reemplazar ("", "+"); funcionó bien para mí; no UrlEncode u otra codificación que ayude porque incluso si muestra el enlace codificado en la página usted mismo con '+' codificado como '% 2b', su navegador cambiará a '+' al principio cuando se muestre y cuando haga clic en él, navegador lo cambia a espacio vacío. Así que no hay forma de controlarlo como dice el cartel original, incluso si muestra los enlaces usted mismo. Lo mismo con tales enlaces incluso en correos electrónicos html.

Cuestiones relacionadas