• User

    Sicurezza login e limitazione accessi

    [h=2]Salve a tutti ragazzi, stavo perfezionando il mio codice php di login e volevo chiedere informazioni riguardo alla sicurezza.[INDENT]
    Non solo a livello di criptaggio password e di esclusione di caratteri dannosi, ma anche riguardo la limitazione degli accessi.

    Su cosa posso agire per limitare gli accessi di un utente? dove tengo questa informazione?

    Grazie mille, se avete consigli sulla sicurezza in generale sono ben accetti.[/INDENT]


  • User Attivo

    Limitare accesso agli utenti ? .... E' scritto nel tuo database, se hai fatto un login con i gruppi di utenti.
    Fai prima a scrivere il codice così da vedere dove migliorarlo...
    Ad esempio .... hai preso in considerazione i magic_quotes_gpc ?


  • User

    @infosicurezza said:

    Limitare accesso agli utenti ? .... E' scritto nel tuo database, se hai fatto un login con i gruppi di utenti.
    Fai prima a scrivere il codice così da vedere dove migliorarlo...
    Ad esempio .... hai preso in considerazione i magic_quotes_gpc ?

    Per limitare l'accesso intendo che dopo un tot di tentativi l'accesso viene bloccato magari per un periodo di tempo determinato.

    questa è la mia iscrizione:

    [PHP]<?php include "connessione.php";?>

    <?php mysql_select_db($database);

    //htmlspecialchars( $our_string, ENT_QUOTES, 'UTF-8' )

    $mail=$_POST['email'];
    $email=htmlspecialchars( $mail, ENT_QUOTES, 'UTF-8' );
    $username=$_POST['email'];
    $username=htmlspecialchars( $username, ENT_QUOTES, 'UTF-8' );

    //controllo se l'username è gia presente nel database, in caso contrario proseguo con la registrazione$username_control = mysql_query("SELECT username FROM login WHERE username = '$username'");if(mysql_num_rows($username_control)) {
    header("location: /index.html");exit;}
    $email_control = mysql_query("SELECT email FROM login WHERE email = '$email'");if(mysql_num_rows($email_control)) {
    header("location:/index.html");exit;}else{ // Lunghezza della password a 15 caratteri$lunghezza_pass = 15;
    // Ciclo su ogni carattere della passwordfor ($i=1; $i<=$lunghezza_pass; $i++){// Se $i è multiplo di 2...if ($i % 2){
    /* Aggiungo una lettera casuale usando chr() in combinazione con rand() */
    $pass_generata = $pass_generata . chr(rand(97,122));
    // Se $x non è multiplo di 2...}else{
    // Aggiungo alla password un numero // compreso tra 0 e 9
    $pass_generata = $pass_generata . rand(0,9);}}
    echo"$pass_generata";
    $to = $_POST['email'];$subject = "Registrazione effettuata con successo!";$message = "Messaggio personalizzato";$headers = 'From: mail@...' . "\r\n" . 'CC: mail@...' . "\r\n" . 'Reply-To: mail@...' . "\r\n" . 'X-Mailer: PHP/' . phpversion();mail($to, $subject, $message, $headers);

    //$password=sha1($pass_generata);

    $query="INSERT INTO login (username, email, password) VALUES ('$username', '$email','$pass_generata')";
    if ( mysql_query($query) !== true ) { echo "C'è stato un errore durante l'inserimento: " . mysql_error();}else{ echo"inserito correttamente";}}

    ?>[/PHP]

    Questo è il mio login:

    [PHP]<?php session_start();?>
    <?php include"connessione.php";?>
    <?php //$pass=sha1($_POST['pass']);
    $query ="SELECT * FROM login WHERE username='{$_POST['user']}' AND password='{$_POST['pass']}'";

    $res=mysql_query($query);

    if ((!$res) OR (mysql_num_rows($res)==0)){
    echo"credenziali errate!!";
    session_unset();
    session_destroy();
    exit;
    }else{
    $_SESSION['logged']=1;
    $_SESSION['user']=$_POST['user'];
    header("location: loginok.php");}?> [/PHP]

    Sto cercando di risolvere i piu comuni problemi di sicurezza! Ti ringrazio per l'aiuto!


  • ModSenior

    Ciao scartus,
    dovresti utilizzare una tabella per tenere uno storico dei tentativi di accesso da un determinato IP per bloccare solo quell'IP, oppure bloccare direttamente l'account a cui si tenta di accedere, la prima soluzione mi sembra comunque migliore.

    Fai attenzione perchè quello script è vulnerabile a SQL INJECTION, per maggiori informazioni in merito ti rimando alla guida che avevo scritto:
    http://www.giorgiotave.it/forum/scripting-e-risorse-utili/189074-guida-sql-injection.html


  • User

    @Thedarkita said:

    Ciao scartus,
    dovresti utilizzare una tabella per tenere uno storico dei tentativi di accesso da un determinato IP per bloccare solo quell'IP, oppure bloccare direttamente l'account a cui si tenta di accedere, la prima soluzione mi sembra comunque migliore.

    Fai attenzione perchè quello script è vulnerabile a SQL INJECTION, per maggiori informazioni in merito ti rimando alla guida che avevo scritto:

    Si hai ragione mi ero scordato l'escape.

    Per quanto riguarda il numero di tentativi dici che è meglio farlo sull'ip?
    E invece agendo sul nome, è meglio fare un numero di tentativi e bloccare per un periodo predefinito o bloccarlo definitivamente? Forse hai ragione meglio poche possibilità ma bloccando l'ip..


  • User Attivo

    login : $user e $pass li passi alla query senza fare un controllo su ciò che ti ha inviato l'utente.


  • User

    @infosicurezza said:

    login : $user e $pass li passi alla query senza fare un controllo su ciò che ti ha inviato l'utente.

    Si si ho capito mi ero dimenticato l'escape. Ho usato il metodo che mi ha suggerito ​Thedarkita sul suo post. Da quello che ho capito ci sono diversi metodi di escape. Tu quale suggerisci?


  • User Attivo

    Utilizzando mysql_real_escape_string


  • User

    Perfetto grazie, e per la limitazione degli accessi come ti muoveresti? bloccando l'ip o l'username?


  • User Attivo

    Ma bloccando l'ip non è una mossa giusta, vai a bloccare un indirizzo IP pubblico che cambia ad ogni connessione (Se spengo e riaccendo il router ottengo 1 altro indirizzo ip e accedo comunque al tuo sito) oppure mi metto un proxy e accedo lo stesso al tuo sito....

    Io bloccherei l'indirizzo email registrato.


  • User

    @infosicurezza said:

    Ma bloccando l'ip non è una mossa giusta, vai a bloccare un indirizzo IP pubblico che cambia ad ogni connessione (Se spengo e riaccendo il router ottengo 1 altro indirizzo ip e accedo comunque al tuo sito) oppure mi metto un proxy e accedo lo stesso al tuo sito....

    Io bloccherei l'indirizzo email registrato.
    Pero pensandoci se io provo ad accedere 20 volte con l'account infosicurezza e te lo blocco poi tu che fai? Cioè potrei bloccare qualsiasi account che vedo su un forum ad esempio. Se invece blocco l'ip dopo 3 accessi complico la vita a chi deve mettersi a spegnere e riaccendere o a cambiarsi ip piu e piu volte.. magari gli passa la fantasia... Senno si metterebbe chiunque a bloccare username e email


  • User Attivo

    No perdonami,
    ma per me non ha senso ciò che hai scritto, o meglio non ho capito io cosa intendi che puoi bloccare qualsiasi account.
    A questo punto credo che tu voglia bloccare un utente o ad esempio un bot, che tenta di accedere X volte sbagliando di continuo user o password.

    A quel punto, dopo circa 3 / 5 tentativi gli fai uscire il codice captcha da inserire (Se è un bot, la smetterà visto che non conosce il codice), se continua allora prendi le giuste precauzioni IP o User a tua scelta e per sbloccarlo gli mandi il link su email.


  • User

    @infosicurezza said:

    No perdonami,
    ma per me non ha senso ciò che hai scritto, o meglio non ho capito io cosa intendi che puoi bloccare qualsiasi account.
    A questo punto credo che tu voglia bloccare un utente o ad esempio un bot, che tenta di accedere X volte sbagliando di continuo user o password.

    A quel punto, dopo circa 3 / 5 tentativi gli fai uscire il codice captcha da inserire (Se è un bot, la smetterà visto che non conosce il codice), se continua allora prendi le giuste precauzioni IP o User a tua scelta e per sbloccarlo gli mandi il link su email.

    Parlavo del caso in cui non inserissi nessun captcha. se bloccassi un username solamente perche ha sbagliato password 5 volte. Chiunque potrebbe scrivere 5 volte il mio username e bloccarmi l'accesso.

    Anche inserendo il codice captcha vorrei che l'username (o l'ip) fosse bloccato per tot minuti. Pero bloccando l'username torniamo al problema appena descritto


  • User Attivo

    Eh ho capito ora...
    ma devi prendere una decisione su come agire, e ripeto per me la cosa più sensata è quella di mettere un captcha per capire se è un bot o un umano.
    Se proprio non vuoi, allora c'è poco da fare, non conosci l'identità della persona quindi blocchi l'indirizzo IP a monte e non fai eseguire query al database.


  • User

    Se anche inserissi un captcha io persona umana potrei bloccare il tuo username!

    Se un giorno non avessi nulla da fare e venissi sul forum GT e provassi ad inserire per 5 volte il tuo username te lo bloccherei perche sbaglio la password e tu non potresti piu entrare. Cosi solo pe ril gusto di farlo. Quindi non basta il captcha come misura. Blocca i bot ma non blocca le persone stupide. Quindi ci vuole una combo.


  • Super User

    Intanto credo che sia fondamentale capire di che tipo di login si tratta.

    Se il login lo deve poter fare una sola persona è una cosa, se invece devono poter loggare diverse persone da diversi computer allora il discorso è diverso.

    Io intanto farei che se uno sbaglia l'username al secondo tentativo sbagliato viene bloccato per N minuti, così intanto blocchi i bot.
    Ma ovviamente questa soluzione non va bene per i forum e gli accessi a siti in cui gli username sono pubblici.

    Il captcha come soluzione lo eviterei, serve solo a dimostrare di essere una persona e non un bot.