Visualizzazione risultati 1 fino 11 di 11

Discussione: Problema script login

  1. #1
    Guest

    Unhappy Problema script login

    Ho provato ad utilizzare il seguente script di login, ma cliccando su 'entra' viene fuori una pagina bianca, a prescindere dalla correttezza dei dati.
    NOZIONI UTILIZZATE NELLO SCRIPT
    nome utente amministrazione mysql: altutto
    password: nello script seguente la chiamerò semplicemente password
    db: my_altutto
    host: localhost (è su altervista)
    tabella utenti: avphpbb_users
    colonna username: username
    colonna password: user_password


    .../user/login.html


    Codice HTML:
    <!DOCTYPE html>
    <html>
    <head>
    
        <title>Login</title>
    
    </head>
    <body>
    
        <form id="login" action="verifica.php" method="post">
            <fieldset id="inputs">
                <input id="username" name="username" type="text" placeholder="Username" autofocus required>
                <input id="password" name="password" type="password" placeholder="Password" required>
            </fieldset>
            <fieldset id="actions">
                <input type="submit" id="submit" value="Entra">
                <a href="http://forum.it.altervista.org/index.html" id="back">Indietro</a>
            </fieldset>
        </form>
    
    </body>
    </html>
    .../user/verifica.php

    Codice PHP:
    <?php
    //Avvio o continuo la sessione
    session_start();

    //Controllo che la sessione sia attiva
    if(!IsSet($_SESSION['logged']))
    {
    //Controllo se l' utente vuole loggarsi
    //Recupero i valori da una Form
    $username = @$_POST['username'];
    $password = @$_POST['password'];

    //Controllo se l' username e la password non sono vuoti
    if((!strlen($username) == 0) and (!strlen($password) == 0))
    {
    //Effettuo il controllo dei dati
    $strSQL = "SELECT * FROM avphpbb_users WHERE username = '".$username."' AND user_password = MD5('".$password."')";
    $result = mysql_query($strSQL);
    $row = mysql_fetch_row($result);
    //Controllo se l' utente e' stato trovato
    if(!strlen($row[0]) == 0)
    {
    //Effettuo il login
    $_SESSION['logged'] = $row[0];
    echo
    "<script>location href('http://.../paginaprivata.php')</script>"
    }
    //Libero la memoria
    mysql_free_result($result);
    }
    }

    if(@
    $_GET['logout'] == 1) //Effettuo il Logout
    {
    $_SESSION = array(); //Desetto tutte le variabili di sessione
    session_destroy(); //Distruggo le sessioni
    }
    ?>
    .../user/connessione_db.php

    Codice PHP:
    <?php
    $connessione
    =mysql_connect("localhost", "altutto", "password");
    $selezione_db=mysql_select_db("my_altutto", $connessione);
    ?>
    .../paginaprivata.php

    Codice PHP:
    <?php require_once('user/connessione_db.php');?>
    <?php
    require_once('user/verifica.php');?>


    <?php
    //Controllo che l' utente sia loggato
    if(IsSet($_SESSION['logged']))
    {
    //L' utente e' loggato
    echo "Loggato.";


    }else{
    //L' utente non e' loggato
    echo "Errore: non sei loggato. <a href="user/login.html">login</a>";
    die();
    }
    ?>
    <html>
    Qui codice html e php della pagina privata
    </html>
    Sapreste dirmi cosa ho sbagliato oppure suggerirmi uno script funzionante?
    Ultima modifica di alemoppo : 21-08-2013 alle ore 22.53.47 Motivo: [html] -> [php]

  2. #2
    Guest

    Predefinito

    Guardando ad occhio il codice php è molto datato, dovresti aggiornarlo ad una versione più recente di php.

  3. #3
    Guest

    Predefinito

    Ok, provo a vedere se riesco, grazie :)

  4. #4
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,685

    Predefinito

    Citazione Originalmente inviato da australiafever Visualizza messaggio
    Guardando ad occhio il codice php è molto datato, dovresti aggiornarlo ad una versione più recente di php.
    Aparte l'uso di mysql invece che mysqli o PDO, lo script non mi sembra così obsoleto. Soltanto che ci sono alcuni errorini:

    • Nella riga che cito sotto, occhio alla precedenza degli operatori: prima viene negata la strlen, poi viene confrontato il risultato con lo 0. Presumo che tu non voglia far questo.
      Codice PHP:
      if((!strlen($username) == 0) and (!strlen($password) == 0))
      (questo è l'errore che probabilmente ti rende "bianca" la pagina).

    • Nella riga sotto, sei a rischio di sql injection:
      Codice PHP:
      $strSQL = "SELECT * FROM avphpbb_users WHERE username = '".$username."' AND user_password = MD5('".$password."')";
    • Manca il "punto e virgola":
      Codice PHP:
      echo "<script>location href('http://.../paginaprivata.php')</script>"
    • Nella riga sotto hai pasticciato con gli apici:
      Codice PHP:
      echo "Errore: non sei loggato. <a href="user/login.html">login</a>";


    Questi sono solo gli errori visti con una prima occhiata. Probabilmente ce ne sono altri. Magari li cerchiamo dopo vedendo come si comporta lo script con le correzioni.

    Ciao!
    Ultima modifica di alemoppo : 21-08-2013 alle ore 23.08.14

  5. #5
    Guest

    Predefinito

    Ho corretto gli ultimi due errori che mi hai segnalato, dovuti probabilmente ad una mia distrazione.

    Per lo strlen ho fatto così:
    Codice HTML:
     if((strlen($username) != 0) and (strlen($password) != 0))
    è corretto?
    Come posso proteggermi per la SQL injection?

  6. #6
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,685

    Predefinito

    Citazione Originalmente inviato da altutto Visualizza messaggio
    è corretto?
    Sì, ora è corretto, ma lo hai provato?

    Citazione Originalmente inviato da altutto Visualizza messaggio
    Come posso proteggermi per la SQL injection?
    Nel link che ti ho passato c'é un paragrafo dedicato a come proteggersi, e c'é anche l'esempio di PHP. Nel tuo caso, dovresti usare la mysql_real_escape_string(). Comunque, come faceva notare australiafever, stai usando funzioni mysql deprecate. Prova mysqli o PDO.

    Ciao!

  7. #7
    Guest

    Predefinito

    Ho provato ma non funziona comunque :(
    A questo punto, tanto vale che mi aggiorni a mysqli e poi ricominci.
    Grazie per il tuo aiuto :)

  8. #8
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,685

    Predefinito

    Citazione Originalmente inviato da altutto Visualizza messaggio
    Ho provato ma non funziona comunque :(
    A questo punto, tanto vale che mi aggiorni a mysqli e poi ricominci.
    Grazie per il tuo aiuto :)
    Guarda che non cambia così tanto... Il più delle volte si tratta di aggiungere la "i" dopo "mysql". Ad esempio, mysql_query() sarò mysqli_query(), etc...

    Ciao!

  9. #9
    Guest

    Predefinito

    Ora che ho visto, me ne sono reso conto XD
    Scusami, pensavo che fosse radicalmente diverso.
    Ho provato a modificare il codice così:


    login.php
    Codice PHP:
    <html>
    <head>
    <title>Login</title>
    </head>
    <body>
    <?php
    $username
    = "$_POST['username']";
    $password = "$_POST['password']";
    if((
    strlen($username)=='0') and (strlen($password)=='0')){echo ' <form id="login" action="verifica.php" method="post">
    <fieldset id="inputs">
    <input id="username" name="username" type="text" placeholder="Username" autofocus required>
    <input id="password" name="password" type="password" placeholder="Password" required>
    </fieldset>
    <fieldset id="actions">
    <input type="submit" id="submit" value="Entra">
    <a href="http://forum.it.altervista.org/index.html" id="back">Indietro</a>
    </fieldset>
    </form>'
    ;
    }
    else{
    $connessione = mysqli_connect('localhost', 'altutto', '*****', 'my_altutto');

    if (!
    $connessione) {
    die(
    'Connect Error (' . mysqli_connect_errno() . ') '
    . mysqli_connect_error());
    }
    $strSQL = "SELECT * FROM avphpbb_users WHERE username = '".$username."' AND user_password = MD5('".$password."')";
    function
    search_escape($strSQL, $char = '\\')
    {
    return
    ereg_replace('[%_]', $char . '\0', $strSQL);
    }
    $result = mysqli_query($strSQL);
    $row = mysqli_fetch_row($result);
    if(
    strlen($row[0]) == 0){echo 'Dati errati!'}
    else{
    $loggato='1';
    echo
    'Login effettuato!
    <script>window("location.href=('
    paginaprivata.php')"); </script>
    }
    }
    ?>


    paginaprivata.php

    Codice PHP:
    <?php
    if($loggato!='1'){echo 'Non sei loggato. <a href="login.php">Esegui il login</a> oppure <a href="http://forum.it.altervista.org/php-mysql-e-apache-htaccess/php-mysql-e-apache-htaccess/.../index.html">Torna alla home</a>';}
    else{
    QUI IL CODICE DELLA PAGINA PRIVATA}
    ?>
    Ma mi dà errore per un T_ENCAPSED_AND_WHITESPACE, aspettandosi T_STRING o T_VARIABLE o T_NUM_STRING nella riga 7 di login.php cosa ho sbagliato?
    Ultima modifica di alemoppo : 24-08-2013 alle ore 12.07.53 Motivo: Nuovo codice +[html] -> [php] per capire meglio & asterischi al posto di psw

  10. #10
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,685

    Predefinito

    Perché hai aggiunto i doppi apici dove prelevi i dati da $_POST[]?

    Prima di prelevarli, dovresti controllare se veramente esistono con la isset().

    Comunque, guardando velocissimamente noto soltanto un pasticcio negli apici nella echo "Login effettuato!". In ogni caso, far il redirect usando javascript, e quindi "location.href" è la peggior cosa in termini di compatibilità: se php non ha scritto nessun output, ti consiglio di modificare il parametro "location" dell'header della pagina. In caso contrario, fare un redirect tramite HTML. (googlando un attimo dovresti trovar tutto sul come fare).

    Comunque, se setti una variabile (nel tuo caso $loggato), questa non è accessibile anche nelle altre pagine, ma alla fine di ogni pagina queste vengono distrutte: dovresti usar le sessioni per fare questo.

    Ciao!

  11. #11
    Guest

    Predefinito

    Ho corretto il codice di login.php così
    Codice PHP:
    <html>
    <head>
    <title>Login</title>
    </head>
    <body>
    <?php
    if(isset($_POST['username']) and isset($_POST['password'])){
    $username = $_POST['username'];
    $password = $_POST['password'];
    }
    else{echo
    'Non hai inserito dati';}
    if((
    strlen($username)=='0') and (strlen($password)=='0')){echo ' <form id="login" action="verifica.php" method="post">
    <fieldset id="inputs">
    <input id="username" name="username" type="text" placeholder="Username" autofocus required>
    <input id="password" name="password" type="password" placeholder="Password" required>
    </fieldset>
    <fieldset id="actions">
    <input type="submit" id="submit" value="Entra">
    <a href="http://forum.it.altervista.org/index.html" id="back">Indietro</a>
    </fieldset>
    </form>'
    ;
    }
    else{
    $connessione = mysqli_connect('localhost', 'altutto', 'shuppiluliuma', 'my_altutto');

    if (!
    $connessione) {
    die(
    'Connect Error (' . mysqli_connect_errno() . ') '
    . mysqli_connect_error());
    }
    $strSQL = "SELECT * FROM avphpbb_users WHERE username = '".$username."' AND user_password = MD5('".$password."')";
    function
    search_escape($strSQL, $char = '\\')
    {
    return
    ereg_replace('[%_]', $char . '\0', $strSQL);
    }
    $result = mysqli_query($strSQL);
    $row = mysqli_fetch_row($result);
    if(
    strlen($row[0]) == 0){echo 'Dati errati!';}
    else{
    $_SESSION['logged'];
    echo
    'Login effettuato! <a href="paginaprivata.php">Clicca qui per continuare</a>';
    }
    }
    ?>
    Ora però c'è un problema: mi dice a prescindere 'Dati errati', però credo di aver capito perchè. Infatti quest'area login sarebbe da integrare con phpbb, ho cercato su google e sembrerebbe che le critti con md5, però le opinioni sono discordanti, probabilmente userà un altro algoritmo.
    Ultima modifica di altutto : 24-08-2013 alle ore 15.00.07

Regole di scrittura

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