PDA

View Full Version : PHP] HELP Login


Pro7on
26-09-2006, 20:48
Ciao a tutti, dovrei fare un login in php del tipo che chi si logga ha una voce in piu nel menu come si potrebbe fare ?

Thx Ciao

es.

Menu: HOME-guide-immagini-.. ===> Login ==> HOME-guide-immagini-Admin-..

:D

mamo139
26-09-2006, 21:04
con le sessioni
http://it2.php.net/manual/it/ref.session.php
se il log in è corretto allora imposti l'utente come loggato e con un controllo delle sessioni tipo if(isset($_SESSION['login'])) echo "admin"; lo fai comparire

Pro7on
26-09-2006, 21:17
con le sessioni
http://it2.php.net/manual/it/ref.session.php
se il log in è corretto allora imposti l'utente come loggato e con un controllo delle sessioni tipo if(isset($_SESSION['login'])) echo "admin"; lo fai comparire


MMm thx provo un po e posto poi i problem

Thx;)

Pro7on
26-09-2006, 21:32
e nn mi e molto chiaro :confused: :confused:

in pratica devo fare un ciclo che mi dice se il nome utente e giusto confronto al user e pas che ci sono su un db, e in caso di si quidni isset.... mostra admin ...??? teoria giusta??

andbin
26-09-2006, 22:14
e nn mi e molto chiaro :confused: :confused:

in pratica devo fare un ciclo che mi dice se il nome utente e giusto confronto al user e pas che ci sono su un db, e in caso di si quidni isset.... mostra admin ...??? teoria giusta??Il form di login richiama una pagina che si deve occupare di autenticare l'utente. L'autenticazione la puoi fare in mille modi diversi, non c'è una regola. Dipende se la fai usando un db degli utenti, dipende dal tipo di db, da come è fatta la tabella, ecc....
Alla fine della fiera, saprai se l'utente è autenticato oppure no. Se lo è, imposti una variabile di sessione del tipo:

$_SESSION['loggato'] = "yes";

Il valore non è molto importante. Puoi anche mettere altre variabili di sessione che tengono per comodità, ad es. il nome dell'utente, il testo di benvenuto, ecc...

Da quel momento, per tutte le pagine richieste durante la sessione, puoi fare:

if (isset ($_SESSION['loggato'])) {
....
}

mamo139
26-09-2006, 22:18
usare le sessioni è utilissimo xche nn sono altro che variabili che mantengono il loro valore di pagina in pagina...
l'unica clausula è chiamare in ogni pagina prima del loro utilizzo la funzione session_start()

wisher
27-09-2006, 09:35
mi accodo con una domanda, secondo voi come è meglio memorizzare le password nel database, in formato testo o (come credo) solo la hash della password?
mi potreste dare qualche indicazione

andbin
27-09-2006, 09:41
come è meglio memorizzare le password nel database, in formato testo o (come credo) solo la hash della password?Hash, MD5 o meglio ancora SHA1.

wisher
27-09-2006, 10:00
Hash, MD5 o meglio ancora SHA1.
grazie, adesso provo partendo da qui (http://it2.php.net/sha1)

wisher
27-09-2006, 10:17
funziona tutto, però vorrei una piccola precisazione:
dato che sha1 genera una hash da 40 caratteri esadecimali e il tutto viene ad occupare 240 bit è giusto nel database mySql dare un tipo di dato binary 240 o c'è qualcosa di + adatto?

andbin
27-09-2006, 11:04
funziona tutto, però vorrei una piccola precisazione:
dato che sha1 genera una hash da 40 caratteri esadecimali e il tutto viene ad occupare 240 bit è giusto nel database mySql dare un tipo di dato binary 240 o c'è qualcosa di + adatto?La funzione sha1() ti ritorna una stringa di 40 caratteri. Con PHP5 puoi passare il parametro raw_output=TRUE per ottenere il valore binario lungo 20 byte. In ogni caso, anche con solo PHP4, nulla ti vieta di ottenere in qualche modo il valore binario dalla stringa.

A questo punto la scelta è: memorizzare la stringa (40 caratteri / 320 bit) oppure memorizzare il valore binario (20 byte / 160 bit). Nel primo caso potresti dichiarare il campo come CHAR(40), nel secondo caso potresti usare BINARY(20). Nota: mi sto riferendo a MySQL.

Vedi tu cosa ti è più comodo.

mummolo
15-03-2007, 20:49
Scusate la domanda!
Ma se un utente ha effettuato correttamente il login,come faccio a reindirizzarlo in un'altra pagina?
Mi spiego meglio...
Siamo nella pagina autenticazione.php;ora voglio che se l'utente ha effettuato correttamente il login,una volta confrontati i dati con un database,mi venga aperta la pagina (a.php),altrimenti se il login non è corretto mi venga aperta la pagina (b.php).

Sapreste aiutarmi gentilmente?!
Spero di essere stato chiaro!!

andbin
15-03-2007, 20:56
Scusate la domanda!
Siamo nella pagina autenticazione.php;ora voglio che se l'utente ha effettuato correttamente il login,una volta confrontati i dati con un database,mi venga aperta la pagina (a.php),altrimenti se il login non è corretto mi venga aperta la pagina (b.php).Con:

header("Location: blabla");

mummolo
15-03-2007, 21:13
Perfetto,funziona!!!Grazie mille!

mummolo
15-03-2007, 22:36
scusate e per proteggere le pagine come posso fare?
nel senso per far accedere a determinare pagine solo le persone che hanno effettuato correttamente il login come posso fare?
vorrei far questo perche altrimenti inserendo semplicemente il nome della pagina nel browser si potrebbe cmq aver accesso alla pagina "aggirando" cosi il login!!
Grazie a tutti per eventuali risposte

andbin
16-03-2007, 09:31
scusate e per proteggere le pagine come posso fare?
nel senso per far accedere a determinare pagine solo le persone che hanno effettuato correttamente il login come posso fare?
vorrei far questo perche altrimenti inserendo semplicemente il nome della pagina nel browser si potrebbe cmq aver accesso alla pagina "aggirando" cosi il login!!Fai un semplice script che dovrai includere (con include o require) in ogni pagina .php.

Un esempio:
session_start ();

if (!isset ($_SESSION['LOGGATO']))
{
header ("Location: http://blabla/login.php");
exit;
}Altrimenti lo script continua e il resto della pagina viene inviato.

E ovviamente se il login ha successo, imposti $_SESSION['LOGGATO'].

mummolo
16-03-2007, 09:58
Ok,grazie per la risposta!!!
Oggi se ho un po di tempo lo provo e posto i risultati!!
Ciao e grazie :D

andbin
16-03-2007, 10:09
Ok,grazie per la risposta!!!Prego. Comunque, indipendentemente da come poi implementerai la cosa, il concetto è molto semplice: sei loggato? allora invia tutta la pagina. Non sei loggato? Allora rimanda alla pagina di login, non inviare la pagina e termina lo script.

mummolo
16-03-2007, 10:52
;) credo di aver chiaro il concetto!
L'unico dubbio è se il valore di $_SESSION lo devo impostare nella pagina nella pagina di autenticazione e poi controllarne il valore in quella da aprire giusto?

andbin
16-03-2007, 11:12
L'unico dubbio è se il valore di $_SESSION lo devo impostare nella pagina nella pagina di autenticazione e poi controllarne il valore in quella da aprire giusto?Sì, esatto. Il concetto è che devi avere un "qualcosa" che imposti in un certo modo solo quando si è loggati. Dopodiché testi quel "qualcosa" per stabilire se si è loggati o meno. E in genere appunto è una variabile di sessione.

Poi come gestire il rimando al login, dipende molto da come è strutturato il sito. Mi spiego meglio: se si ha una unica pagina apposita per il login, allora è abbastanza logico reindirizzare a quella pagina se non si è loggati.
Se invece il modulo di login è incorporato in ogni pagina (ad esempio nell'header) come in certi siti di e-commerce, allora non devi fare alcun rimando ma semplicemente inviare la pagina in cui in quell'area ci sarà o il modulo di login o un qualcosa ad esempio del tipo "Benvenuto XYZ" con un pulsante di logout se si è loggati.

Insomma ... per fare la gestione di un login non c'è uno standard preciso, dipende da molti fattori: la struttura del sito, l'interazione tra le varie pagine, ecc...

mummolo
16-03-2007, 13:11
Sì, esatto. Il concetto è che devi avere un "qualcosa" che imposti in un certo modo solo quando si è loggati. Dopodiché testi quel "qualcosa" per stabilire se si è loggati o meno. E in genere appunto è una variabile di sessione.

Poi come gestire il rimando al login, dipende molto da come è strutturato il sito. Mi spiego meglio: se si ha una unica pagina apposita per il login, allora è abbastanza logico reindirizzare a quella pagina se non si è loggati.
Se invece il modulo di login è incorporato in ogni pagina (ad esempio nell'header) come in certi siti di e-commerce, allora non devi fare alcun rimando ma semplicemente inviare la pagina in cui in quell'area ci sarà o il modulo di login o un qualcosa ad esempio del tipo "Benvenuto XYZ" con un pulsante di logout se si è loggati.

Insomma ... per fare la gestione di un login non c'è uno standard preciso, dipende da molti fattori: la struttura del sito, l'interazione tra le varie pagine, ecc...



Scusa una domanda!
Ma come faccio a passare il valore $_SESSION['LOGGATO'] dalla pagina di autenticazione allo script che vigila sulle pagine???
Inoltre come faccio ad impostare una variabile $_SESSION['NON_LOGGATO'] nella pagina che voglio proteggere la pagina da evetuali accessi?
Mi spiego meglio... se volessi far accedere alla pagina a.html solo un utente loggato,affinche altri non entrino in questa pagina cosa dovrei fare?Impostare $_SESSION['NON_LOGGATO'] nella pagine a.html ed inserire successivamente a tale istruzione la require dello script di controllo??Se cosi fosse,php,quando riceve una chiamata di un utente loggato riesce a sovrascrivere questa variabile?

andbin
16-03-2007, 13:30
Scusa una domanda!
Ma come faccio a passare il valore $_SESSION['LOGGATO'] dalla pagina di autenticazione allo script che vigila sulle pagine???
Inoltre come faccio ad impostare una variabile $_SESSION['NON_LOGGATO'] nella pagina che voglio proteggere la pagina da evetuali accessi?
Mi spiego meglio... se volessi far accedere alla pagina a.html solo un utente loggato,affinche altri non entrino in questa pagina cosa dovrei fare?Impostare $_SESSION['NON_LOGGATO'] nella pagine a.html ed inserire successivamente a tale istruzione la require dello script di controllo??Se cosi fosse,php,quando riceve una chiamata di un utente loggato riesce a sovrascrivere questa variabile?No alt ... fai un po' di confusione.

Innanzitutto una gestione del genere vale solo per le pagine .php e solo per quelle in cui fai appunto tutti questi test. Pagine chiamate xyz.html non c'entrano nulla e non possono "entrare" nel giro di questa autenticazione.

Poi comunque dovresti capire meglio come funzionano le sessioni (vedi <qui> (http://www.php.net/manual/en/ref.session.php)).

Quando in uno script usi session_start(), al primo accesso (da parte del browser) viene generato un 'id' di sessione che viene inviato al browser (in genere tramite i cookie). Quando, con la stessa finestra del browser, si naviga in altre pagine del sito, la session_start() riprende l'id di sessione e quindi "riesuma" tutti i dati di sessione (quelli che poi ti ritrovi nell'array $_SESSION).

mummolo
16-03-2007, 13:36
Ho capito!!
Scusa ma visto che con l'html non è possibile fare questo discorso,se io rinominassi le pagine (ormai già create) in .php va bene tutto quello detto fin ora??

andbin
16-03-2007, 13:46
Scusa ma visto che con l'html non è possibile fare questo discorso,se io rinominassi le pagine (ormai già create) in .php va bene tutto quello detto fin ora??Dovresti comunque aggiungere ad ogni pagina la gestione di questa autenticazione, ovvero dovresti fare, come minimo, un include di uno script dove c'è la session_start() più tutti i vari test.

mummolo
16-03-2007, 13:56
ho provato a dare uno sguardo alla guida consigliata ma non ci ho capito nulla!! :stordita:

mummolo
16-03-2007, 13:57
Dovresti comunque aggiungere ad ogni pagina la gestione di questa autenticazione, ovvero dovresti fare, come minimo, un include di uno script dove c'è la session_start() più tutti i vari test.

No,questo problema non sorge perche tanto l'autenticazione è possibile solo sulla index

Per meglio comprenderci ti posto gli script:

<-- file script_modificato.php -->

if (!isset ($_SESSION['LOGGATO']))
{
header ("Location: prova.php");
exit;
}
else {
header ("Location: index_prova.php");
exit;
}
?>

<-- fine file --->

<-- autenticazione --->

$result = mysql_query("SELECT * FROM 'tabella' WHERE username='$_REQUEST[username]' AND passwd='$_REQUEST[passwd]';", $link);
$numero = mysql_num_rows($result);
if ($numero==1){
require "script_modificato.php";
mysql_close($link) or die (errore());
}
else if ($numero==0){
require "script_modificato.php";
mysql_close($link) or die (errore());
}

<--- fine autenticazione --->

<--- pagina di prova -->
<html>
<body>
<? require "script_modificato.php" ?>
<p>ciao</p>
</body>
</html>

<-- fine pagina prova --->


Ovviamente non mi funziona!!!

andbin
16-03-2007, 14:22
No,questo problema non sorge perche tanto l'autenticazione è possibile solo sulla index

Per meglio comprenderci ti posto gli script:
[...]Innanzitutto non vedo l'utilizzo di session_start() poi non c'è una impostazione della variabile $_SESSION['LOGGATO'].

Faccio un breve riassunto:

a) Se vuoi usare le sessioni, in ogni script eseguito ci deve essere all'inizio una session_start().

b) In ogni pagina che vuoi proteggere ci deve essere il test per stabilire se si è loggati o meno. Ovviamente non è buona cosa replicare su tutte le pagine il test, quindi basta includere uno script apposito.

c) Lo script che si occupa di prendere i dati dal form di login per poi verificare se sono validi, dovrà impostare la variabile di sessione che hai scelto di usare nel caso di login corretto.
Basterebbe una cosa del tipo:
$_SESSION['LOGGATO'] = "1";

poi tanto nel test puoi usare isset(). Cioè o la variabile c'è (loggato) oppure non c'è.


Tieni anche presente un'altra cosa: dovrai pur indicare sulle pagine che l'utente è loggato e che può uscire tramite un pulsante o un link, giusto? Questo significa che pure il corpo delle pagine dovrebbe essere modificato in modo da visualizzare lo stato.

mummolo
16-03-2007, 15:43
Innanzitutto non vedo l'utilizzo di session_start() poi non c'è una impostazione della variabile $_SESSION['LOGGATO'].
a) Se vuoi usare le sessioni, in ogni script eseguito ci deve essere all'inizio una session_start().

Scusa vuol dire che, nell'esempio che ti ho postato,nella pagina index deve essere presente la riga:
<?php session_start(); ?>


b) In ogni pagina che vuoi proteggere ci deve essere il test per stabilire se si è loggati o meno. Ovviamente non è buona cosa replicare su tutte le pagine il test, quindi basta includere uno script apposito.

Scusa se controlli meglio questa istruzione è presente in tutte le pagine con l'istruzione <? require "script_modificato.php" ?>


c) Lo script che si occupa di prendere i dati dal form di login per poi verificare se sono validi, dovrà impostare la variabile di sessione che hai scelto di usare nel caso di login corretto.
Basterebbe una cosa del tipo:
$_SESSION['LOGGATO'] = "1";

Ma la dichiarazione di $_SESSION['LOGGATO'] = "1"; deve essere presente in tutte le pagine (es. in index.php ed in prova.php)???

Per favore potresti farmi un esempio banale come ti ho postato io per capirci meglio?
Grazie ancora

andbin
16-03-2007, 17:44
Scusa vuol dire che, nell'esempio che ti ho postato,nella pagina index deve essere presente la riga:
<?php session_start(); ?>In tutte le pagine in cui vuoi usare le sessioni!

Scusa se controlli meglio questa istruzione è presente in tutte le pagine con l'istruzione <? require "script_modificato.php" ?>Attenzione, perché l'invio di un header con la funzione header() va fatto prima di aver mandato in output qualunque cosa della pagina. Quindi non va bene, nel tuo caso, mandare in output <html><body> e poi includere lo script dove usi la header().
Ricordati, nemmeno 1 byte va mandato in output prima di usare header().

Ma la dichiarazione di $_SESSION['LOGGATO'] = "1"; deve essere presente in tutte le pagine (es. in index.php ed in prova.php)???No, devi impostarlo solo quando l'autenticazione ha successo, cioè solo dopo che hai verificato, grazie al db, che nome/password sono corretti.

Per favore potresti farmi un esempio banale come ti ho postato io per capirci meglio?Allego un esempio completo ma minimale (non stare a vedere le finezze). I file devono stare sotto la "root" di un sito.

mummolo
16-03-2007, 18:16
Grazie ancora per la disponibilità!
Sto analizzando il codice che mi hai spedito...
Nel file login quando inizializzi il form scrivi questa istruzione:
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">
Se non erro la action passa i dati da inviare giusto?
In questo caso che vuol dire <?php echo $_SERVER["PHP_SELF"]; ?>

andbin
16-03-2007, 20:31
Grazie ancora per la disponibilità!
Sto analizzando il codice che mi hai spedito...
Nel file login quando inizializzi il form scrivi questa istruzione:
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">
Se non erro la action passa i dati da inviare giusto?
In questo caso che vuol dire <?php echo $_SERVER["PHP_SELF"]; ?>La variabile $_SERVER["PHP_SELF"] contiene il nome dello script in esecuzione, specificato con un path relativo alla document root.