Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Autenticazione in php e mysql

    Ciao a tutti.
    Sto per la prima volta facendo una pagina di autenticazione in php e mysql
    Ho creato una pagina php con questo codice:
    Codice PHP:
    $ufficio=$_POST['ufficio'];
    $passwd=$_POST['passwd'];

    $conn mysql_connect('127.0.0.1','userxxxx','passxxxx') or die("Errore di connessione"); 
    mysql_select_db("DBxxxx");

    $query_login "SELECT * FROM `uffici` WHERE id='$ufficio' AND passwd='$passwd'"// verifico la corripondenza

    $rslt_login=mysql_query($query_login);

    $row mysql_fetch_row($rslt_login);

        if(!
    strlen($row[0]))
            {
                
    //Effettuo il login
                
    $_SESSION['auth'] = $row[0];
                
    header('location:index.php');
            }
            
    //Libero la memoria
            
    mysql_free_result($result); 
    Quindi vorrei che se l'autneticazione è corretta mi porta su index.php

    La pagina index.php inizia così:
    Codice PHP:

    if ($_SESSION['auth']=="")
      {
        
    header('location:login.php');
      exit;
      }
     
    echo 
    "sei autenticato con questo ID ".$_SESSION['auth']; 
    A questo punto appena apro la pagina index.php mi crea un loop infinito e non carica la pagina.

    Qualcuno intuisce perchè?

    Grazie.

    P.S.: Se avete qualche esempio funzionante da farmi vedere, posso anche modificare del tutto queste parti di codice.

  2. #2
    Innanzi tutto, direi che la logica della query non mi sembra esatta.
    Ma andiamo per gradi.
    Come prima cosa, fatti restituire un eventuale errore da MySQL.

    Codice PHP:
    $rslt_login=mysql_query($query_login
    OR DIE(
    "Errore Numero: ".mysql_errno()." - Descrizione: ".mysql_error());
    echo 
    "Query OK"; exit; 
    L'ultima riga del codice ti serve solo in questa fase di debug per bloccare lo script oppure per ricevere il messaggio di OK.
    Se con questo barba-trucco lo script non va in loop, l'errore è successivo (come sospetto).

    Passando poi alla logica, posso sollevarti un paio di quesiti.
    Innanzi tutto di ottimizzazione della query.

    Suppongo che per ogni utente registrato nel DB (quindi per ognuno di quelli per cui esiste una coppia nome utente/password) esista un solo rigo del DB.
    Quindi non ti serve né fare il SELECT * né il fetching di risultati inutili ai fini del login.
    Ti basta andare a contare quanti righi sono presenti nel DB per quella coppia di valori.
    Se il valore è 0, vuol dire che quella coppia nome_utente/password non è inserita nel DB quindi che l'utente non esiste per il sistema.
    Se il valore è 1, vuol dire che l'utente ha inserito correttamente le proprie credenziali, se maggiore di 1 vuol dire che ci sono più utenti con lo stesso nome e con la stessa password (quindi che c'è qualcosa che non va).

    Non so come sia strutturata la tabella degli utenti, ma facendo l'ipotesi che sia del tipo, ID - UTENTE - PASSWORD, io farei una query del genere.

    Codice PHP:
    $sql "SELECT id FROM uffici WHERE login = '$ufficio' AND password = '$passwd' ";

    $query mysql_query($sql
    OR DIE(
    "Errore Numero: ".mysql_errno()." - Descrizione: ".mysql_error());

    $num mysql_num_rows($query);

    switch(
    $num) {
       case 
    0:
         echo 
    "Nome utente o password errati o inesistenti";
       break;
       case 
    1:
         echo 
    "login ok";
       break;
       case (
    $num 1):
         echo 
    "Ci deve essere qualche errore";
       break;

    Naturalmente, al posto delle echo che ho scritto io, metti il codice che serve a te.
    Nel CASE 1 vai ad inserire il codice per inserire la variabile nella sessione e quindi per procedere al redirect.

    Qui voglio aprire un'altra parentesi.
    Codice PHP:
        if(!strlen($row[0])) 
            { 
                
    //Effettuo il login 
                
    $_SESSION['auth'] = $row[0]; 
                
    header('location:index.php'); 
            } 
            
    //Libero la memoria 
            
    mysql_free_result($result); 
    Con questo codice istanzi una variabile di sessione.
    Ma il session_start()????

    Altre considerazioni, poi, si possono fare sul fatto che non ci sia alcun filtraggio degli input, né che la password sia salvata con un qualche sistema di crittazione.... ma come prima cosa, fai in modo che lo script funzioni così com'è, poi implementa tutti i controlli anti-hacking del caso!

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  3. #3
    Era tutta colpa del session_start();

    Grazie mille!!

    Sei stato gentilisimo!!!

  4. #4
    Beh... direi che quello era il minore dei problemi.
    Guardati la logica che ti ho segnato io, perché quella che usi tu, mi sembra a dir poco sbagliata.

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.