Htaccess e Wordpress, alcune configurazioni particolarmente utili

Come configurare il file Htaccess in Wordpress: a cosa serve, come può essere sfruttato per migliorare la sicurezza del sito e aggiungere nuove funzionalità.

Su Apache HTTP Server il noto file .htaccess è utilissimo per molteplici scopi: creato all’interno di una specifica cartella, le direttive inserite nel file consentono di migliorare la sicurezza e personalizzare il comportamento del server web.
Il file .htaccess è lo strumento che permette, per esempio, di attivare l’autenticazione mediante inserimento di nome utente e password (ne abbiamo parlato nell’articolo File HTACCESS, come proteggere cartelle su Apache), attivare redirect e URL rewriting (la riscrittura automatica degli indirizzi digitati dall’utente).

Htaccess e WordPress

WordPress fa ampio uso del file Htaccess: appena installata la celeberrima piattaforma per il web publishing, nella directory radice del server si troverà infatti un file .htaccess, già preconfigurato con il seguente contenuto:


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

Questa configurazione consente di gestire i cosiddetti permalink di WordPress. Si supponga di richiamare una pagina o un articolo: si potrà farlo specificando semplicemente il suo nome (o meglio, il permalink scelto) dopo il dominio (esempio: www.nomedelsito.it/pagina-di-prova).
Nell’esempio la cartella pagina-di-prova non esiste sul server ma grazie all’URL rewriting è possibile far sì che venga gestita dal file PHP index.php.
Le varie regole indicano che quando il file index.php venisse direttamente richiamato, il rewriting non deve avvenire (nessun’altra regola deve essere eseguita: [L]); escludono file e directory che esistono realmente sul file system lato server; infine, qualunque indirizzo deve essere riscritto facendo perno sul file index.php.

Vediamo, di seguito, qualche altra regola interessante che può essere eventualmente aggiunta all’interno del file Htaccess di WordPress.

Disattivare l’accesso alla funzionalità XML-RPC

Attraverso l’utilizzo di XML-RPC, WordPress permette servizi di pingback, trackback e l’accesso remoto ad alcuni utenti. RPC è l’acronimo di Remote Procedure Call: XML-RPC utilizza HTTP per trasportare le informazioni ed XML per codificare i dati.

XML-RPC fa parte di WordPress dalla “preistoria” ma nel corso del tempo è stato ripetutamente sfruttato, da parte di malintenzionati per intentare attacchi brute force, tesi a risalire ai dati di autenticazione, o per sferrare aggressioni DoS (Denial of Service).
Ogni chiamata al file xmlrpc.php di WordPress è infatti piuttosto onerosa in termini di operazioni di lettura/scrittura e può quindi portare a un sovraccarico del server (causandone il conseguente crollo dei servizi).

Una buona soluzione consiste quindi nell’inserire ciò che segue in chiusura del file Htaccess di WordPress:

<FilesMatch "^(xmlrpc\.php)">
Order Deny,Allow
# Allow from xx.xx.xx.xxx
Deny from all
</FilesMatch>

Sostituendo al posto di xx.xx.xx.xxx l’IP statico della macchina che deve poter usare il file xmlrpc.php si potrà eventualmente concederne l’utilizzo (bisognerà ricordarsi anche di rimuovere il carattere # iniziale).

Proteggere l’amministrazione di WordPress con nome utente e password

È vero che la home page dell’area amministrativa di WordPress richiede già nome utente e password per l’accesso. Purtuttavia, di default qualunque utente ha pieno accesso a tutto il contenuto della cartella wp-admin di WordPress.
Il consiglio è sempre quello di aggiornare tempestivamente WordPress all’ultima versione e, quindi, di mantenere sempre aggiornato il CMS.
Può tuttavia accadere di non essere così solerti e che qualche vulnerabilità scoperta lato amministrativo possa essere sfruttata da parte di malintenzionati, da remoto.

Bloccando l’accesso via file system al contenuto della cartella di amministrazione di WordPress, si possono ridurre notevolmente i rischi perché tutti i file che operano le principali operazioni di scrittura sul database non saranno più pubblicamente accessibili.

Per procedere, basta creare un file .htaccess nella sottocartella wp-admin e inserirvi quanto segue:

AuthType Basic
AuthName "Area amministrativa"
AuthUserFile /percorsoserverweb/wp-admin/.htpasswd
require valid-user

Al posto di percorsoserverweb bisognerà indicare il percorso completo, sul file system lato server, per raggiungere la cartella wp-admin.
Tale percorso può variare a seconda del servizio di hosting o della configurazione del server dedicato/cloud che si sta utilizzando.

Contemporaneamente, dovrà essere creato un file .htpasswd (da memorizzare nella stessa cartella wp-admin) contenente i dati di autenticazione.
Per crearlo, si possono seguire le indicazioni riportate nell’articolo File HTACCESS, come proteggere cartelle su Apache.

Impedire la visualizzare del contenuto delle sottocartelle di WordPress

A seconda della configurazione del server web, in alcuni casi gli utenti remoti potrebbero avere la facoltà di ottenere l’elenco completo dei file presenti nelle sottocartelle di WordPress.
Si tratta, ovviamente, di un esempio lampante di cattiva configurazione del server web che andrebbe comunque risolto (deve essere presentato l’errore 403 “Forbidden” richiamando, per esempio, l’URL www.nomedelsito.it/wp-includes da browser).
Nel frattempo, comunque, si può “mettere una pezza” aggiungendo quanto segue al file Htaccess:

Options -Indexes

Negare l’ottenimento dei nomi utente usati in WordPress

Alcuni aggressori sono soliti interrogare WordPress per richiedere l’elenco di nomi utenti degli autori degli articoli.
Quest’informazione può essere sfruttata per sferrare attacchi brute force nel tentativo di risalire alle password corrispondenti.

Per negare quest’eventualità, basta aggiungere al file Htaccess di WordPress quanto segue:

RewriteCond %{QUERY_STRING} author=d
RewriteRule ^ /? [L,R=301]

Bloccare il cosiddetto hotlinking delle immagini

Per impedire che altri webmaster possano utilizzare direttamente le immagini pubblicate nelle pagine del vostro sito WordPress (sfrutttando tra l’altro la vostra banda di rete), è possibile inserire quanto segue nel file Htaccess:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourwebsite.com [NC]
RewriteRule \.(jpe?g?|png|gif|ico|pdf|flv|swf|gz)$ - [NC,F,L]

Al posto di yourwebsite.com, bisognerà ovviamente effettuare la modifica del caso, sostituendo il nome a dominio del proprio sito WordPress.

Non consentire l’accesso diretto a temi e plugin

Com’è noto, anche temi e plugin devono essere sempre aggiornati: eventuali lacune di sicurezza, sfruttate da remoto, possono aprire la porta ad attacchi dagli effetti potenzialmente catastrofici.

Per bloccare l’accesso diretto a temi e plugin di WordPress da parte di terzi, è possibile inserire nel file Htaccess le seguenti direttive:

RewriteCond %{REQUEST_URI} !^/wp-content/plugins/file/to/exclude\.php
RewriteCond %{REQUEST_URI} !^/wp-content/plugins/directory/to/exclude/
RewriteRule wp-content/plugins/(.*\.php)$ - [R=404,L]
RewriteCond %{REQUEST_URI} !^/wp-content/themes/file/to/exclude\.php
RewriteCond %{REQUEST_URI} !^/wp-content/themes/directory/to/exclude/
RewriteRule wp-content/themes/(.*\.php)$ - [R=404,L]

Proteggere il contenuto della cartella wp-includes

Per ragioni molto simili a quelle precedentemente esplicitate, una buona idea è anche la protezione – mediante file Htaccess – della cartella wp-includes. Essa contiene infatti i componenti “core” di WordPress, necessari per il corretto funzionamento del CMS.

Ecco la regola da aggiungere al file Htaccess di WordPress:

<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>

Porre WordPress in manutenzione

In qualche frangente potrebbe rivelarsi utile porre l’intero sito in manutenzione. Grazie alle direttive che seguono, indipendentemente dal contenuto richiamato dagli utenti, verrà mostrata la pagina manutenzione.html.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123
RewriteCond %{REQUEST_URI} !/maintenance.html$ [NC]
RewriteCond %{REQUEST_URI} !\.(jpe?g?|png|gif) [NC]
RewriteRule .* /maintenance.html [R=503,L]
</IfModule>

È possibile anche indicare un indirizzo IP (effettuando le opportune variazioni) che non vedrà la pagina di manutenzione. In questo modo, si potrà ad esempio continuare a lavorare sul sito mentre gli utenti normali saranno sempre reindirizzati alla pagina con il messaggio di cortesia.

Impostare pagine di errore personalizzate

Le direttive riportate di seguito, anch’esse da aggiungere in calce al file Htaccess di WordPress, permettono di esporre delle pagine di errore personalizzate nel caso in cui dovessero presentarsi errori 403, 404 o 500:

ErrorDocument 403 /custom-403.html
ErrorDocument 404 /custom-404.html
ErrorDocument 500 /custom-500.html

Attivare dei reindirizzamenti permanenti dal vecchio al nuovo URL

Talvolta potrebbe essere necessario istruire il server web affinché effettui automaticamente dei reindirizzamenti permanenti (301) da un vecchio URL verso un nuovo indirizzo.
Per procedere, è sufficiente inserire – nel file Htaccess – quanto segue:

Redirect 301 /vecchioURL1/ http://www.urldelsito.com/nuovoURL1
Redirect 301 /vecchioURL2/ http://www.utldelsito.com/nuovoURL2

Attivare il caching delle immagini da parte del browser client

Per velocizzare i successivi caricamenti del contenuto del sito WordPress e impegnare meno banda di rete, è consigliabile attivare il caching delle immagini e delle altre risorse statiche che compongono le pagine. Le seguenti indicazioni, permetteranno di evitare un nuovo caricamento degli stessi contenuti durante le visite successive:

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 2 days"
</IfModule>

Inutile dire che l’accesso diretto al contenuto del file .htaccess dovrebbe essere impedito lato server. Per arrivare allo stesso risultato, si può aggiungere quanto segue al contenuto del file ma se ciò non fosse già previsto lato server, suggeriamo di valutare un altro servizio di hosting.

<Files ~ "^.*\.([Hh][Tt][Aa])">
Order Allow,Deny
Deny from all
Satisfy all
</Files>

Ti consigliamo anche

Link copiato negli appunti