PDA

View Full Version : [PHP] password da txt


trinakrius
01-02-2012, 16:46
salve raga, ho un problema con la verifica della username e password da txt

ho un filepw.txt così composto
ut1:psw1:email1 mi fa ste faccine ma ci sono due punti :
ut2:psw2:email2
....e cosi via

e il seguente codice php ma non riesco a capire perchè non mi reinderizza alla pagina in header dopo aver effettuato login da altra pagina. il file me lo legge correttamente ma nella if non mi segue le istruzioni volute
<?php
session_start();
$username = $_POST['username'];
$password = $_POST['password'];


//lettura file
$percorso = file("filepw.txt");
while(list(,$value) = each($percorso)){
list($nome, $cognome, $email) = split("[:]", $value);


$params["nome"] = trim($nome);
$params["cognome"] = trim($cognome);
$params["email"] = trim($email);


#Stampo i risultati a video per verifica, la eliminerò
echo $params["nome"]." - ".$params["cognome"]." - ".$params["email"]. "<br />";

if($username == $params["nome"]; && $password == $params["cognome"];){
$_SESSION['username'] = '$username';
$_SESSION['password'] = '$password';
header("location: utente1.php?msg=$msg"); exit ();
}
else echo "login errato";
}

?>

demos88
01-02-2012, 18:25
if($username == $params["nome"]; && $password == $params["cognome"];)
Togli i due punto e virgola :)
Ma l'interprete php non ti dava un messaggio di errore?

ps: la funzione split è deprecata, potresti usare explode (http://www.php.net/manual/en/function.explode.php)

Mettiu_
01-02-2012, 19:24
Le chiamate che modificano gli header della richiesta HTTP (header() è una di queste ovviamente) devono essere invocate PRIMA DI QUALUNQUE OUTPUT quindi devi togliere ogni echo o qualsiasi cosa che produca un output html...

P.S. Ovviamente vale anche quello che ha detto l'utente prima di me!

demos88
01-02-2012, 19:32
Già, comunque quella riga la dovrà togliere.
Piuttosto non capisco perchè, pur con la riga di output, lo script gira. Infatti quando l'ho visto, la prima cosa che m'è venuta in mente è stata proprio quell'output prima dell'header. Eppure lo script esegue correttamente il redirect (togliendo i punto e virgola) anche con l'output... :confused:

trinakrius
01-02-2012, 19:44
grazie mille, non sapevo della caratteristica dell'header...ottimo
i ; erano li per distrazione:doh:

adesso va! ma se uso la explode al posto di split(non ho ancora capito bene perchè non dovrebbe andare) come faccio a dargli il carattere separatore?

grazie ancora raga, sto imparando un sacco di cose grazie al forum

trinakrius
01-02-2012, 20:01
anzi....va solo con la user e pass della prima riga del file txt.... gli altri non li prende.... help!

demos88
01-02-2012, 20:13
explode funziona come split
list($nome, $cognome, $email) = explode(":", $value);
basta leggere la documentazione.

Comunque a me lo script gira anche con login dalla seconda riga in poi.
Tuttavia, il redirect con l'header può darti problemi con quell'echo:
else echo "login errato";
in quando sta dentro al ciclo while di lettura del file, quindi se la prima riga non corrisponde, manda un echo e ti incasina l'header.
Non è nemmeno concettualmente giusto metterlo lì quell'echo.
Andrebbe fuori dal ciclo while, alla fine, in quanto il login fallisce solo se i dati non corrispondono con nessuna delle righe (quindi devi prima leggerle tutte).

trinakrius
01-02-2012, 20:18
perfetto, togliendo l'echo prende anche le altre pass...ma come posso impostare il msg 'errore' fuori dalla if e while?

demos88
01-02-2012, 20:27
perfetto, togliendo l'echo prende anche le altre pass...ma come posso impostare il msg 'errore' fuori dalla if e while?
basta che metti l'echo dopo le parentesi graffe di chiusura del ciclo while no? Se nessun login corrisponde, l'header non parte e il ciclo while finisce e il tuo echo viene eseguito.

Se vuoi fare qualcosa di più carino puoi anche usare una messagebox javascript:

<?php
session_start();
$username = $_POST['username'];
$password = $_POST['password'];


//lettura file
$percorso = file("filepw.txt");
while(list(,$value) = each($percorso)){
list($nome, $cognome, $email) = explode(":", $value);

$params["nome"] = trim($nome);
$params["cognome"] = trim($cognome);
$params["email"] = trim($email);

if($username == $params["nome"] && $password == $params["cognome"]){
$_SESSION['username'] = '$username';
$_SESSION['password'] = '$password';
header("location: utente1.php?msg=$msg"); exit ();
}
}
?>
<script type="text/javascript">
window.alert("Login fallito!!!");
</script>

trinakrius
01-02-2012, 20:42
<script type="text/javascript">
window.alert("Login fallito!!!");
</script>

carino...mi piace!!! e per reindirizzare dopo il messaggio?:help:

demos88
01-02-2012, 20:52
<script type="text/javascript">
window.alert("Login fallito!!!");
</script>

carino...mi piace!!! e per reindirizzare dopo il messaggio?:help:
aggiungi un meta refresh dopo quello script:
<meta http-equiv="refresh" content="0;url=http://pagina_da_caricare">
Appena clicchi ok sul popup, viene caricata la pagina indicata nel tag, o almeno dovrebbe :P

trinakrius
01-02-2012, 21:42
yes!!!:D

trinakrius
01-02-2012, 21:44
il problema però è che mettendo tutto fuori dalla if, me lo esegue comunque

<?php
session_start();
$username = $_POST['username'];
$password = $_POST['password'];


//lettura file
$percorso = file("filepw.txt");
while(list(,$value) = each($percorso)){
list($nome, $cognome, $email) = split("[:]", $value);

#Usiamo trim() per eliminare eventuali spazi vuoti
$params["nome"] = trim($nome);
$params["cognome"] = trim($cognome);
$params["email"] = trim($email);




if($username == $params["nome"] && $password == $params["cognome"]){
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
header("location: utente1.php?msg=$msg"); exit ();

}
}

?>
<meta http-equiv="refresh" content="0;url=index.php">
<script type="text/javascript">
window.alert("Login fallito!!!");
</script>

trinakrius
01-02-2012, 21:52
potrei impostare un flag di controllo prima del while con una variabile che verifichi poi nella seconda if se esiste $_SESSION tramite if e un else alla fine... che dite

demos88
01-02-2012, 22:01
Cos'è che esegue ugualmente? se il login è valido parte l'header e l'istruzione exit() blocca l'esecuzione dello script.
Se il login è errato, allora visualizza il popup e poi reindirizza.
Il popup vien fuori solo se password e username non corrispondono a nessuna riga.
A me funziona perfettamente, ma su che server stai facendo girare lo script?

edit: il meta http andrebbe dopo lo script javascript

trinakrius
01-02-2012, 22:46
il meta http andrebbe dopo lo script javascript


era questo che crashava...mi eseguiva comunque lo script java...
utile scriptino java..grazie ancora

demos88
01-02-2012, 23:04
il meta http andrebbe dopo lo script javascript


era questo che crashava...mi eseguiva comunque lo script java...
utile scriptino java..grazie ancora
javascript* (abbreviato js), il java è tutta un'altra cosa, occhio a non far confusione qualcuno potrebbe trollarti :p

un paio di consigli comunque: spero che questo codice sia a scopo "didattico" giusto per fare un po' di pratica perchè:
- usare un file per memorizzare dei dati del genere è poco conveniente oltre che poco sicuro. Nel tuo caso addirittura sono dati in chiaro non crittati. Ti consiglio vivamente di usare un database e crittare le password con l'algoritmo md5 (c'è la funzione apposita del php), rubare i dati di login contenuti in quel file è fin troppo facile, soprattutto se il file è accessibile con diritti globali.
- la pagina che tu chiami utente1.php suppongo sia un pannello di controllo utente. Crea una pagina php unica per tutti gli utenti, pagina che verrà caricata dinamicamente in base all'utente presente nelle variabili di sessione. Magari stavi già facendo così, ma quell' "1" mi è sospetto.

Buona programmazione :)

trinakrius
02-02-2012, 00:55
javascript* (abbreviato js), il java è tutta un'altra cosa, occhio a non far confusione qualcuno potrebbe trollarti :p

un paio di consigli comunque: spero che questo codice sia a scopo "didattico" giusto per fare un po' di pratica perchè:
- usare un file per memorizzare dei dati del genere è poco conveniente oltre che poco sicuro. Nel tuo caso addirittura sono dati in chiaro non crittati. Ti consiglio vivamente di usare un database e crittare le password con l'algoritmo md5 (c'è la funzione apposita del php), rubare i dati di login contenuti in quel file è fin troppo facile, soprattutto se il file è accessibile con diritti globali.
- la pagina che tu chiami utente1.php suppongo sia un pannello di controllo utente. Crea una pagina php unica per tutti gli utenti, pagina che verrà caricata dinamicamente in base all'utente presente nelle variabili di sessione. Magari stavi già facendo così, ma quell' "1" mi è sospetto.

Buona programmazione :)

grazie mille per i consigli...
ti spiego: quell'uno c'è perche in partenza avevo un'altra idea, ma grazie a voi sono riuscito a creare una pagina dinamica e non mi serve più differenziare in base al cliente.

Riprendo dopo tanto tempo con la programmazione e devo presentare un progetto in tempi brevi.
Il problema della creazione del db è che devo farmi una cutura da zero.... il concetto era(dato che il sito non conterrà dati rilevanti) di creare il sito nel migliore dei mezzi in mia conoscenza per poi ottimizzarlo con l'accesso tramite db.... se vuoi puoi battezzarmi?
premetto che ricordo parecchio bene il linguaggio sql...ma dando un'occhiata veloce devo usare un tool tipo phpmyadmin....no?

demos88
02-02-2012, 10:07
Ho dato per scontato che conoscessi già qualcosa di database, ma a questo punto meglio che continui a usare il file a sto punto se devi presentare il progetto.
Magari però potresti comunque crittare almeno la password. http://php.net/manual/en/function.md5.php
Al posto di memorizzare la password in chiaro nel file txt, memorizzi l'md5 della password.
L'md5 è una crittografazione di hash a senso unico, in pratica da una qualsiasi sequenza di caratteri (o bytes), ricava univocamente un valore a 128bit dal quale è teoricamente impossibile ricavare il valore originale.
L'uso nella gestione delle password è semplice: al posto di memorizzare una password in chiaro, ne memorizzi l'md5.
Quando poi l'utente fa il login, tu calcoli l'md5 della password che ti fornisce e lo confronti con gli md5 che hai memorizzato.
In altre parole usi l'md5 come discriminante per il login, e l'utente deve fornirti la password che genera quell'md5.
Questo metodo è già molto più sicuro perchè anche se un malintenzionato venisse in possesso di quel file txt che lasci nel server, vedrebbe solo l'md5 delle password e non potrebbe farci niente, se non tentare di capire la password vera calcolando l'md5 di tutte le possibili stringhe utilizzabili come password che sono decisamente tante (brute force).

trinakrius
03-02-2012, 10:05
ok grazie del consiglio...lo inserisco di sicuro!

quanto prima imparerò la gestione db su php