2010-01-13 11 views
5

Mi problema es el siguiente. Tengo una página de XHTML 1.1 que tiene campos de formulario y entrada. Uno de los campos de entrada contiene un valor que es un URI. Este URI contiene pares clave-valor con signo & (&) como separador de argumentos, que se pasará como una solicitud GET por otra aplicación web en el navegador.How-to XHTML 1.1 valida un ampersand sin escapar de él?

Normalmente usaría la entidad & para crear los símbolos y validar el código como XHTML 1.1. Mi problema aquí es que la aplicación no recibe la solicitud GET, ya que (como se esperaba) el navegador no entiende cómo manejar & en el URI.

Así que mi pregunta es realmente cómo escribir un signo de unión sin usar la entidad HTML, por lo que el navegador todavía lo reconoce como el separador de argumentos y la solicitud GET se pasa correctamente a la aplicación web.

He intentado Hex (% 26) que codifica el signo pero el navegador aún no lo "traduce" de nuevo a un carácter & adecuado.

Una cuestión relacionada, pero no proporciona la respuesta exacta a la pregunta que me pregunto:

XHTML and & (Ampersand) encoding

+2

"(como se esperaba) que el navegador no entiende cómo manejar' '& en el URI" - es decir, no ** ** como se esperaba, no debería ver '&' en la barra de direcciones a menos que lo haya codificado doblemente. –

+0

Por favor, vuelva a leer la pregunta. Los ampersands son parte de un URI contenido dentro del campo de valor de una entrada. Después de enviar el formulario, el usuario será devuelto a la misma ubicación, exactamente como está escrito. Esto significa que o dejo los símbolos "entrecomillados" pero fallan la validación, o los codifico con el problema de que el navegador recibirá la entidad HTML en la barra de direcciones y no pasará la cadena de consulta a la siguiente aplicación en el proceso. –

+1

El navegador debe decodificar el '&' a '&' al convertir el HTML a un DOM. Luego debe codificar '&' como '% 26' al construir la URL o los datos codificados en forma de x-url. Si no funciona, entonces sospecho que está manejando los datos incorrectamente en el servidor. – Quentin

Respuesta

0

no podía molestar a pasar más tiempo en esto.Simplemente cambie el separador de argumento para incluir también punto y coma (;) para que pueda usarlo en lugar del signo:

#cat .htaccess 
php_value arg_separator.input "&;" 
1

No hay manera de incluir un carácter de signo en un valor de atributo sin el uso de una entidad.

No hay forma de incluir un carácter ampersand como un TextNode sin usar una entidad o marcadores CDATA (pero apuesto a que usted está sirviendo como texto/html para que no pueda usarlos).

Dicho esto: cualquier navegador que no decodifique la entidad está roto. Ningún navegador convencional falla allí. Está utilizando un navegador oscuro y roto, o está diagnosticando mal el problema.

+0

Cualquier navegador importante (IE o FF lo hará). El navegador maneja la descodificación correctamente dentro del HTML. Me refiero a usar realmente la entidad HTML en la barra de direcciones. Pruébalo ... –

+2

¡Bueno, no hagas eso! Escribe URL simples en la barra de direcciones, no URL codificadas en HTML. Es como abrir un documento de Microsoft Word en el Bloc de notas. – Quentin

+0

El navegador se redirige a ese URI, ya que se tipeó directamente en la barra de direcciones, incluidas las entidades HTML. Ese es mi problema. –

0

Sin el código es difícil decir dónde intenta mantener esta información, si pudiera publicar el código podríamos hacer un mejor trabajo entendiendo el problema.

Una posible (si esto es en realidad lo que se enfrentan a) es mover los elementos de la cadena de consulta en otros elementos de forma, tales como:

<form action="example.com/?foo=1&bar=2> 
    <!-- ... --> 
</form> 

a:

<form action="example.com"> 
    <input type="hidden" name="foo" value="1" /> 
    <input type="hidden" name="bar" value="2" /> 
    <!-- ... --> 
</form> 
+0

La cadena de consulta no está en la acción de formulario real, sino dentro del campo de valor de un campo de entrada.Es un valor que pasa a una aplicación web, que luego devuelve el navegador del usuario a ese mismo URI (con la cadena de consulta en él). Aquí es donde falla, ya que el navegador no puede entender la entidad HTML en la barra de direcciones. –

+0

Gotcha, mi mal. Si ese es el caso, ¿no puedes simplemente escaparte cuando lo colocas en el campo de entrada (que probablemente sea mejor hacerlo de todos modos para evitar cualquier ataque XSS) y luego lo escapas antes de redirigir al servidor? – mynameiscoffey

+0

Lamentablemente, la redirección proviene de un tercero. Así que tengo que enviar el URI exactamente como lo necesito para volver ... el tercero simplemente lo recibe y devuelve el navegador del usuario después de que haya hecho otro trabajo. –

1

Como mencionado en la otra pregunta que mencionó, el navegador convierte &amp; en & cuando se procesa la página, por lo que el "&" (no &amp;) debe enviarse al servidor en la solicitud GET. Quizás esté usando Ajax para hacer la solicitud GET, en cuyo caso, puede necesitar decodificar el HTML. La entidad es necesaria para XHTML, no hay codificación alternativa, solo asegúrese de que esté correctamente decodificada.

Referencia: The & changes to &amp; in a hyperlink

+0

El problema es que el navegador recibe la entidad HTML directamente en la barra de direcciones (como si se hubiera tecleado directamente). No me estoy refiriendo a la decodificación que ocurre automáticamente, p. si usa la entidad equivalente de ampersand dentro de un ancla. –

+0

¿Cómo se coloca el URI en el campo de entrada? Si el valor es parte del HTML, entonces debería ser el nombre de la entidad, si se configura con JavaScript, entonces no debería ser. –

1

La escapó & debe ser convertido por el cliente (navegador) en cualquier parte del documento XHTML.

Así que debe escapar cada & con &amp;

Cuestiones relacionadas