Prevenir acceso o eliminar automáticamente readme.html, license.txt, wp-config-sample.php
Una pregunta rápida que podría ayudar un poco con la seguridad. Noté que el archivo readme.html tiene el número de versión listado. Vuelve a aparecer después de cada actualización, al igual que licence.txt y wp-config-sample.php.
¿Existe una forma fácil de hacer que WordPress elimine automáticamente estos archivos después de una actualización?
Ya bloqueé el número de versión para que no aparezca en las metaetiquetas, feeds RSS, atom, etc.
Sé que este tipo de seguridad no es exactamente tan útil, pero pensé que podría ser un pequeño comienzo. Escuché que las personas pueden simplemente verificar la versión de jQuery incluida en WP-includes y compararla con la versión de WP que la incluyó.
No es necesario eliminar estos archivos. Es mucho más sencillo simplemente bloquear el acceso a ellos. Si estás usando URLs amigables, ya tienes un archivo .htaccess. Usar .htaccess para bloquear los archivos es seguro y solo necesitas añadir una directiva una vez.
Bloquear archivos se hace añadiendo una directiva a .htaccess así:
<files nombre-de-archivo.extensión>
order allow,deny
deny from all
</files>
Entonces, para bloquear readme.html haces esto:
<files readme.html>
order allow,deny
deny from all
</files>
Haz lo mismo con el archivo de licencia o cualquier otro archivo que quieras evitar que alguien acceda. Solo abre .htaccess en Notepad o cualquier otro editor de texto básico, añade las directivas y guarda, asegurándote de que el editor de texto mantenga el nombre del archivo exactamente - sin ningún .txt al final.

Esta es en realidad la opción con la que terminé optando. Funciona perfectamente.

Cuidado, ¡la sintaxis anterior solo es válida hasta Apache 2.2! A partir de Apache 2.4 y versiones posteriores, usa Require all denied
(reemplazando esas 2 líneas internas). Más detalles aquí

Aquí está mi propuesta:
RewriteRule (?:readme|license|changelog|-config|-sample)\.(?:php|md|txt|html?) - [R=404,NC,L]
- 404 (no existe) en lugar de 403 (prohibido) para evitar dar pistas sobre su existencia.
- también en subcarpetas (por ejemplo, temas y plugins, que podrían ofrecer oportunidades de ataque)
- insensible a mayúsculas/minúsculas, con extensiones flexibles, también captura README.html o license.html (siéntete libre de agregar sospechosos habituales como changelogs|faq|contributing)
Personalmente, también bloquearía:
RewriteRule \.(?:psd|log|cmd|exe|bat|c?sh)$ - [NC,F]
Notas:
- '?:' simplemente declara que el paréntesis no es de coincidencia (sin importancia).
- requiere que RewriteEngine esté
on
(lo más probable es que lo esté. sería raro usar WordPress sin esto... (enlaces permanentes feos, etc...)). - insertar antes de la sección
# BEGIN WordPress
en tu .htaccess

Gracias, descubrí la función php unlink y funciona, pero hay un problema. El hook que proporcionaste parece ejecutarse simplemente al visitar la sección de Actualizaciones bajo el Escritorio. ¿Hay otro hook para después de que ocurra la actualización?

Solución 2023
Si utilizas Apache
, actualmente en la versión 2.4.5x
, como tu servidor web y deseas optar por la ruta del archivo ".htaccess"
, aquí tienes algunas opciones (además de la respuesta de Frank) para hacerlo:
Devolver "Prohibido"
al usuario:
En este caso, el "usuario"/"hacker"/"adversario"/"pentester" descubriría que esos archivos existen en tu servidor, ¡pero no tiene acceso a ellos!
<FilesMatch "(?:readme|license|changelog|-config|-sample)\.(?:php|md|txt|html?)">
Require all denied
</FilesMatch>
Devolver "404"
al usuario:
En este caso, el "usuario"/"hacker"/"adversario"/"pentester", teóricamente, asumiría que esos archivos ¡ni siquiera existen en tu servidor!
<FilesMatch "(?:readme|license|changelog|-config|-sample)\.(?:php|md|txt|html?)">
Redirect 404
</FilesMatch>

Solución actual para WordPress, Actualizada 2025
Estoy combinando las respuestas/comentarios anteriores y aplicándolos a la pregunta actual (además de abordar las preocupaciones de seguridad de las respuestas previas).
RewriteRule (?:readme|license|changelog|-config|-sample)\.(?:php|md|txt|html?) index.php [L]
RewriteRule \.(?:psd|log|cmd|exe|bat|c?sh)$ index.php [L]
Usar index.php [L]
redirigirá todo a WordPress como la página 404 del sitio, en lugar de mostrar la página de error 403/404/etc del servidor web. Al hacer esto, el posible hacker no verá el cambio en la página de error que se muestra.
