|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2005
Messaggi: 42
|
[PHP+MySQL] Consiglio autenticazione utente
Ciao a tutti,
Sono alle prese con un login form in php. Gestisco utenti e password all'interno di un db e vorrei un vostro parere. Per l'autenticazione ho ragionato così: 1. l'utente inserisce uid e pwd, e clicca su ok 2. lo script entra nel db dove sono le pwd ed i nomi utente ed estrapola la pwd reale corrispondente all'uid inserito. 3. lo script genera una tabella temporanea (se non esiste) e ne cancella il contenuto 4. lo script inserisce sulla prima riga le due password, quella inserita dall'utente e quella vera 5. confronta le due password. Ora ho visto che il sistema è un tantino arzigogolato, più che altro mi preoccupa il fatto che se dovessero loggare svariati utenti sarebbe difficile cancellare il contenuto della tabella temporanea. A questo proposito pensavo di creare un ID sessione univoco, o tramite qualche altro metodo, per cancellare solo ed esclusivamente quella riga (non mi fido di cancellare la riga corrispondente ad un singolo inserimento di password per ovvie ragioni di possibili "doppioni"). Più o meno comunque dovrà lavorare così. Che ne pensate? Consigli, critiche, dritte..? grazie! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 430
|
Ciao io nel mio sito ho fatto così:
-l'utente inserisce uid e pwd -script sql: Codice:
$result=mysql_query("SELECT * FROM utenti WHERE username = '$user' AND password = '$pass'",$dbconnect);
Codice:
$rowCheck = mysql_num_rows($result); -se è 1 --> password esatta --> creazione cookie PS: io non sono un esperto quindi questo sistema sarà non sicuro o ce ne saranno di migliori.. ma funziona
__________________
[ Raidmax Ninja | Intel [email protected] Ghz | Arctic Cooling Freezer 7 Pro | Asus P5K-E WiFi-AP | 6GB Corsair 800Mhz | XFX HD5770XT | 2xWestern Digital 320GB Raid0 | Pioneer DVR-215D | LG L222WS ]
|
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Dec 2005
Messaggi: 42
|
spero di non dire castronerie, ma il tuo script mi sembra vulnerabile ad un injection.
se tu nel campo password inserisci Quote:
In sostanza: preleva dalla tabella la riga che corrisponde al nome utente ed alla password (oppure al nome utente). prova un po' vediamo che succede |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 430
|
No ora ho provato a mettere la password sbagliata e non riesco ad accedere...
Per quanto riguarda la sicurezza non lo so, te l'ho detto non sono un esperto, sono già contento che funziona
__________________
[ Raidmax Ninja | Intel [email protected] Ghz | Arctic Cooling Freezer 7 Pro | Asus P5K-E WiFi-AP | 6GB Corsair 800Mhz | XFX HD5770XT | 2xWestern Digital 320GB Raid0 | Pioneer DVR-215D | LG L222WS ]
|
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Jul 2008
Città: Nel mio studio
Messaggi: 168
|
Quote:
Ti elenco una possibile soluzione 1 form con user e password 2 pagina che legge questi dati ed estrapola da database la password cercando tra gli username (che dovranno per forza di cose essere univoci) 3 confronta le 2 password ed autorizza se uguali Di solito nel database si inserisce un hash della password e non la stessa in chiaro. Puoi usare md5 come algoritmo.
__________________
Since Rocco Siffredi, the saying "pain in the ass" got a total new meaning |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2005
Messaggi: 1400
|
concordo con quanto detto dagli altri, ti complichi la vita per nulla, una sola query per verificare l'utente e poi usa le sessioni invece del cookie per salvare lo stato dell'autorizzazione
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
al posto di md5 meglio usare SHA1, se poi hai accesso fisico alla macchina (puoi installare pacchetti) esistono dei moduli PEAR che gestiscono l'autenticazione su database.
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt.
|
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
Quote:
__________________
|
||
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Dec 2005
Messaggi: 42
|
Le faccio perchè non ci capisco niente, ecco perchè chiedo consiglio
Avevo dei dubbi sulla sicurezza di uno script del tipo Codice:
"SELECT password FROM utenti WHERE user='$user_form' AND password='$pwd_form'" Però se mi dite che è una complicazione inutile la mia soluzione (ci vogliono 4 secondi per ottenere risposta, lol, su un db di 3 password) allora proverò a criptare le password. E comunque, come evitare che qualcuno inserisca ad esempio una condizione OR 1 - - all'interno del campo pwd? Il mio grande cruccio é rendere sicuro il sistema di autenticazione.. Con la query che mi hai consigliato, se io metto nel campo password una condizione del tipo Codice:
'OR 1 - - ' Consigli bene accetti! e grazie ancora |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Dec 2005
Messaggi: 42
|
Allora, questo è il codice risultante da vostri consigli. Mi fareste avere la vostra opinione in merito? grazie!
Codice PHP:
|
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Jul 2008
Città: Nel mio studio
Messaggi: 168
|
Quote:
Codice PHP:
Contro SQL injection in altri linguaggi c'è la possibilità di parametrizzare la query. Credo che esista qualcosa di simile anche per php.
__________________
Since Rocco Siffredi, the saying "pain in the ass" got a total new meaning |
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Dec 2005
Messaggi: 42
|
In effetti hai ragione, controllo due volte la password e non serve a niente.
Con la procedura da me usata, lo script non fa altro che prendere ogni stringa ed inserire un backslash per ogni apostrofo. Ciò interferisce con il database solo nel momento in cui l'utente malizioso invia al posto della password una clausola SQL e deve usare per forza gli apici (rendendo così vano il suo sforzo). Sono molto curioso di saperne di più sulla parametrizzazione, puoi spiegarmene il principio? Grazie. |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Jul 2008
Città: Nel mio studio
Messaggi: 168
|
I dati inseriti dall'utente vengono gestiti a livello database.
Spiegazione molto semplificata: il web server invia al database la query da eseguire e dei segnaposto. sarà poi compito del database riempire i segnaposto con i dati dell'utente, eseguendo solo una query con i dati corretti. se l'input fornito è sbagliato (tentata sql injection) la query fallisce
__________________
Since Rocco Siffredi, the saying "pain in the ass" got a total new meaning |
|
|
|
|
|
#14 | |
|
Member
Iscritto dal: Mar 2009
Città: Varese
Messaggi: 175
|
Quote:
Consiglio un LIMIT 1 sulla query di SELECT utente AND password, si migliorano le prestazioni di sql (una volta trovato sql si ferma, non va a cercare oltre) |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Per parametrizzare la query esistono i PREPARED STATEMENTs.
Sono delle query con "segnaposto" che vengono mandate al DBMS e lui le pre-compila. Poi si associano le variabili contententi i parametri (bind) e le variabili che conterranno le colonne del resultset restituito. Allora vediamo se riesco a rispolverare del codice (copy&paste): Codice:
<?php
$mysqli = new mysqli( ... );
/* creo un oggetto mysqli_stmt */
$stmt = $mysqli->stmt_init();
if ($stmt->prepare("SELECT * FROM `users` WHERE `uid`=? AND `pwd_hash`=? LIMIT 1")) { //i punti di domanda sono segnaposto per i parametri
/* vaccio il bind delle variabili che contengono i parametri */
$stmt->bind_param("ss", $_POST['uid'], md5hash($_POST['pwd']));
/* eseguo la query includendo i parametri */
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows = 1) {
echo "benvenuto!";
} else {
echo "credenziali errate!";
}
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
La fase di bind dei risultati non ti serve perché devi solo controllare che il numero di righe restituite dalla query sia uguale a uno. Ti conviene dare un'occhiata alla funzione bind_param: se i campi nel database sono stringhe, devi usare "s" nel primo parametro della funzione, "i" per gli interi, "d" per i double, "b" per blob. Un carattere per ogni variabile da bindare. Ricapitolando le fasi principali sono: - connettersi al database (new mysqli) - inizializzare un oggetto mysqli_stmt (stmt_init) - compilare la query con i segnaposto ? (prepare) - fare il bind di eventuali parametri (bind_param) - eseguire la query - fare (eventualmente) il bind delle variabili alle colonne del resultset (bind_result) - caricare i risultati (fetch riga per riga) - eventualmente riutilizzare il prepared statement con altri parametri (è questo uno dei principali vantaggi, inoltre è leggermente più veloce di semplici query) - chiudere il prepared statement (close) - chiudere la connessione al dbms (close) Spero di essere stato abbastanza chiaro. Comunque leggiti quelle 2 pagine di documentazione e in caso di dubbi chiedi pure.
__________________
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
Ovviamente che spieghino da zero.
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#17 | |
|
Member
Iscritto dal: Dec 2005
Messaggi: 42
|
Quote:
Ok, ero scettico sui segnaposto perchè dalle mie poche informazioni erano legati esclusivamente a PEAR al quale non voglio assolutamente essere legato (per questioni di portabilità di tutto il sistema). Tant'è vero che avrete notato che PEAR poteva essere usato anche per l'interazione materiale con MySQL, ma non l'ho fatto. Diciamo che a volte i magic quotes traggono in inganno perchè non si sa se ci siano o meno, quindi bisogna trovare un sistema indipendente da loro (anche perchè se devi mandare in print una stringa quotata vengono fuori quegli antipatici backslash!) e il mio era semplicemente un surrogato dei magic quotes. Bene, studio i vostri codici e poi preparo un altro ciocchetto da mettere al fuoco qui sul forum... grazie! Per ~FullSyst3m~ : ci dovrebbe essere una discussione molto molto recente a proposito di ciò che chiedi. Per woomacoder: ottimo il suggerimento, lo provo anche sul mio script (oddio, non devo gestire trilioni di record, però fa sempre comodo!) grazie! Ultima modifica di packllama : 02-03-2009 alle 09:19. |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Dec 2005
Messaggi: 42
|
[OT] risposta a ~FullSyst3m~
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:02.












ho concluso con: kvegeta, doctordb, Leland Gaunt.








