Ciaoo oggi parliamo di come realizzare un piccolo sistema che permetta di rendere private alcuni settori del nostro sito.. ![]()
Per realizzare ciò abbiamo bisono dell’editor testuale notepad++ o il semplice notepad, ed ovviamente di un server per testare il tutto (se ti manca il server scarica xampp in modo da simularlo in locale).
Supponendo di avere gia tutti i “ferri” possiamo creare subito il nostro database, il quale raccoglierà i dati degli utenti e permettere quindi l’autenticazione degli stessi.
Nel database possiamo creare una tabella chiamata “user” o “utenti” il nome è indifferente..
io per comodità e per cercare di ripassare l’inglese ho usato “user”, in questa tabella dobbiamo inserire almeno 3 campi quali:
id (id univoco dell’utente assegnato automaticamente dal database)
username (scelta dall’utente deve essere univoca! puo anche essere l’indirizzo mail anch’esso deve essere univoco)
password (la password dell’utente che per correttezza e per evitare problemi sarà criptata)
io per comodità al posto dell’username insersco l’email (un po per farmi al famoso social network, facebook)
di seguito il codice sql per la creazione veloce della tabella
[sql]
CREATE TABLE IF NOT EXISTS `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`mail` text NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `user`
ADD UNIQUE INDEX `mail_UNIQUE` (`mail` ASC);
[/sql]
Fatto cio non ci resta che fare le pagine in php.
per creare un sistema semplice dobbiamo creare almeno 3 pagine.
La prima pagina verificherà se l’utente ha gia fatto il login e quindi mostrerà il contenuto riservato, se l’utente non ha fatto il login mosterà due campi con un bottone e chiederà i dati di accesso (chiameremo questa pagina index.php).
La seconda pagina permetterà di verificare la presenza dell’utente nel database, e creerà la sessione, permettendo all’utente di accedere all’area riservata (chiameremo questa pagina login.php).
La terza pagina invece servirà per fare registrare l’utente (chiameremo questa pagina reg.php).
Di seguito i sorgenti delle tre pagine
[php title="index.php"]
<?
session_start();
if (isset($_SESSION["autenticato"])){
if ($_SESSION["autenticato"]!=1){
?>
<form action="login.php" method="post">
Email <input type="text" name="mail" /><br />
Password <input type="password" name="pass" /><br />
<br />
<input type="submit" value="accedi" />
</form>
<?
}else{
?>
<center><h1>Area Riservata</h1></center>
<?
}
}else{
?>
<form action="login.php" method="post">
Email <input type="text" name="mail" /><br />
Password <input type="password" name="pass" /><br />
<br />
<input type="submit" value="accedi" />
</form>
<?
}
?>
[/php]
[php title="login.php"]
<?
session_start();
$host="tuo host";
$user="tua user";
$dbname="tuo db";
$pass="tua pass";
$link = mysql_connect($host,$user,$pass);
$db=mysql_select_db($dbname,$link);
$login=0;
if (isset($_GET["action"])){
if ($_GET["action"]=="entra"){
$email=trim($_POST["email"]);
$password=trim($_POST["password"]);
$sql="SELECT * FROM user WHERE mail=’".$email."’ and password=MD5(‘".$password."’) and admin=1";
$res=mysql_query($sql);
$num=mysql_num_rows($res);
if ($num==1){
$row = mysql_fetch_array($res);
session_regenerate_id();
$login=1;
//registra la sessione memorizzando l’email, e l’id dell’utente
$_SESSION["autenticato"]=1;
session_write_close();
}
mysql_close();
header("Location: index.php");
}
}
if ($login!=1){
header("Location: index.php");
}
?>
[/php]
[php title="reg.php"]
<form action="?reg=1" method="post">
Email: <input type="text" name="mail" /><br />
Password: <input type="text" name="pass" /><br />
<br />
<input type="submit" value="registrami" />
</form>
<?
$host="tuo host";
$user="tua user";
$dbname="tuo db";
$pass="tua pass";
if (isset($_GET["reg"])){
$email=$_POST["mail"];
$pass=$_POST["pass"];
$link = mysql_connect($host,$user,$pass);
$db=mysql_select_db($dbname,$link);
$sql="INSERT INTO user (mail,password) VALUES (‘".$mail."’,MD5(‘".$pass."’))";
mysql_query($sql);
echo "utente <b>".$mail."</b> Registrato!<br />";
mysql_close();
}
?>
[/php]
Spero di essere stato utile a qualcuno… ![]()
Se hai un dubbio o vuoi dare un suggerimento per migliorare il sistema.. o ampliarlo non esitare a scrivere..
usando i commenti..

Mmmm a prima vista sembra vulnerabile come sistema, innanzitutto metterei i dati di connessione al database in un file “config.php” protetto da htaccess, inoltre nella sessione oltre alla flag di autenticazione metterei anche l’id dell’account autenticato, in modo che se in un secondo momento si vogliano settare dei permessi non ci sono malintenzionati che giocano sugli account.
Per il resto nulla da dire, un ottimo sistema
[php]
if ($_GET["utente"]=="utente1")
[/php]
per ogni utente che vuole l’accesso…. xd
Occhio che usando solo trim sei vulnerabile alle sql injection… in pratica ti hackano il sito in 2 secondi… prova a fare:
username: admin ‘ or 1=’1 /*
password: ciao
E fai login usando il tuo metodo, vedrai che entri lo stesso =D
Usa mysql real escape per fare l’escape dei caratteri al posto di trim. E tutto si risolve.
Ad ogni modo può essere un buon punto di partenza =D
Nel sistema che ho presentato si..
ma visto che serve solo a scopo informativo..
xd
se vuoi provalo anche tu..
lo trovi a questo indirizzo..
http://www.vincenzolarosa.it/news/admin.php ..
fammi sapere.. e nel caso provvedo..
ho appena provato a farlo nello script che sto realizzando conto terzi.. e sembra funzionare… o meglio nn fa entrare…
Dipende dalla configurazione di php, sicuramente non è il massimo farlo cosi.
Be si..
questo è solo un modo (il più semplice) per dire che si può fare questa cosa
ed ovviamente è fatta in modo semplice per farla capire ed usare a tutti
Si bhè se hai usato real escape sei protetto =D
Altra cosa, se posso permettermi, usa un sistema per crittografare la password (sha1 o md5) via sql! altrimenti uno ti fa un brute force e ti gabba la password in chiaro…
Quindi mi consigli di fare l’MD5 via sql?..
almeno per il momento a quel link l’eventuale registrazione (con password) di un utente.. sarà fatta solo dall’admin, per permettere ad altre persone di gestire l’eventuale newsletter..
ma comunque lasciando stare il discorso delle news..
solitamente da qualche settimana uso
[sql]
INSERT INTO tabella (mail,pass) VALUES (‘mail@sitoweb.it’,MD5(‘password’));
[/sql]
io personalmente uso sha1, però alcuni colleghi preferiscono md5. La sicurezza assoluta si ha facendo doppio (sia sql che php) md5 o sha1.
Non ci avevo pensato, mi hai dato un ottima idea che userò per i prossimi script…
adesso vado a studiarmi anche sha1..
per cercare di capire come funziona l’algoritmo..
Di nulla collega ^^
Ciao Vincenzo e Riccardo Mel;
Vorrei chiedervi una cosa. Ho fatto un sistema di login basandomi su un db e criptazione con md5 della password. Funziona tutto perfettamente. Solo che mi sorge un problema. Se pincopallino fa unamodifica sulla paginaris, pincopallino2 che si connette, vede la modifica effettuata da pincopallino. Invece, secondo me, pincopallino due deve avere la sua paginars, personale e farci quello che vuole. Poi saraà pincopallino 2 a decidere se accettare pincopallino come amico oppure no, ma solo in quel caso che accetta come amico può vedere la paginaris. O a meno che, non la rende pubblica. Stesso discorso vale per pincopallino. Come posso gestire la questione ???
dovresti aggiungere un paio di tabelle al database..
la prima deve essere “relazioni” nella quale inserisci che tizio e amico di caio… quindi se tizio invia la richiesta di amicizia a caio nella tabella andrai ad inserire un record con l’id del richiedente l’id del “destinatario” e lo stato 1 – accettata e 0 – in attesa di risposta o non accettata…
nella seconda che puoi chiamare “pagine” inserisci tutti i dati della pagina ed aggiungi un campo con scritto pubblica o meno… nella pagina andrai a fare un doppio controllo e verifichi se la pagina e pubblica o se l’autore della pagina è amico dell’utente che vuole vederla se una delle due condizioni è vera allora mostri il contenuto della pagina.. altrimenti dai un messaggio col quale avvisi l’utente che la pagina non è disponibile.
in linea di massima è questo quello che dovresti fare…
Ciao Enzo;) in azienda ho realizzato un sistema di autenticazione PHP+ Active Directory, vengono confrontante le credenziale utente, se esistono nel db di AD (e se l’utente è attivo), viene autenticato. Ora ti chiedo, se l’autenticazione avviene, posso comunque memorizzare alcuni dati e valorizzare delle variabili globali richiamabili con $_SESSION?
grazie, ciao
Certo che puoi cosi facendo memorizzi le informazioni che ti interessano e che non cambiano con le sessioni.. e riduci le richieste al server
Perfetto! la tua mail è sempre la stessa?ho una cosa da chiederti, ma preferirei in privato…
si sempre la stessa
enzo[at]vincenzolarosa[dot]it
Ti ho scritto ora
scusa se te lo dico ma la tabella a me non funziona come devo chiamarlo il file in cui la metterò perchè o provato in tutti i modi ma non ci sono riuscito!!
e poi come faccio a creare un area riservata? perchè così ho creato solo il login giusto?
la tabella non la metti dentro un file.. ma va messa dentro il database..
si ma io ho un sito altervista quindi non so dove si trovi il suo database sapresti per caso dirmelo tu?
io è da una vita che non uso altervista.. prova a dare un occhiata qua http://it.altervista.org/wiki/index.php/FAQ fammi sapere se risolvi..
sono entrato nel database di altervista ma adesso come faccio per inserire il codice php che mi hai dato? sono andato su import e ho caricato un file di nome user.php con dentro il codice ho provato ha registrarmi nel mio sito ma dopo essermi registrato ho visto che fa fare a qualsiasi persona il login anche se non è registrata!! come posso fare? potresti spiegarmi i passaggi da fare? se lo farai grz!!
ps. Hai una grande pazienza!!
se vuoi aggiungimi su skype o facebook e risolviamo il tutto velocemente..
i miei contatti sono
skype: larosa.vincenzo.castelvetrano
facebook: facebook.com/dogirds
volevo anche dirti che dopo aver importato il file il database mi dice:
Errore
query SQL:
ALTER TABLE `user` ADD UNIQUE INDEX `mail_UNIQUE` ( `mail` ASC ) ;
Messaggio di MySQL:
#1170 – BLOB/TEXT column ‘mail’ used in key specification without a key length
rispondi per favore
Contattami…
skype: larosa.vincenzo.castelvetrano
facebook: facebook.com/dogirds
Anche io ho un database con altervista, i 3 file index.php login.php e reg.php li ho creati direttamente con altervista in gestione file
puoi spiegarmi come faccio a creare la tabella e come la carico sul database?
Come ho detto in un commento sopra io è da un po che non uso altervista.. ma puoi comunque provare a leggere le faq che trovi qua http://it.altervista.org/wiki/index.php/FAQ