Magazine Lifestyle

PHP: visualizzare il sito web mentre è in manutenzione – versione 2

Creato il 24 maggio 2010 da Dymissy

Qualche settimana fa ho pubblicato un articolo su una semplicissima soluzione per consentire l’accesso in manutenzione ai soli addetti ai lavori. Da una seguente discussione con un utente è nata l’idea di migliorare lo script rendendolo più usabile e un pò più sicuro ma mantenendo la semplicità che lo contraddistingue al fine di non costringere il programmatore a destinare più tempo alla progettazione dell’area manutenzione rispetto al progetto stesso.

I problemi sollevati giustamente dall’utente Loige erano due:

  • Sicurezza
  • Usabilità espressa in termini di comodità nel dover aggiungere ad ogni pagina il parametro di accesso.

Vediamo quindi di fornire una versione leggermente modificata dello script che va a migliorare il problema di usabilità. Il problema della sicurezza è stato volutamente trascurato per un motivo importante. Rendere più sicuro lo script significa in qualche maniera dedicare abbastanza tempo alla sua realizzazione, a questo punto risulta molto più comodo realizzare un classico sistema di login che risolve il problema alla radice. In questo articolo, invece, vedremo una semplice soluzione adatta alla maggior parte delle situazioni di manutenzione temporanea.

 

La differenza sostanziale tra il plugin precedente e questo è il parametro mode. Nello script precedente, infatti, la pagina veniva visualizzata solo se presente tale parametro nell’URL della pagina. In questa soluzione lavoreremo con i cookie che ci eviteranno l’immissione manuale di tale parametro ad ogni link. La soluzione è realizzabile alla stessa maniera con le sessioni, il codice da modificare è davvero pochissimo.

Vediamo ora lo script.

index.php e maintenance.php

I due file utilizzati in precedenza risultano sostanzialmente gli stessi. L’unica modifica da apportare al file index.php o comunque a tutti i file del progetto è sostituire la prima riga di codice PHP con la seguente:

view sourceprint?

1 <?php include('maintenance_mode.php'); ?>

All’inizio del file maintenance.php che contiene il messaggio di manutenzione il codice resta lo stesso, ovvero:

view sourceprint?

1 header('HTTP/1.1 503 Service Temporarily Unavailable',true,503);

2 header('Status: 503 Service Temporarily Unavailable');

3 header('Retry-After: 172800'); //48ore

A questo punto andiamo a realizzare un altro file, che ho chiamato maintenance_mode.php, che andrà a verificare la presenza del cookie occupandosi anche di creare o rimuovere il cookie.

maintenance_mode.php

Questo file servirà per:

  • creare il cookie
  • eliminare il cookie
  • verificare la presenza del cookie

Il suo utilizzo più frequente sarà quello di essere richiamato all’interno delle altre pagine provvedendo a verificare che il cookie sia presente e correttamente settato. Vediamo prima però come creare ed eliminare il cookie.

view sourceprint?

1 //creazione e cancellazione cookie

2 if( preg_match('/maintenance_mode.php/', $_SERVER['PHP_SELF']) ) {

3  

4  if( $_GET['remove']==1 )  setcookie('maintenance','',time()-3600);

5  else setcookie('maintenance', md5($_SERVER['REMOTE_ADDR']), time()+3600);

6  

7  header('Location: index.php');

8  die();

9 }

Il codice verifica che lo script sia richiamato in maniera diretta anzichè essere richiamato da un file esterno. La sua chiamata diretta senza parametri (es. http://sito.com/maintenance_mode.php) servirà a creare un cookie con nome maintenance che conterrà l’indirizzo IP dell’utente criptato in md5. Lo stesso script, richiamato con il parametro GET remove=1 provvederà ad eliminare il cookie (es. http://sito.com/maintenance_mode.php?remove=1).

Quando il file viene richiamato da un altro file, invece, esso verifica la presenza del cookie e la sua corrispondenza con l’IP. Il codice necessario è il seguente:

view sourceprint?

1 //controllo visualizzazione pagina manutenzione

2 if( !isset($_COOKIE['maintenance']) || $_COOKIE['maintenance'] != md5($_SERVER['REMOTE_ADDR']) )

3  header('Location: maintenance.php');

Se non è presente il cookie o se non corrisponde l’indirizzo IP l’utente verrà reindirizzato alla pagina di cortesia, altrimenti visualizzerà la pagina correttamente.

Il codice completo del file maintenance_mode.php è il seguente:

view sourceprint?

01 //creazione e cancellazione cookie

02 if( preg_match('/maintenance_mode.php/', $_SERVER['PHP_SELF']) ) {

03  

04  if( $_GET['remove']==1 )  setcookie('maintenance','',time()-3600);

05  else setcookie('maintenance', md5($_SERVER['REMOTE_ADDR']), time()+3600);

06  

07  header('Location: index.php');

08  die();

09 }

10  

11 //controllo visualizzazione pagina manutenzione

12 if( !isset($_COOKIE['maintenance']) || $_COOKIE['maintenance'] != md5($_SERVER['REMOTE_ADDR']) )

13  header('Location: maintenance.php');

Conclusioni

La soluzione appena vista, a differenza della precedente, risolve il problema dell’usabilità consentendo di visualizzare le pagine senza dover immettere ogni volta un parametro manualmente. Ho scelto di criptare in md5 l’indirizzo IP del client come contenuto del cookie e questo può risultare un problema perchè ad una nuova connessione si ha la necessità di ricreare il cookie. La soluzione è facilmente risolvibile con la scelta di una chiave personalizzata che non cambia al variare dell’indirizzo. In questo caso la scelta è prettamente personale.

Lo script completo è disponibile al seguente link:

Download script


Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :

Dossier Paperblog

Magazines