Me han entregado un informe de vulnerabilidad (1) que parece estar implicando que puede haber un problema de seguridad en la forma en que Wordpress maneja las URL con las siguientes tildes. Parece que el escáner cree que el sitio web puede estar ofreciendo algunos listados de directorios y tal.
Me sorprendió que mi sitio web todavía ofreciera contenido en esas URL diferentes, así que hice una prueba instalando una instancia de WP totalmente en blanco, cambié a enlaces permanentes "Nombre de publicación" y confirmó que sí, cualquier URL con tilde agregada todavía se interpreta como la URL sin tilde.
De hecho, una url como esta:
https://mywordpresssite.com/my-permalink
También es accesible con las siguientes URL:
https://mywordpresssite.com/my-permalink~
https://mywordpresssite.com/my-permalink~/
https://mywordpresssite.com/my-permalink~~~~~~
Busqué un poco para ver dónde WP analiza los enlaces permanentes, y lo rastreé class-wp.php
en el parse_request
método, pero no pude llegar mucho más allá de eso.
Mi pregunta es si este es el comportamiento previsto para WP, y si es así, ¿hay alguna forma de desactivarlo para que las tildes no coincidan? ¿Por qué WP interpretaría las URL con tildes como una URL sin ellas?
(1) Sí, ahora todos hemos visto un par de hacks importantes y filtraciones de datos en el Reino Unido, es esa vez nuevamente donde todos los "seguridad" fingen que están haciendo su parte al entregarnos a los desarrolladores informes de escaneo de 200 páginas lleno de falsos positivos y problemas genéricos de los que no saben nada en la expectativa si leemos y actuamos sobre dicho informe, nunca pasará nada malo.
fuente
sanitize_title
, pero como es filtrable, no es posible escribir una solución siempre válida. Entonces fui específico.Sí, como ya se explicó,
WP_Query::get_posts()
usasanitize_title_for_query()
( que usasanitize_title()
) para desinfectar el nombre de una publicación singular.En resumen, después de pasar el nombre de la publicación
sanitize_title_for_query()
,my-permalink === my-permalink~~~
ya quesanitize_title_for_query()
elimina el final~~~
. Puede probar esto haciendo lo siguiente:Esto no es algo que pueda apagar. Hay un filtro en el
sanitize_title()
llamadosanitize_title
que se puede utilizar para alterar el comportamiento desanitize_title()
, pero eso es casi siempre no es una muy buena idea. La inyección de SQL es muy grave, por lo que dejar que algo se escape a través de las grietas debido al mal saneamiento puede tener una influencia realmente mala en la integridad de su sitio. El "exceso de saneamiento" a veces puede ser un dolor en el trasero.No estoy seguro de lo que buscas, pero sospecho que tal vez quieras 404 publicaciones individuales con esta tilde final, en tus palabras, "apágalo". La única forma en que puedo pensar en esta etapa es detener la consulta principal cuando tenemos estas tildes finales. Para esto, podemos filtrar la
posts_where
cláusula de la consulta principal.EL FILTRO
Nota: Solo consideré publicaciones singulares normales, y no páginas frontales estáticas o archivos adjuntos, puede extender el filtro para incorporar esto
POCAS NOTAS
El filtro anterior devolverá una página 404 cuando tengamos una URL como
https://mywordpresssite.com/my-permalink~~~~~~
. Sin embargo, al eliminarremove_action( 'template_redirect', 'redirect_canonical' );
del filtro, puede hacer que la consulta redirija automáticamentehttps://mywordpresssite.com/my-permalink
y muestre la publicación única debido aredirect_canonical()
que se engancha atemplate_redirect
qué maneja la redirección de los 404 generados por WordPressfuente
Sí, parece extraño que debamos tener la misma coincidencia para:
y por ejemplo
Por qué esto es posible, parece ser esta parte del
WP_Query::get_posts()
método:donde
sanitize_title_for_query()
se define como:Debería ser posible hacer esto más estricto con el
sanitize_title
filtro, pero podría no ser una buena idea anular la salida predeterminada, basada ensanitize_title_with_dashes
, que es responsable del saneamiento aquí. Debería considerar crear un ticket en lugar de cambiarlo, si ya no hay información actualizada sobre este comportamiento.Actualizar
Me pregunto si podríamos limpiar el ruido de la corriente con la ruta
sanitize_title_for_query()
y redirigir a la URL limpia si es necesario.Aquí hay una demostración con la que puede jugar en su sitio de prueba y ajustarla a sus necesidades:
Incluso podría ser mejor usar
sanitize_title_with_dashes()
directamente para evitar los filtros y reemplazar:con:
ps: Creo que aprendí este truco, para obtener la ruta actual con un vacío
add_query_arg( [] )
, de @gmazzap ;-) Esto también se observa en el Codex. Gracias de nuevo a @gmazzap por el recordatorio de usaresc_url()
cuando se muestra la salida deadd_query_arg( [] )
oesc_url_raw()
cuando, por ejemplo, se redirige. Compruebe la referencia anterior del Codex para eso también.fuente
add_query_arg
debe ser escapado conesc_url
oesc_url_raw
para evitar problemas de seguridad ...Permítanme explicar el procesamiento de WordPress de una solicitud y un método para cambiar el comportamiento de WordPress para lograr sus objetivos en consecuencia.
Analizando la solicitud
Cuando WordPress recibe una solicitud, comienza un proceso de disección de la solicitud y la transforma en una página. El núcleo de este proceso comienza cuando
WP::main()
se llama al método de consulta principal de WordPress . Esta función analiza la consulta, como identificó correctamente, enparse_request()
(inincludes/class-wp.php
). Allí, WordPress intenta hacer coincidir la URL con una de las reglas de reescritura . Cuando la URL coincide, crea una cadena de consulta de las partes de la URL y codifica estas partes (todo entre dos barras) usandourlencode()
, para evitar que caracteres especiales como&
estropeen la cadena de consulta. Estos caracteres codificados pueden haberle hecho pensar que el problema residía allí, pero en realidad se convirtieron en sus caracteres "reales" correspondientes al analizar la cadena de consulta.Ejecutando la consulta asociada con la solicitud
Después de que WordPress haya analizado la URL, configura la clase de consulta principal
WP_Query
, que se realiza con el mismomain()
método de laWP
clase. La esencia deWP_Query
se puede encontrar en suget_posts()
método donde todos los argumentos de consulta se analizan y desinfectan y se construye la consulta SQL real (y, finalmente, se ejecuta).En este método, en la línea 2730, se ejecuta el siguiente código:
Esto desinfecta la publicación para obtenerla de la tabla de publicaciones. La salida de información de depuración dentro del bucle muestra que aquí es donde reside el problema: su nombre de publicación
my-permalink~
, se transforma enmy-permalink
, que luego se utiliza para recuperar la publicación de la base de datos.La función de desinfección del título de la publicación
La función
sanitize_title_for_query
llamasanitize_title
con los parámetros adecuados, lo que procede a desinfectar el título. Ahora el núcleo de esta función es aplicar elsanitize_title
filtro:Este filtro ha, en WordPress nativa, una única función que se le atribuye:
sanitize_title_with_dashes
. He escrito una extensa descripción de lo que hace esta función, que se puede encontrar aquí . En esta función, la línea que está causando el problema esEsta línea elimina todos los caracteres, excepto los caracteres alfanuméricos, espacios, guiones y guiones bajos.
Resolviendo tu problema
Entonces, básicamente hay una única forma de resolver su problema: eliminar la
sanitize_title_with_dashes
función del filtro y reemplazarla con su propia función. En realidad, esto no es tan difícil de hacer, pero :Lo más importante : WordPress usa el resultado de la
sanitize_title
función directamente en la consulta SQL por esta línea:¡Si alguna vez considera cambiar el filtro, asegúrese de escapar correctamente del título antes de que se use en la consulta!
Conclusión: resolver su problema no es necesario en lo que respecta a la seguridad, pero si desea hacerlo, reemplácelo
sanitize_title_with_dashes
con su propia funcionalidad y preste atención al escape de SQL.NB todos los nombres de archivos y números de línea corresponden a archivos de WordPress 4.4.2.
fuente
Algunas personas ya han explicado el problema, así que simplemente publicaré una solución alternativa. Debería ser bastante autoexplicativo.
Usted tendrá que hacer algo un poco diferente para este tipo de puestos jerárquicos embargo, ya que
WP_Query
se ejecutarápagename
a travéswp_basename
y luego desinfectar, asíquery_vars['pagename']
yget_query_var('pagename')
no coincidirán con los niños becuase este último no contiene la parte de los padres.Ojalá me
redirect_canonical
hiciera cargo de esta basura.fuente
ESTE ES EL ARREGLO ... PARA EL ERROR DE WORDPRESS SOLO AGREGUE EL BLOQUE DE MODOS DE SEGURIDAD DE COMENZAR por encima del BLOQUE generado por Wordpress.
fuente
Siempre puede intentar agregar agregando lo siguiente a su
.htaccess
archivo:La segunda línea de arriba debe ir justo debajo de la primera línea que se muestra. Debe evitar que se
index.php~
muestre en las URL.fuente