Escapando de un comercial en URL

203

Estoy tratando de enviar un mensaje GET que contiene cadenas con símbolos y no puedo entender cómo escapar del símbolo en la URL.

Ejemplo:

http://www.example.com?candy_name=M&M
result => candy_name = M

También probé:

http://www.example.com?candy_name=M\&M
result => candy_name = M\\

Estoy usando URLs manualmente, así que solo necesito los caracteres correctos.

No puedo usar ninguna biblioteca. ¿Cómo puede hacerse esto?

tomermes
fuente

Respuestas:

350

Deben estar codificados por porcentaje:

> encodeURIComponent('&')
"%26"

Entonces, en su caso, la URL se vería así:

http://www.mysite.com?candy_name=M%26M
Licuadora
fuente
2
: -% 26 no funciona para mí. Hay alguna otra solucion.?
Sanjiv
2
Cuando reemplazo & a% 26, sigue mostrando el mismo error--A potentially dangerous Request.Path value was detected from the client (&).
Sanjiv
44
@Sanjiv: Eso es un problema con su código, no un porcentaje de codificación. Hacer una pregunta.
Blender
2
@Sanjiv, asegúrese de reemplazar "&" con "% 26" primero. Ver código ::: NSString * message = @ "Hello Jack & Jill"; mensaje = [mensaje stringByReplacingOccurrencesOfString: @ "&" withString: @ "% 26"]; mensaje = [mensaje stringByAppendingString: @ ""]; mensaje = [mensaje stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
Nirav
40

Esto no solo se aplica al ampersand en las URL, sino a todos los caracteres reservados . Algunos de los cuales incluyen:

 # $ & + ,  / : ; = ? @ [ ]

La idea es la misma que codificar un &en un documento HTML, pero el contexto ha cambiado para estar dentro del URI, además de estar dentro del documento HTML. Entonces, la codificación porcentual evita problemas con el análisis dentro de ambos contextos.

El lugar donde esto es útil es cuando necesitas poner una URL dentro de otra URL. Por ejemplo, si desea publicar un estado en Twitter:

http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com)

Hay muchos caracteres reservados en mi Tweet, es decir ?'():/, codifiqué todo el valor del statusparámetro URL. Esto también es útil cuando se usan mailto:enlaces que tienen un cuerpo o asunto de mensaje, porque necesita codificar los parámetros bodyy subjectpara mantener intactos los saltos de línea, los símbolos de unión, etc.

Cuando un carácter del conjunto reservado (un "carácter reservado") tiene un significado especial (un "propósito reservado") en un determinado contexto, y un esquema URI dice que es necesario usar ese carácter para algún otro propósito, entonces el carácter debe estar codificado en porcentaje. La codificación porcentual de un carácter reservado implica convertir el carácter a su valor de byte correspondiente en ASCII y luego representar ese valor como un par de dígitos hexadecimales. Los dígitos, precedidos por un signo de porcentaje ("%") que se usa como carácter de escape, se usan en el URI en lugar del carácter reservado. (Para un carácter no ASCII, generalmente se convierte a su secuencia de bytes en UTF-8, y luego cada valor de byte se representa como anteriormente.) El carácter reservado "/", por ejemplo, si se usa en la "ruta" componente de un URI, tiene el significado especial de ser un delimitador entre segmentos de ruta. Si, de acuerdo con un esquema de URI dado, "/" necesita estar en un segmento de ruta, entonces los tres caracteres "% 2F" o "% 2f" deben usarse en el segmento en lugar de un "/" sin formato.

http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

Alex W
fuente
44
Entre la lista anterior, ! ' ( ) *no están codificadas con URL encodeURIComponent.
Amil Waduwawara
hay una función php urlencode que resuelve este problema: uso $ escapedfilename = urlencode ($ filename);
Jeremy Young
3

Puede usar el carácter% para 'escapar' caracteres que no están permitidos en las URL. Ver [RFC 1738].

Una tabla de valores ASCII en http://www.asciitable.com/ .

Puede ver que &es 26 en hexadecimal, por lo que necesita M% 26M.

Peter Hull
fuente
2

Esto puede ayudar si alguien lo quiere en PHP

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);
Mohamed Ramadan
fuente
1

Me gustaría agregar un comentario menor sobre la solución Blender.

Puedes hacer lo siguiente:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M');

Eso da salida:

http://example.com?candy_name=M%26M

Lo mejor de esto es que no solo funciona para y para cualquier personaje especial.

Por ejemplo:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M?><')

Salidas:

"http://example.com?candy_name=M%26M%3F%3E%3C"
Antonio
fuente