2011-02-01 11 views
7

tengo un problema que nunca he visto antes, y creo que tiene algo que ver con la configuración de apache, que no conozco muy bien.apache: diéresis escapadas en cadena de consulta (URL) conducen a 403

primero, hay un script php con un formulario de búsqueda. la forma se transmite a través de POST.

luego está la lista de resultados de resultados de búsqueda. aquí la consulta de búsqueda original se pasa como parte de la url, por ejemplo: search.php? id = 1234 & query = foo. esto también funciona, siempre y cuando no haya diéresis (äöüÄÜÜß ...) caracteres transmitidos.

tan pronto como me incluyo diéresis en la consulta de búsqueda, la primera parte que transmite la cadena de consulta como funciona la POST, pero pasándolo (urlencoded) en el URL dirige a un 403.

manera:

  • search.php?id=1234&query=bar funciona
  • search.php?id=1234&query=b%E4r lleva a 403 (% E4 = "a" UTF-8 urlencoded)
  • search.php?id=1234&query=b%C3%A4r lleva a 403 (% C3% A4 = "a" UTF-8 urlencoded)
  • diéresis presentación vía el poste de obras

i convertidos la aplicación de la norma ISO-8859-1 a UTF-8, pero que no hicieron ningún diferencia.

También lo probé en mi máquina local, aquí funciona sin problemas, como se esperaba.

configuración remota del servidor (en el que no funciona):

Apache/2.2.12 (Ubuntu),
Versión PHP 5.2.10-2ubuntu6.7, Suhosin Parche 0.9.7, a través CGI/FastCGI

configuración local (aquí las mismas obras):

Apache/2.2.8 (Win32) PHP/5.3.5
PHP versión 5 .3.5 a través de mod_php

¿Alguien tiene una idea de por qué el apache/php-cgi remoto no acepta umlauts urlencoded correctamente en la url?

información adicional: también intenté crear un archivo estático con una diéresis en su nombre, y tanto /t%C3%A4st.php como /täst.php se publicaron sin problemas. täst.php?foo=täst falla.

nota: ?foo=%28, donde% es 28 "(", funciona también

+0

pedante, lo sé, pero "ß" no tiene diéresis ... – Stephen

+0

lo siento :) ¿cómo se llama este superconjunto de tipo de caracteres especiales? – stefs

+2

¿tiene algún mod_security-like módulo con algunas reglas rotas? ¿Esto también ocurre con cualquier personaje no ascii como àéù? – arnaud576875

Respuesta

1

Apache no se escapa de eso, el navegador hace

Es necesario utilizar urlencodeurldecode y para evitar problemas con eso.. tipo de caracteres.

Algunos navegadores, como el viejo Netscape, simplemente envían la url como está escrita, con 8 caracteres de bit en la misma.Otros, especialmente MSIE, codifica la url como UTF-8 antes de enviarla al servidor web, por lo que un personaje de 8 bits llega como dos caracteres, de los cuales el primero tiene el octavo bit establecido. No hay indicación alguna, en los encabezados de solicitud o en otro lugar, de que la url esté codificada en UTF-8.

+0

soy consciente de eso. pero sospecho que alguna configuración de Apache/mod de seguridad mal configurado para bloquear las solicitudes si hay ciertos caracteres en la url. – stefs

+0

El otro problema es que se supone que urldecode debe hacerse automáticamente en php, así que esto no debería causar ningún problema, sin embargo si ser servido con un 403 tiene que ser apache, si entra en php y tiene errores, el error sería 500, 403 digamos que apache no está cargando el archivo como con las cadenas obtener esto tiene que ser una regla que está configurada en el servidor apache –

Cuestiones relacionadas