Visualizzazione risultati 1 fino 21 di 21

Discussione: autenticazione sicura

  1. #1
    Guest

    Predefinito autenticazione sicura

    Sapete spiegarmelo un po?


    il seguente script chiede all'utente nome e password. Se si digitano "nomeutente" e "suapass" il login va a buon fine. In caso contrario la richiesta viene ripetuta per altre 2 volte e infine la login fallisce.
    Codice PHP:
    <?php

    $userpass
    [0]="nomeutente";
    $pass="suapass";
    $userpass[1]=md5($pass);

    if(!(isset(
    $_SERVER["PHP_AUTH_USER"]))
    OR (empty(
    $_SERVER["PHP_AUTH_PW"]))
    OR (
    $_SERVER["PHP_AUTH_USER"] != $userpass[0])
    OR (
    md5($_SERVER["PHP_AUTH_PW"]) != $userpass[1])) {

    Header("WWW-Authenticate: Basic realm=\"Secure Login\"");
    Header("HTTP/1.0 401 Unauthorized");

    echo
    "Login Fallita";

    }
    else
    echo
    "Login effettuata";
    ?>
    Vorrei capire:
    1) i tre tentativi da chi sono impostati?
    2) cosa fa l'istruzione Header("HTTP/1.0 401 Unauthorized")?
    3) se l'utente riesce a "loggarsi" poi non si "slogga" + (riaccedendo alla pagina la login riesce senza nessuna richiesta); come si fa a "sloggarsi"?
    4) a me pare che OR (empty($_SERVER["PHP_AUTH_PW"])) sia del tutto inutile, visto che c'è OR (md5($_SERVER["PHP_AUTH_PW"]) != $userpass[1])); per precauzione si potrebbe rifiutare una scelta di password vuota in sede di registrazione
    5) premesso che conserverei le password in mysql, il sistema sarebbe sicuro o si può far di meglio?
    6) per conto mio l'uso di md5 è del tutto superfluo (potrebbe essere utile se conservassi le password in un file, ma se le metto nel db serve crittografarle?)
    Ultima modifica di seneca : 25-06-2006 alle ore 23.22.55

  2. #2
    L'avatar di pietrovischia
    pietrovischia non è connesso Utente attivo
    Data registrazione
    16-10-2005
    Residenza
    Padova
    Messaggi
    351

    Predefinito

    1) Così a occhio manca un buon pezzo di script, ove è impostato il limite a tre tentativi di login.

    2) Restituisce al browser il codice di errore standard relativo ad una pagina per cui non si hanno i permessi di accesso (ossia "401 Unauthorized")

    3) Devi aggiungere (oppure devi trovare dove è nello script che hai scaricato) una parte dove fa il logout. Il metodo di logout dipende da come gestisci la sessione da pagina a pagina: tramite cookies oppure tramite sessione php.

    4) Serve ad evitare casini

    5) Lasciarle criptate, e poi basta. Puoi lavorare sul sistema di gestione della sessione, se vuoi, io personalmente preferisco le sessioni php, altri preferiscono i cookies...

    6) Ma la password deve essere soggetta al checking e quindi deve passare dal client al server. E ciò è meglio che avvenga quando è criptata.

  3. #3
    Guest

    Predefinito

    mi permetto alcune precisazioni:
    il sistema utilizzato per l'autenticazione non è che un'emulazione lato php dell'autenticazione richiesta quando viene "lucchettata" una sezione di un sito di altervista, cioè quando si impiegano gli htaccess e l'autenticazione http, il cui enorme vantaggio è molto evidnte: non sideve perdere tempo a creare form sessioni etc
    il limite di 3 tentativi è impostato dal server e non è nello script (tuttavia, volendo, potresti ridurre questi tentativi ad uno solo, modificando un po' il codice) per il logout non devi gestire nessuna sessione o cookie in quanto tutto è gestito dal server (l'unico modo per outloggarsi è chiudere la sessione chiudendo la finestra del browser oppure, in alternativa, potresti provare a reinviare l'header "WWW-Authenticate: Basic realm=\"Secure Login\"" cmabinado il valore di realm con un numero random, ma non funziona sempre) per quanot rigurda l'hashing (md5 è un sistema di hashing non di encrypting come sicuramente saprai) farlo non ti costa nulla....forse puoi farne a meno...ma perchè rischiare?

    ps
    un altro grande vantaggio dell'autenticazione http è che ti puoi loggare direttamente dall'uri in questo modo:
    http://utente:password@www.sito.com/login.php

  4. #4
    L'avatar di pietrovischia
    pietrovischia non è connesso Utente attivo
    Data registrazione
    16-10-2005
    Residenza
    Padova
    Messaggi
    351

    Predefinito

    Citazione Originalmente inviato da SoulHome
    mi permetto alcune precisazioni:
    il sistema utilizzato per l'autenticazione non è che un'emulazione lato php dell'autenticazione richiesta quando viene "lucchettata" una sezione di un sito di altervista, cioè quando si impiegano gli htaccess e l'autenticazione http, il cui enorme vantaggio è molto evidnte: non sideve perdere tempo a creare form sessioni etc
    WOW! Ho imparato una cosa nuova oggi!!! Emulazione dell'autenticazione via .htaccess!!! Conoscevo l'autentic. via htaccess ma non sapevo si potesse emulare!

    Ma questa emulazione è sicura quanto l'originale .htaccess oppure è più aggirabile?

  5. #5
    Guest

    Predefinito

    la "emulazione" è abbastanza semplice..basta inviare questo header:
    Header("WWW-Authenticate: Basic realm=\"My Realm\"");
    le varibili da gestinre sono: $_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"] (il cui valore è facilmente intuibile), oppure $_SERVER['PHP_AUTH_DIGEST'], ma solo se l'autenticazione è di tipo digest appunto (comunque ti rimando al manuale php).
    dovrebbe essere sicura come l'originale, ovviamente può essere appllicata solo a file php e non a cartelle ecc
    Ultima modifica di SoulHome : 26-06-2006 alle ore 12.53.23

  6. #6
    Guest

    Predefinito in sostanza

    premettendo che custodisco i nomi utenti e i codici di accesso nella tabella "utenti_codici" e che i codici sono codificati md5, avrei pensato di fare così:


    Codice PHP:
    <?php
    if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="Il mio realm"');
    header('HTTP/1.0 401 Unauthorized');
    exit;
    }
    else {
    $db = mysql_connect("localhost", "root") or die("errore" . mysql_error());
    mysql_select_db("my_imcamo",$db);

    $tabella="utenti_codici";
    $utente=$_SERVER["PHP_AUTH_USER"];
    $codice=md5($_SERVER["PHP_AUTH_PW"];
    $dati = mysql_query("SELECT * FROM $tabella where utente = '$utente' and codice = '$codice'",$db);
    if (
    $record = mysql_fetch_array($dati)) {
    echo
    "login riuscita";
    //tutto quello che deve fare l'utente

    }
    else
    header("Location: $_SERVER['PHP_SELF']"); //ripropongo il login
    }
    ?>

    Che ne pensate?

    Usa i tag appositi per il codice php; occhio a non dimenticare il minore prima di "?php", te l'ho aggiunto io.
    Ultima modifica di seneca : 26-06-2006 alle ore 22.35.09

  7. #7
    Guest

    Predefinito

    se fai così hai solo un tentativo a disposizione...e non puoi rirpoporre il login, infatti una votla impostata la varibile $_SERVER["PHP_AUTH_USER"] questa resta fino alla chiusura del browser.
    dovresti usare lo steso codice che hai postato prima tranne per il fatto che
    OR ($_SERVER["PHP_AUTH_USER"] != $userpass[0])
    OR (md5($_SERVER["PHP_AUTH_PW"]) != $userpass[1]))
    li dovrai sostiutire con una funzione che recuperi i dati dal mysql e restituisca true o false

  8. #8
    Guest

    Predefinito

    Si, hai ragione; ma siccome non sono riuscito a capire a fondo cosa fanno le istruzioni Header("WWW-Authenticate: Basic realm=\"Secure Login\"");
    Header("HTTP/1.0 401 Unauthorized");
    sto facendo solo degli squallidi "copia e incolla" da codici che trovo qua e là.
    Il codice che ho postato per ultimo ha in + l'istruzione exit; E' quella che impedisce i tre tentativi? O è solo l'impostazione dell'if (che nel codice precedente consentiva di entrare anche nei casi di variabile settata ma errata?).
    Per quel che riguarda la "riproposta" del login ho capito che non si può fare, un po' come non si può "sloggarsi" una volta entrati.
    Ma queste mi paiono limitazioni davero pesanti: ipotizziamo che un utente si "logghi", poi va su altri siti, fa dell'altro e magari abbandona il computer senza chiudere il browser. Arriva un altro ed entra al posto suo senza problemi. Non si può almeno mettere un timeout? Oppure: se uno fallisce i tre tentativi poi non può più riprovare, a meno di non chiudere e riaprire il browswer. Bruttino.

  9. #9
    Guest

    Predefinito

    nono...l'exit lì ci può stare il problema è prorpio nel modo in cui è strutturto l'if

    comunque le altre limitazioni non dipendono dal php e quindi non possono essere risolte con uno scirpt...tuttavia potresti tenatare un altro sistema (ma non ti garantisco che funzioni):
    una pagina di login come quelle che hai postato tu, con delle correzioni:
    1) devi cambiare \"Secure Login\" con un numero random (bada che sia sempre tra virgolette e non apici)
    2) se il login è ok imposta una varibile di sessione (o al limite un cookie) che indichi che l'utente è loggato e usa questa per verificare se è loggato in tutto il sito e non usare
    $_SERVER["PHP_AUTH_USER"] etc...
    3) la verifica dovrai farla anche nel file di login
    così appena un utente si logga viene impostato il cookie e può navigare tranquillamente, qnd questo scade (o viene cancellato dal server) l'unico sistema è rieffettuare il login, spero di essere stato sufficientemente chiaro

    ps
    tanto epr la coronaca ciò che di ce al broweser che deve autenticarsi, e che fa apparire la finestra di login e qst:
    Header("WWW-Authenticate: Basic realm=\"\"");
    questo:
    Header("HTTP/1.0 401 Unauthorized");
    serve solo a restituire una pagina di erroe se l'autenticazione fallisce

  10. #10
    Guest

    Predefinito

    Capisco, ma volevo anche riuscire a capire come funzionano ‘ste istruzioni header

    Non riesco a far funzionare ‘sta roba:


    Codice PHP:
    $db = mysql_connect("localhost", "root") or die("errore" . mysql_error());
    mysql_select_db("my_imcamo",$db);
    $tabella="utente_codice";

    // primo if
    if (isset($_SERVER['PHP_AUTH_USER'])){

    $utente=$_SERVER["PHP_AUTH_USER"];
    $codice=$_SERVER["PHP_AUTH_PW"];
    $dati = mysql_query("SELECT * FROM $tabella where utente = '$utente' and codice = '$codice'",$db);
    $record = mysql_fetch_array($dati);
    }

    //secondo if
    if ((!isset($_SERVER['PHP_AUTH_USER'])) or (!$record)){

    header('WWW-Authenticate: Basic realm="Il mio realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo
    "login fallita; ritenta";
    }

    else {
    echo
    "login riuscita";
    //tutto quello che deve fare l'utente
    }

    All’inizio lo script entra nel secondo if; credo di aver capito che header('WWW-Authenticate: Basic realm="Il mio realm"'); propone tre tentativi senza uscire dall’if, quindi il primo if non viene mai eseguito, Ma allora come cappero faccio a verificare se i codici sono corretti? Dovrei riuscire a inserire la lettura dal db dentro il secondo if, ma se ci entro con la variabile non settata come faccio a usarla?
    Invece non capisco propiro cosa fa header('HTTP/1.0 401 Unauthorized'); visto che l’unico messaggio che compare a video è quello che faccio io con l’echo.


    FunCool: Quando scrivi del codice inseriscilo tra i tag appositi.
    Ultima modifica di funcool : 28-06-2006 alle ore 10.06.41

  11. #11
    L'avatar di pietrovischia
    pietrovischia non è connesso Utente attivo
    Data registrazione
    16-10-2005
    Residenza
    Padova
    Messaggi
    351

    Predefinito

    Citazione Originalmente inviato da imcamo
    Invece non capisco propiro cosa fa header('HTTP/1.0 401 Unauthorized'); visto che l’unico messaggio che compare a video è quello che faccio io con l’echo.
    A livello visivo, se tu non facessi l'echo ti apparirebbe la pagina di errore di default, "401 Not Authorized"

  12. #12
    Guest

    Predefinito

    Codice PHP:
    $dati = mysql_query("SELECT * FROM $tabella where utente = '$utente' and codice = '$codice'",$db);

    forse questa query puo' essere causa di una sql injection
    se il valore di codice fosse:
    Codice:
    ' OR 1
    si riuscirebbe ad entrare lo stesso, voi che dite?

  13. #13
    Guest

    Predefinito

    @sql su altervista c'è magic_quotes_gpc ad on, comunque per preteggere i miei script anche dove è settato ad off io di solito uso questo:
    Codice PHP:
    if (!get_magic_quotes_gpc()){
    foreach(
    $_POST as $key => $value){
    $_POST[$key]=addslashes($value);
    }
    foreach(
    $_GET as $key => $value){
    $_GET[$key]=addslashes($value);
    }
    foreach(
    $_COOKIE as $key => $value){
    $_COOKIE[$key]=addslashes($value);
    }
    }
    @imcamo l'header 401... serve ad avvisare il browser e gli evetnuali spider che al pagina è ad accesso ristretto, come ha detto piterovischia solitamente viene mostrata una apgina di default, ma dipende dal browser, è per questo che è bene inserire anche l'echo (per il browser o lo spider non cambia nulla perchè loro l'header lo vedono, però per l'utente è utile per fargli capire cosa succede)
    comuqne io il codice lo farei così:
    Codice PHP:
    <?php
    if (!get_magic_quotes_gpc()){
    foreach(
    $_POST as $key => $value){
    $_POST[$key]=addslashes($value);
    }
    foreach(
    $_GET as $key => $value){
    $_GET[$key]=addslashes($value);
    }
    foreach(
    $_COOKIE as $key => $value){
    $_COOKIE[$key]=addslashes($value);
    }
    }
    $db = mysql_connect("localhost", "root") or die("errore" . mysql_error());
    mysql_select_db("my_imcamo",$db);
    $tabella="utente_codice";
    $utente=$_SERVER["PHP_AUTH_USER"];
    $codice=$_SERVER["PHP_AUTH_PW"];
    $dati = mysql_query("SELECT * FROM $tabella where utente = '$utente' and codice = '$codice'",$db);
    $record = mysql_fetch_array($dati);

    if(
    $_COOKIE['logged']){
    echo
    "login riuscita";
    }elseif(
    $record){
    setcookie("logged", true, time()+3600);
    header("Location: ".$_SERVER['SCRIPT_URI']);
    }elseif(!
    record){
    header('WWW-Authenticate: Basic realm="'.rand().'"');
    header('HTTP/1.0 401 Unauthorized');
    echo
    "login fallita; ritenta";
    exit;
    }
    ?>
    ps
    non l'ho provato ma dovrebbe funzioanre, anche se così mi sa che i tentativi sono infiniti...
    Ultima modifica di SoulHome : 28-06-2006 alle ore 14.06.21

  14. #14
    L'avatar di Leo91
    Leo91 non è connesso Altervistiano Junior
    Data registrazione
    28-03-2004
    Residenza
    alle tue spalle
    Messaggi
    728

  15. #15
    Guest

    Predefinito

    Ehm.... avevo scritto un po' di messaggi (troppi; grazie Leo91).
    Sintetizzo:

    Io i cookies non li ho mai voluti usare perchè temo diano mafunzionamenti: se un utente imposta il browser con una alta protezione dai cookies riesce lo stesso ad entrare?

    Prendendo spunto dal tuo codice ho scritto questo (sembra funzionare) senza cookies
    Codice PHP:
    <?php
    if (!get_magic_quotes_gpc()){
    foreach(
    $_POST as $key => $value){
    $_POST[$key]=addslashes($value);
    }
    foreach(
    $_GET as $key => $value){
    $_GET[$key]=addslashes($value);
    }
    foreach(
    $_COOKIE as $key => $value){
    $_COOKIE[$key]=addslashes($value);
    }
    }
    $db = mysql_connect("localhost", "root") or die("errore" . mysql_error());
    mysql_select_db("my_imcamo",$db);
    $tabella="utente_codice";
    $utente=$_SERVER["PHP_AUTH_USER"];
    $codice=$_SERVER["PHP_AUTH_PW"];
    $dati = mysql_query("SELECT * FROM $tabella where utente = '$utente' and codice = '$codice'",$db);
    $record = mysql_fetch_array($dati);


    if(
    $record){
    echo
    "login riuscita";
    }else {
    header('WWW-Authenticate: Basic realm="'.rand().'"');
    header('HTTP/1.0 401 Unauthorized');
    echo
    "login fallita; ritenta";
    exit;
    }
    ?>
    Devo ripristinare md5 per il codice.

    Che ne pensi?


    adesso però mi piacerebbe capire come fa a funzionare ........sempre il solito dubbio: le istruzioni
    header('WWW-Authenticate: Basic realm="'.rand().'"');
    header('HTTP/1.0 401 Unauthorized');
    echo "login fallita; ritenta";

    come fanno a non essere eseguite ineluttabilmente tutte e tre? Credo che la prima contenga al suo interno un riposizionamento nella scansione del codice, altrimenti l'echo "login fallita; ritenta" sembrerebbe ineluttabile.

    E' la terza volta che ti viene detto: usa i tag appositi per il codice php!
    Quando devi scrivere più messaggi consecutivi, non serve che li cancelli poi tutti, basta che usi il tasto EDITA e aggiungi all'ultimo che hai scritto!
    Ultima modifica di seneca : 29-06-2006 alle ore 00.36.04

  16. #16
    Guest

    Predefinito

    innazi tutto mi scuso perchè ho scritto una picocla stupidaggine...magic_quotes_gpc (e la mia funzione che lo emula sui server in cui è settao ad off) non c'entra nulla con questo sistema.
    il cookie era solo un esempio epr farti vedere come avresti dovuto fare, ineffetti sarebbe stato meglio usare una sessione perchè quel cookie is poteva facilente aggirare...comunque quasi tutti siti usano i cookie (le sessioni generalmente si appoggiano ai cookie, esisterebbe anche un altro metodo ma è usato pochissimo) io i cookies li avevo messi per poter effettuare il logout senza dover chiudere il browser per forza..comunque se a te va bene così...
    per quanto riguarda i blocco:
    header('WWW-Authenticate: Basic realm="'.rand().'"');
    header('HTTP/1.0 401 Unauthorized');
    echo "login fallita; ritenta";
    a dire al veritàle istruzioni vengono eseguite tutte e tre in quell'ordine (anche se poi a dire la verità gli headers di stato [quelli che iniziano con HTTP/..] vengon inviati prima), ma il browser le rende visibili all'utente solo se il login viene annullato o fallisce

  17. #17
    Guest

    Predefinito

    URGENTISSIMO: mi continuano a sgridare perchè non uso i tag appositi quando invio del codice. Ma quali sono 'sti tag appositi? non basta usare <?php per aprire e ?> per chiudere? Io pensavo fossero questi i tag appositi.


    Per l'header: ma se è come dici tu, come fa ad entrare in if ($record)? Il file deve per forza essere rieseguito dall'inizio. E come fa a tornare all'inizio? A meno che io non stia facendo confusione tra un linguaggio interpretato e un linguaggio compilato. Php è compilato?

  18. #18
    L'avatar di seneca
    seneca non è connesso Super Moderatore
    Data registrazione
    18-12-2004
    Residenza
    la Città Eterna
    Messaggi
    8,376

    Predefinito

    I tag sono [ php ] per l'apertura e [ /php ] per la chiusura. Naturalmente non devi mettere gli spazi.


    -- Aut Roma Aut Nihil!

  19. #19
    Guest

    Predefinito

    il php in genere non è compilato (tu i tuoi script mica li compili, volendo potresti farlo...ma sinceramente credo che non lo faccia quasi nessuno) e comunque non c'entra nulla...
    il server interpreta TUTTO il file php e lo invia al browser (compresi TUTTI gli headers)
    poi il browser effettua altre richieste al server e il server REINTERPRETA TUTTO lo script ma l'esecuzione dello script non torna indietro (una cosa ke ho notato ora e che forse potrebbe portare confusione è:
    echo "login fallita; ritenta";
    in realtà quel messaggio non vinee mostrato quando il login fallisce, ma quando si rpeme il tasto cancel)

  20. #20
    Guest

    Predefinito

    ok, funziona tutto.

    Ti ringrazio di cuore per le utilissime indicazioni

  21. #21
    L'avatar di seneca
    seneca non è connesso Super Moderatore
    Data registrazione
    18-12-2004
    Residenza
    la Città Eterna
    Messaggi
    8,376

    Predefinito

    Posso chiudere. Ciao!


    -- Aut Roma Aut Nihil!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •