lunedì 12 novembre 2012

Creare un login sicuro con PHP e MySQL pt. 1/4

Cari amici oggi vi propongo il primo di 4 articoli su come costruire un interessante forma di login in PHP e MySQL. Il tema centrale del tutorial proposto non è tanto la grafica, che potrete ovviamente modificare e personalizzare a vostro piacimento, ma la sicurezza! Vedremo, infatti, i migliori metodi per criptare le password, per resistere ai brute force e per difenderci dalle SQL injection. A fine articolo troverete anche il codice sorgente pronto all'uso!

Impostare il server locale

In questo primo articolo vedremo come configurare il nostro database MySQL e come effettuare una connessione sicura ad esso. Ovviamente vi ricordo, per chi non avesse praticità nel campo della programmazione client/server che, per provare le vostre pagine dinamiche in locale sul vostro pc, necessitate di PHP 5 e di MySQL 4.1.3 o successive release. Se siete utenti OSX vi rimando a questo articolo per effettuare l'installazione di XAMPP, altrimenti se utilizzate Windows, potete seguire questa semplice guida.

Configurare il database MySQL

1. Entriamo nella schermata di phpMyAdmin da uno di questi link.
N.B. Vi ricordo che per aprire la schermata di phpMyAdmin dovete avere il server XAMPP avviato! Se non sapete farlo o non lo avete ancora installato leggete la prima parte di questo articolo e seguite le guide nei link!

2. Cliccate sulla scheda SQL per accedere al pannello che ci permette di eseguire query. Vi apparirà una schermata come quella in figura


In questa casella di testo andremo ad inserire il codice per creare il nostro database:
CREATE DATABASE `secure_login` ;
Cliccate su 'esegui' per validare la query.

3. Creiamo un utente che abbia solo i permessi UPDATE, INSERT e SELECT. Questo passaggio impedirà che, nel caso un malintenzionato riesca ad accedere al vostro database MySQL, non avrà i permessi per eliminare o distruggere le vostre tabelle. Il codice per la creazione è il seguente:
CREATE USER 'sec_user'@'localhost' IDENTIFIED BY 'aZz7nmYt';
GRANT SELECT, INSERT, UPDATE ON `secure_login`.* TO 'sec_user'@'localhost';
In questo caso ho configurato i dati dell'utente in questo modo:

        username: sec_user
        password: aZz7nmYt

Ovviamente potete modificare questi dati con quelli di vostro piacimento. L'unico consiglio che vi do è quello di utilizzare password complesse. Per essere sicuri al 100% utilizzate questo generatore casuale online: http://bit.ly/TAZi5r.

4. Creiamo una tabella e denominiamola 'members'.
CREATE TABLE `secure_login`.`members` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  `username` VARCHAR(30) NOT NULL, 
  `email` VARCHAR(50) NOT NULL, 
  `password` CHAR(128) NOT NULL, 
  `salt` CHAR(128) NOT NULL
) ENGINE = InnoDB;
Come potete vedere la tabella è formata da 5 campi: id, username, email, password e salt.

5. Creiamo una tabella per memorizzare i tentativi di login per ogni singolo utente. Questo è il modo in cui si bloccheremo i tentativi di attacchi brute force.
CREATE TABLE `secure_login`.`login_attempts` (
  `user_id` int(11) NOT NULL,
  `time` VARCHAR(30) NOT NULL 
) ENGINE=InnoDB
6. Creiamo un utente di prova in questo modo:
INSERT INTO `secure_login`.`members` VALUES(1, 'test_user', 'test@example.com', '00807432eae173f652f2064bdca1b61b290b52d40e429a7d295d76a71084aa96c0233b82f1feac45529e0726559645acaed6f3ae58a286b9f075916ebf66cacc', 'f9aab579fc1b41ed0c44fe4ecdbfcdb4cb99b9023abb241a6db833288f4eea3c02f76e0d35204a8695077dcf81932aa59006423976224be0390395bae152d4ef');
I parametri utilizzati in questo esempio sono:

        username: test_user
        email: test@example.com
        password: 6ZaxN2Vzm9NUJT2y

Creiamo la pagina di connessione al database

Creiamo la prima delle nostre pagine PHP e chiamiamola db_connect.php. Questa conterrà il codice che useremo per la connessione al nostro database mySQL. Ovviamente possiamo includere questo file su qualsiasi pagina che si desidera collegare al database. Il codice da inserire è:
define("HOST", "localhost"); // L'host al quale volete connettervi.
define("USER", "sec_user"); // L'username del database
define("PASSWORD", "aZz7nmYt"); // La password del database
define("DATABASE", "secure_login"); // Il nome del database.
 
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);

CONCLUSIONI E SORGENTI

Così si conclude la prima delle quattro parti di questo tutorial. Per qualsiasi incomprensione o dubbio potete commentare questo articolo o inviarmi un email a noframe@lucapipolo.it. Potete anche scaricare tutto il codice sorgente da questo link. Alla prossima!

1 commenti:

  1. ho seguito tutta la guida, creato tutti i file (i sorgenti non sono più disponibili) ma non funziona :(
    ho provato anche ad inviare una mail a noframe@lucapipolo.it ma da Delivery Status Notification (Failure)‏

    Potete aiutarmi?

    RispondiElimina