navegador - request.url.scheme c#
QueryString está mal formado después de URLDecode (11)
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?
Ejemplo:
http://localhost:3399/Base64.aspx?VLTrap=VkxUcmFwIHNldCB0byAiRkRTQT8+PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==
Produce:
VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==
La gente ha sugerido URLEncoding the querystring:
System.Web.HttpUtility.UrlEncode(yourString)
No puedo hacer eso ya que no tengo control sobre la rutina de llamada (que funciona bien con otros idiomas).
También hubo la sugerencia de reemplazar espacios con un signo más:
Request.QueryString["VLTrap"].Replace(" ", "+");
He pensado en esto, pero mi preocupación al respecto, y debería haberlo mencionado para empezar, es que no sé qué otros caracteres podrían tener malformaciones además del signo más.
Mi objetivo principal es interceptar 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 forma de ver el QueryString sin procesar antes de que esté URLDecoded?
Después de más pruebas, parece que .Net espera que todo lo que ingresa desde el QuerString tenga codificación URL pero el navegador no codifica URL automáticamente las solicitudes GET.
¿No puedes simplemente asumir que un espacio es un + y reemplazarlo?
Request.QueryString["VLTrap"].Replace(" ", "+");
;)
Bueno, obviamente debería tener la cadena de Base64 URLEncoded antes de enviarla al servidor.
Si no puede lograr eso, sugeriría simplemente reemplazar cualquier espacio incrustado de nuevo a +; ya que no se supone que las cadenas b64 tengan espacios, es una táctica legítima ...
Como hackeo rápido, puede reemplazar el espacio con el carácter más antes de la decodificación base64.
Estoy teniendo exactamente el mismo problema, excepto que tengo control sobre mi URL. Incluso con Server.URLDecode
y Server.URLEncode
, no lo convierte de nuevo en un signo +
, aunque mi cadena de consulta tiene el siguiente aspecto:
http://localhost/childapp/default.aspx?TokenID=0XU%2fKUTLau%2bnSWR7%2b5Z7DbZrhKZMyeqStyTPonw1OdI%3d
Cuando realizo lo siguiente.
string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);
aún no convierte el %2b
nuevamente en un signo +
. En cambio, tengo que hacer lo siguiente:
string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);
tokenID = tokenID.Replace(" ", "+");
Entonces funciona correctamente Realmente extraño.
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 al respecto, y debería haberlo mencionado para empezar, es que no sé qué otros caracteres podrían tener malformaciones además del signo más.
Esto es fácil de aliviar leyendo sobre 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.
Entonces creo que deberías estar bien.
No soy un desarrollador de C #, pero parece que necesita url CODIFICAR su cadena Base64 antes de enviarla como una url.
Puede reemplazar manualmente el valor ( argument.Replace('' '', ''+'')
) o consultar HttpRequest.ServerVariables["QUERY_STRING"]
(incluso mejor 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.
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).
Si usa System.Uri.UnescapeDataString(yourString)
ignorará el +
. Este método solo debe utilizarse en casos como el suyo cuando la cadena se codificó utilizando algún tipo de enfoque heredado, ya sea en el cliente o servidor.
Vea esta publicación en el blog: http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx
Tuve un problema similar con un parámetro que contiene el valor de Base64 y cuando viene con ''+''. Sólo Request.QueryString ["VLTrap"]. Replace ("", "+"); funcionó bien para mí; no ayuda UrlEncode u otra codificación porque incluso si muestra el enlace codificado en la página usted mismo con ''+'' codificado como ''% 2b'', entonces su navegador lo cambia a ''+'' al principio cuando se muestra y cuando lo hace, el navegador cambia para vaciar el espacio. 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.
System.Web.HttpUtility.UrlEncode(yourString)
hará el truco.