Login

Home Tips & Tricks Login con PHP

Login con PHP

di Gianni Tomasicchio - Lunedì 04 Maggio 2009 21:44

Realizzare uno script PHP per effettuare il login degli utenti è un compito piuttosto semplice per un programmatore PHP con un po' di esperienza. Gli sviluppatori alle prime armi possono invece incontrare qualche difficoltà.

Lo script che viene proposto di seguito vuole essere quindi un punto di partenza per i neofiti che li guidi alla realizzazione del proprio sistema di login con PHP. La complessità è stata ridotta al minimo per rendere lo script maggiormente comprensibile, ma non per questo a rischio sicurezza.

Per provare lo script di login proposto bisogna creare una tabella degli utenti ed inserire almeno un record. Ecco i comandi SQL necessari, da eseguire ad esempio con phpMyAdmin.

CREATE TABLE `utenti` (
   `id` INT(11) NOT NULL AUTO_INCREMENT,
   `nome` VARCHAR(32) NOT NULL,
   `pswd` VARCHAR(32) NOT NULL,
   PRIMARY KEY  (`id`)
);

INSERT INTO utenti (nome, pswd) VALUES ('gianni', MD5('prova'));

I più attenti avranno notato che la password non viene memorizzata in chiaro nel database, bensì sotto forma di hash MD5.

Ed ecco lo script PHP di login:

<?php
$DB_host     = 'localhost';
$DB_user     = 'root';
$DB_password = 'secret';
$DB_name     = 'test';

$link = mysql_connect($DB_host, $DB_user, $DB_password);
if (!$link) {
	die ('Non riesco a connettermi: ' . mysql_error());
}

$db_selected = mysql_select_db($DB_name, $link);
if (!$db_selected) {
	die ("Errore nella selezione del database: " . mysql_error());
}

if($_POST) {
	effettua_login();
} else {
	mostra_form();
}

function mostra_form()
{
	// mostro un eventuale messaggio
	if(isset($_GET['msg'])) {
		echo '<b>'.htmlentities($_GET['msg']).'</b><br /><br />';
	}
	?>
	<form name="form_login" method="post" action="">
		<label>nome: <input name="nome" type="text" value="" /></label><br />
		<label>password: <input name="password" type="password" value="" /></label><br />
	    <input name="invia" type="submit" value="Invia" />
	</form>
	<?
}

function effettua_login()
{
	// recupero il nome e la password inseriti dall'utente
	$nome      = trim($_POST['nome']);
	$password  = trim($_POST['password']);
	// verifico se devo eliminare gli slash inseriti automaticamente da PHP
	if(get_magic_quotes_gpc()) {
		$nome      = stripslashes($nome);
		$password  = stripslashes($password);
	}

	// verifico la presenza dei campi obbligatori
	if(!$nome || !$password) {
		$messaggio = urlencode("Non hai inserito il nome o la password");
		header("location: $_SERVER[PHP_SELF]?msg=$messaggio");
		exit;
	}
	// effettuo l'escape dei caratteri speciali per inserirli all'interno della query
	$nome     = mysql_real_escape_string($nome);
	$password = mysql_real_escape_string($password);	

	// preparo ed invio la query
	$query = "SELECT id FROM utenti WHERE nome = '$nome' AND pswd = MD5('$password')";
	$result = mysql_query($query);
	// controllo l'esito
	if (!$result) {
		die("Errore nella query $query: " . mysql_error());
	}

	$record = mysql_fetch_array($result);

	if(!$record) {
		$messaggio = urlencode('Nome utente o password errati');
		header("location: $_SERVER[PHP_SELF]?msg=$messaggio");
	} else {
		session_start();
		$_SESSION['user_id'] = $record['id'];
		$messaggio = urlencode('Login avvenuto con successo');
		header("location: $_SERVER[PHP_SELF]?msg=$messaggio");
	}
}
?>

Analizziamo i punti principali dello script:

  • La prima parte del codice è dedicata alla connessione con il server MySQL ed alla selezione del database.
  • La funzione mostra_form() provvede a mostrare il form HTML nel quale l'utente inserisce il nome e la password
    • notare come vengono recuperati e visualizzati eventuali messaggi passati via $_GET['msg']
  • La funzione effettua_login() verifica le credenziali inserite:
    • vengono eliminati gli spazi bianchi con la funzione trim()
    • vengono eliminati gli eventuali caratteri di slash inseriti automaticamente da PHP con stripslashes()
    • viene verificata la presenza del nome e della password
    • viene effettuo l'escape dei caratteri speciali eventualmente presenti nel nome o nella password affinché possano essere inseriti con sicurezza all'interno della query
    • viene eseguita la query di ricerca del record con nome e password coincidenti con quelli specificati dall'utente. Nella query la password viene convertita nel suo hash MD5
    • L'eventuale record individuato dalla query viene letto con mysql_fetch_array()
    • Se la query non ha restituito risultati viene effettuato il redirect con la funzione header() e viene mostrato un messaggio di errore
    • Se la query ha avuto successo
      • viene avviata la sessione,
      • viene memorizzato l'id dell'utente loggato in sessione, utile nelle pagine successive per sapere se l'utente ha effettuato il login
      • viene effettuato il redirect con la funzione header() e viene mostrato un messaggio di sucesso

Come detto all'inizio, questo script vuole essere solo uno spunto, un'indicazione di massima su come realizzare un sistema id login con PHP e MySQL.

Commenti  

 
# Errore MySQLOspite 2009-08-30 15:45
salve a tutti mi sono interessato a questo tipo di scrpt allora l'ho aggiunto al mio sito ma sono ancora alle primissime armi con php e MySQL e vorrei sapere una cosa: ogni volta che provo ad avviare la pagina web contenente lo script mi esce questo messaggio di errore: Non riesco a connettermi: Lost connection to MySQL server during query perchè?? come faccio a risolverlo?? il database l'ho rinominato test.frm è giusto?? come sito gli ho dato littlehacker.altervista.org è giusto??
Rispondi | Rispondi con citazione | Citazione
 
 
# RE: Login con PHPfilippo 2010-03-13 18:37
ma la crete table come viene salvata?
Rispondi | Rispondi con citazione | Citazione
 
 
# non è difficileaser 2010-06-19 13:08
dovete solo modificare:
$DB_host = 'localhost';
$DB_user = 'root';
$DB_password = 'secret';
$DB_name = 'test';

con i vostri dati cioè io per esempio ho come host me stesso (localhost) come username ciao come password aser e il nome del database utenti:
$DB_host = 'localhost';
$DB_user = 'ciao';
$DB_password = 'aser';
$DB_name = 'utenti';
Rispondi | Rispondi con citazione | Citazione
 
 
# mi da un errorericcardo 2010-07-08 15:47
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs \php\bachecaAVP S\login.php:3) in C:\xampp\htdocs \php\bachecaAVP S\login.php on line 86

mi può spiegare come mai?

Grazie
Rispondi | Rispondi con citazione | Citazione
 
 
# Plain textgg 2010-07-20 15:52
il problema è che copiando lo spezzone di codice, ti trascini dietro anche "caratteri invisibili" (speciali) e battiture di enter dovute alla alla formattazione del blog.
Chiedi se ti possono fornire una versione del codice plain/text
Rispondi | Rispondi con citazione | Citazione
 

Aggiungi commento


Codice di sicurezza
Aggiorna