Configurar seguridad y velocidad con .htaccess en WordPress


Hace tiempo que ando un poco cansado de plugins y mas plugins , en este caso, he visto como algun plugin de seguridad, realmente el 60% del trabajo lo realiza sobre el fichero htaccess, asi que me he decidido entre otras cosas a crear un fichero base en el que no necesite instalar ningun monstruito, esto no quiere decir que no vaya a usar plugins de seguridad sino que voy a usar algunos mas livianos algunos por descubrir aun y ademas al htaccess le voy a añadir opciones de compresión , cache y varias cosillas mas.

Este fichero 😛 lo podeis usar bajo vuestra responsabilidad jajaja. A mi no me llameis para decirme que os habeis cargado el WordPress.

Ire añadiendo poco a poco y comentando las lineas que se van añadienod y para que, aunque al final dejare un fichero completo.  Y me viene bien a mi para tener el mio y acordarme de por que hacia las cosas.

He querido dejar las lineas de los plugins que me las han ido escribiendo, para que os hagais una idea.

 

General

Url Bonitas

Esta opcion la pone por defecto WordPress al poner tus urls, no hace falta que las añadas

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Mejora de la Velocidad

Cache

# BEGIN Cache
<FilesMatch "\.(?i:ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf|x-html|css|xml|js|woff|woff2|ttf|svg|eot)(\.gz)?$">
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A0
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpg A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/ico A2592000
ExpiresByType image/svg+xml A2592000
ExpiresByType text/css A2592000
ExpiresByType text/javascript A2592000
ExpiresByType application/javascript A2592000
ExpiresByType application/x-javascript A2592000
</IfModule>
<IfModule mod_headers.c>
Header set Expires "max-age=2592000, public"
Header unset ETag
Header set Connection keep-alive
FileETag None
</IfModule>
</FilesMatch>
# END Cache

 Compresion o Gzip

Configuramos los tipos de ficheros a devolver y le indicamos que los devuelva comprimidos. Esta opcion tambien puede ponerse desde el servidor.

# BEGIN GzipWpFastestCache
<IfModule mod_deflate.c>
AddType x-font/woff .woff
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE font/opentype font/ttf font/eot font/otf
</IfModule>
# END GzipWpFastestCache

Mejora de la Seguridad

Desactivar XML-RPC

	# Disable XML-RPC - Security > Settings > WordPress Tweaks > XML-RPC
	<files xmlrpc.php>
		<IfModule mod_authz_core.c>
			Require all denied
		</IfModule>
		<IfModule !mod_authz_core.c>
			Order allow,deny
			Deny from all
		</IfModule>
	</files>

 

Proteger ficheros y directorios

# Disable Directory Browsing - Security > Settings > System Tweaks > Directory Browsing
    Options -Indexes
    <IfModule mod_rewrite.c>
        RewriteEngine On
        # Protect System Files - Security > Settings > System Tweaks > System Files
        RewriteRule ^wp-admin/includes/ - [F]
        RewriteRule !^wp-includes/ - [S=3]
        RewriteCond %{SCRIPT_FILENAME} !^(.*)wp-includes/ms-files.php
        RewriteRule ^wp-includes/[^/]+\.php$ - [F]
        RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F]
        RewriteRule ^wp-includes/theme-compat/ - [F]
        # Disable PHP in Uploads - Security > Settings > System Tweaks > Uploads
        RewriteRule ^wp\-content/uploads/.*\.(?:php[1-6]?|pht|phtml?)$ - [NC,F]
        # Filter Request Methods - Security > Settings > System Tweaks > Request Methods
        RewriteCond %{REQUEST_METHOD} ^(TRACE|DELETE|TRACK) [NC]
        RewriteRule ^.* - [F]
        # Filter Suspicious Query Strings in the URL - Security > Settings > System Tweaks > Suspicious Query Strings
        RewriteCond %{QUERY_STRING} \.\.\/ [NC,OR]
        RewriteCond %{QUERY_STRING} ^.*\.(bash|git|hg|log|svn|swp|cvs) [NC,OR]
        RewriteCond %{QUERY_STRING} etc/passwd [NC,OR]
        RewriteCond %{QUERY_STRING} boot\.ini [NC,OR]
        RewriteCond %{QUERY_STRING} ftp\:  [NC,OR]
        RewriteCond %{QUERY_STRING} http\:  [NC,OR]
        RewriteCond %{QUERY_STRING} https\:  [NC,OR]
        RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
        RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [NC,OR]
        RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
        RewriteCond %{QUERY_STRING} ^.*(%24&x).* [NC,OR]
        RewriteCond %{QUERY_STRING} ^.*(127\.0).* [NC,OR]
        RewriteCond %{QUERY_STRING} ^.*(globals|encode|localhost|loopback).* [NC,OR]
        RewriteCond %{QUERY_STRING} ^.*(request|concat|insert|union|declare).* [NC]
        RewriteCond %{QUERY_STRING} !^loggedout=true
        RewriteCond %{QUERY_STRING} !^action=jetpack-sso
        RewriteCond %{QUERY_STRING} !^action=rp
        RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in_.*$
        RewriteCond %{HTTP_REFERER} !^http://maps\.googleapis\.com(.*)$
        RewriteRule ^.* - [F]
        # Filter Non-English Characters - Security > Settings > System Tweaks > Non-English Characters
        RewriteCond %{QUERY_STRING} ^.*(%0|%A|%B|%C|%D|%E|%F).* [NC]
        RewriteRule ^.* - [F]
       
    </IfModule>
# END iThemes Security - Do not modify or remove this line

 

Proteger de comentarios

Aquí importante tenéis que sobreescribir localhost por el nombre de tu dominio 😛

Estas lineas las dejare desactivadas en el fichero base por si os lo descargáis que no tengáis problemas.

 # Reduce Comment Spam - Security > Settings > System Tweaks > Comment Spam
        RewriteCond %{REQUEST_METHOD} POST
        RewriteCond %{REQUEST_URI} /wp-comments-post\.php$
        RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
        RewriteCond %{HTTP_REFERER} !^https?://(([^/]+\.)?localhost|jetpack\.wordpress\.com/jetpack-comment)(/|$) [NC]
        RewriteRule ^.* - [F]

 

 

Fichero comprimido con el .htaccess

 

Apendices

Poco a poco sigo ampliando mi htaccess y en este caso muchos de los ataques vienen porque los malignos 😛 localizan los usuarios administradores. Lo hacen con una técnica muy simple que en este caso la comentaba boluda.com un sitio donde podréis encontrar cursos y tutoriales de WordPress muy buenos.

Si vosotros cogéis un WordPress y ponéis lo siguiente http://www.vuestrodominio.com?author=1 que es el primer usuario que se crea veréis que os da el nombre del usuario  y os mostrara la url quedando así  http://www.vuestrodominio.com/author/pepito/
Ya sabéis que es pepito el usuario así que no tenéis mas que intentar en el login probar claves 😛

con las siguientes lineas evitáis esto.

 

# Bloquear a los listillos que intentan descubrir vuestro author
RewriteCond %{QUERY_STRING} ^author=([0-9]*)
RewriteRule .* http://example.com/? [L,R=302]
  • no se incluye en el fichero estas lineas.