Saltar al contenido

Mejor .htaccess para aumentar la seguridad de WordPress

  • Seguridad en WordPress

Mejor .htaccess para aumentar la seguridad de WordPress

El archivo .htaccess es un archivo de configuración utilizado por el servidor web Apache.

El archivo .htaccess es un archivo de texto plano que se coloca en la raíz de tu sitio web y contiene instrucciones que el servidor utiliza para manejar las solicitudes de los usuarios que visitan nuestro WordPress.

El archivo .htaccess es una herramienta muy poderosa que permite a los administradores de sitios web controlar y personalizar el comportamiento del servidor web, aumentar la seguridad, restringir accesos, proteger carpetas y mucho más.

Uno de los usos más comunes del archivo .htaccess en WordPress es la configuración de reglas de reescritura de URL, que permiten a los administradores crear URL amigables para los visitantes del sitio. Además, también se utiliza para controlar el acceso al sitio, establecer encabezados de seguridad, proteger archivos críticos, entre otras cosas.

En el caso de un sitio web WordPress, el archivo .htaccess puede utilizarse para aumentar la seguridad del sitio. Por ejemplo, puedes utilizarlo para bloquear el acceso a ciertas carpetas y archivos críticos, como la carpeta de inclusión de administrador y el archivo de configuración de la base de datos. También puedes utilizarlo para proteger el sitio de ataques de inyección de código y para forzar la conexión segura HTTPS.

Bloquear los archivos de includes. <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+.php - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule> # Desactivar la exploración de directorios Options All -Indexes # Proteger wp-config.php <files wp-config.php> order allow,deny deny from all </files> # Proteger .htaccess <files .htaccess> order allow,deny deny from all </files> # Protección contra ataques XSS <IfModule mod\_headers.c> Header set X-XSS-Protection "1; mode=block" </IfModule> # Protección contra MIME-sniffing <IfModule mod\_headers.c> Header set X-Content-Type-Options: "nosniff" </IfModule> # Forzar SSL #RewriteEngine On #RewriteCond %{HTTPS} off #RewriteRule ^(.\*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Sección titulada «Bloquear los archivos de includes. <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+.php - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule> # Desactivar la exploración de directorios Options All -Indexes # Proteger wp-config.php <files wp-config.php> order allow,deny deny from all </files> # Proteger .htaccess <files .htaccess> order allow,deny deny from all </files> # Protección contra ataques XSS <IfModule mod\_headers.c> Header set X-XSS-Protection "1; mode=block" </IfModule> # Protección contra MIME-sniffing <IfModule mod\_headers.c> Header set X-Content-Type-Options: "nosniff" </IfModule> # Forzar SSL #RewriteEngine On #RewriteCond %{HTTPS} off #RewriteRule ^(.\*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]»

Descripción de cada sección del código .htaccess usado para proteger WordPress.

Sección titulada «Descripción de cada sección del código .htaccess usado para proteger WordPress.»
  1. <IfModule mod_rewrite.c> y : Estas etiquetas indican que las siguientes líneas de código sólo deben ejecutarse si el módulo mod_rewrite de Apache está habilitado.
  2. RewriteEngine On: Habilitar el motor de reescritura de URL de Apache, necesario para usar reglas de reescritura.
  3. RewriteBase /: Establece la base para las reglas de reescritura.
  4. RewriteRule ^wp-admin/includes/ - [F,L]: Bloquea el acceso a cualquier archivo dentro de la carpeta wp-admin/includes.
  5. RewriteRule !^wp-includes/ - [S=3]: Esta regla indica que no se deben aplicar las siguientes tres reglas a la carpeta wp-includes.
  6. RewriteRule ^wp-includes/[^/]+.php$ - [F,L]: Bloquea el acceso a cualquier archivo PHP dentro de la carpeta wp-includes, excepto a los que están dentro de subcarpetas.
  7. RewriteRule ^wp-includes/js/tinymce/langs/.+.php - [F,L]: Bloquea el acceso a cualquier archivo PHP dentro de la carpeta wp-includes/js/tinymce/langs.
  8. RewriteRule ^wp-includes/theme-compat/ - [F,L]: Bloquea el acceso a cualquier archivo dentro de la carpeta wp-includes/theme-compat.
  9. Options All -Indexes : Deshabilita la lista de directorios de Apache. Esto significa que si alguien intenta acceder a un directorio en lugar de un archivo en tu sitio web, verá un error 403 (prohibido) en lugar de la lista de archivos en ese directorio.
  10. and : Este bloque protege el archivo wp-config.php, que contiene información importante sobre la configuración de tu sitio web, incluyendo las credenciales de la base de datos.
  11. <files .htaccess> and : Este bloque protege el propio archivo .htaccess de ser accedido por navegadores web.
  12. <IfModule mod_headers.c> and : Estas etiquetas indican que las siguientes líneas de código sólo deben ejecutarse si el módulo mod_headers de Apache está habilitado.
  13. Header set X-XSS-Protection “1; mode=block”:

Advertencia y recomendaciones sobre cambios en el .htaccess

Sección titulada «Advertencia y recomendaciones sobre cambios en el .htaccess»

Es importante que sepas que cualquier cambio en el archivo .htaccess debe ser realizado con precaución, ya que cualquier error de sintaxis puede causar problemas en el funcionamiento del sitio. Por esta razón, te recomiendo hacer una copia de seguridad del archivo antes de realizar cambios, eso lo puedes hacer simplemente duplicando el archivo antes de editarlo.

El código comienza bloqueando varios bots conocidos estableciendo variables de entorno para su user agent. Luego usa la directiva Limit en Apache para denegar el acceso a esos bots.

  • rogerbot
  • exabot
  • mj12bot
  • dotbot
  • gigabot
  • ahrefsbot
  • AhrefsBot
  • sitebot
  • ZoominfoBot
  • SemrushBot y sus variantes
  • Superfeedr bot
  • Cliqzbot
  • linkdexbot

Bloquea bots SetEnvIfNoCase User-Agent .*rogerbot.* bad_bot SetEnvIfNoCase User-Agent .*exabot.* bad_bot SetEnvIfNoCase User-Agent .*mj12bot.* bad_bot SetEnvIfNoCase User-Agent .*dotbot.* bad_bot SetEnvIfNoCase User-Agent .*gigabot.* bad_bot SetEnvIfNoCase User-Agent .*ahrefsbot.* bad_bot SetEnvIfNoCase User-Agent .*AhrefsBot.* bad_bot SetEnvIfNoCase User-Agent .*sitebot.* bad_bot SetEnvIfNoCase User-Agent .*ZoominfoBot.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-SA.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-BA.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-SI.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-SWA.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-CT.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-BM.* bad_bot SetEnvIfNoCase User-Agent .*Superfeedr bot.* bad_bot SetEnvIfNoCase User-Agent .*Cliqzbot.* bad_bot SetEnvIfNoCase User-Agent .*linkdexbot.* bad_bot Order Allow,Deny Allow from all Deny from env=bad_bot

Sección titulada «Bloquea bots SetEnvIfNoCase User-Agent .*rogerbot.* bad_bot SetEnvIfNoCase User-Agent .*exabot.* bad_bot SetEnvIfNoCase User-Agent .*mj12bot.* bad_bot SetEnvIfNoCase User-Agent .*dotbot.* bad_bot SetEnvIfNoCase User-Agent .*gigabot.* bad_bot SetEnvIfNoCase User-Agent .*ahrefsbot.* bad_bot SetEnvIfNoCase User-Agent .*AhrefsBot.* bad_bot SetEnvIfNoCase User-Agent .*sitebot.* bad_bot SetEnvIfNoCase User-Agent .*ZoominfoBot.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-SA.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-BA.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-SI.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-SWA.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-CT.* bad_bot SetEnvIfNoCase User-Agent .*SemrushBot-BM.* bad_bot SetEnvIfNoCase User-Agent .*Superfeedr bot.* bad_bot SetEnvIfNoCase User-Agent .*Cliqzbot.* bad_bot SetEnvIfNoCase User-Agent .*linkdexbot.* bad_bot Order Allow,Deny Allow from all Deny from env=bad_bot »

Evitando la indexación de directorios usando htaccess

Sección titulada «Evitando la indexación de directorios usando htaccess»

Luego se deshabilita la lista de archivos de directorios con la directiva Options -Indexes.

Evita la navegación e indexado de directorios Options -Indexes

Sección titulada «Evita la navegación e indexado de directorios Options -Indexes»

Después se implementan reglas para evitar el hotlinking de imágenes y otros assets. Se revisa el referrer y si no coincide con el dominio propio, se deniega el acceso.

Evitar hotlinking RewriteEngine on RewriteCond %{HTTP_REFERER} !^RewriteCond RewriteCond %{HTTP\_REFERER} !^http://(www\.)dominioaproteger.com/.\* [NC] RewriteRule .(gif|jpg|jpeg|bmp|zip|rar|mp3|flv|swf|xml|php|png|css|pdf)$ - [F]

Sección titulada «Evitar hotlinking RewriteEngine on RewriteCond %{HTTP_REFERER} !^ RewriteCond %{HTTP\_REFERER} !^http://(www\.)dominioaproteger.com/.\* [NC] RewriteRule .(gif|jpg|jpeg|bmp|zip|rar|mp3|flv|swf|xml|php|png|css|pdf)$ - [F]»

Para archivos como gif, jpg, etc. se hace un redirect 403.

En el caso específico de imágenes gif y jpg, se redirige a una imagen local con un mensaje contra el hotlinking.

Mostrar una imagen con un mensaje contra el hotlinking RewriteEngine on RewriteCond %{HTTP_REFERER} !^RewriteCond RewriteCond %{HTTP\_REFERER} !^http://(www\.)dominioaproteger.com/.\* [NC] RewriteRule .(gif|jpg)$ https://www.dominioaproteger.com/notemolestes.gif [R,L]

Sección titulada «Mostrar una imagen con un mensaje contra el hotlinking RewriteEngine on RewriteCond %{HTTP_REFERER} !^ RewriteCond %{HTTP\_REFERER} !^http://(www\.)dominioaproteger.com/.\* [NC] RewriteRule .(gif|jpg)$ https://www.dominioaproteger.com/notemolestes.gif [R,L]»

Bloqueando peticiones sospechosas a nuestra web usando el htaccess

Sección titulada «Bloqueando peticiones sospechosas a nuestra web usando el htaccess»

Finalmente se tienen varias reglas de redireccionamiento 403 para patrones de URLs que pueden indicar ataques o comportamientos maliciosos.

  • Cadenas muy largas
  • Secuencias sospechosas de caracteres
  • Intentos de acceso a archivos comunes de sistema
  • Referencias a código malicioso

Peticiones raras <IfModule mod_alias.c> RedirectMatch 403 (?i)([a-z0-9]{2000,}) RedirectMatch 403 (?i)(https?|ftp|php):/ RedirectMatch 403 (?i)(base64_encode)(.*)(() RedirectMatch 403 (?i)(=\’|=\%27|/\’/?). RedirectMatch 403 (?i)/($(&)?|\*|”|.|,|&|&?)/? RedirectMatch 403 (?i)(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\"\\\") RedirectMatch 403 (?i)(~|`|<|>|:|;|,|%|\\|\{|\}|\[|\]|\|) RedirectMatch 403 (?i)/(=|\&|_mm|cgi-|muieblack) RedirectMatch 403 (?i)(&pws=0|_vti_|(null)|{$itemURL}|echo(.*)kae|etc/passwd|eval(|self/environ) RedirectMatch 403 (?i).(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf) RedirectMatch 403 (?i)/(^|(wp-)?config|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell).php

Sección titulada «Peticiones raras <IfModule mod_alias.c> RedirectMatch 403 (?i)([a-z0-9]{2000,}) RedirectMatch 403 (?i)(https?|ftp|php):/ RedirectMatch 403 (?i)(base64_encode)(.*)(() RedirectMatch 403 (?i)(=\’|=\%27|/\’/?). RedirectMatch 403 (?i)/($(&)?|\*|”|.|,|&|&?)/? RedirectMatch 403 (?i)(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\"\\\") RedirectMatch 403 (?i)(~|`|<|>|:|;|,|%|\\|\{|\}|\[|\]|\|) RedirectMatch 403 (?i)/(=|\&|_mm|cgi-|muieblack) RedirectMatch 403 (?i)(&pws=0|_vti_|(null)|{$itemURL}|echo(.*)kae|etc/passwd|eval(|self/environ) RedirectMatch 403 (?i).(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf) RedirectMatch 403 (?i)/(^|(wp-)?config|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell).php »