Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: sicurezza con PDO

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420

    sicurezza con PDO

    Ciao a tutti,
    settimana scorsa stavo realizzando a scopo didattico un semplice sistema di registrazione/login alla vecchia maniera (no OOP e funzioni mysql).. poi stesso qui sul forum mi è stato consigliato di passare a PDO e magari anche a scrivere codice oop, per cui seguendo le varie guide qui sul sito, ho trasformato questo:

    Codice PHP:
    $db_user 'root';
    $db_password '123456';
    $db_host 'localhost';
    $link msqly_connect("db_host","$db_user","$db_password") or die ("Errore connessione");
    $db mysql_select_db("SVILUPPO") or die ("Errore selezione DB");

    $loginform mysql_real_escape_string($_POST["login"]);
    $passwordform mysql_real_escape_string($_POST["password"]);
    $emailform mysql_real_escape_string($_POST["email"]);

    if (
    strpbrk($loginform",;'-+()=><@[]{} ") || strpbrk($passwordform",;'+()=><@[]{} ") || strpbrk($loginform",;'+()=><[]{} ")) {
       echo 
    "caratteri non validi";
       
    header("Refresh: 2, URL:http//localhost/registrati.html");
       return;
    }

    /*---query di inserimento---*/ 
    in questo:

    Codice PHP:
    $db_user 'root';
    $db_password '123456';
    $db_host 'localhost';
    $db_name 'SVILUPPO';

    $col "mysql:host=$db_host; dbname=$db_name";

    try {
       
    $db = new PDO($col"$db_user""$db_password");
    }

    catch(
    PDOException $e)   {
       echo 
    "Errore: ".$e->getMessage();
    }

    $loginform = ($_POST["login"]);
    $passwordform = ($_POST["password"]);
    $emailform = ($_POST["email"]);

    $sql $db->prepare("SELECT * FROM utenti WHERE login = '".$loginform."'"); 
    $sql->execute(); 
    $sql2 $db->prepare("SELECT * FROM utenti WHERE email = '".$emailform."'");
    $sql2->execute(); 

    if (
    $sql->fetchAll())   {
       echo 
    "Username già presente";
    }elseif (
    $sql2->fetchAll())   {
       echo 
    "Email già registrata";
    }else{
       
    /*registrazione nel db*/ 
    Sembra che tutto funzioni, ma non avendo mai utilizzato PDO, non so se manca qualcosa...
    Ad esempio, se elimino il blocco "catch{...} mi viene segnalato un errore di sintassi; è perchè il blocco è obbligatorio o perchè ho toppato qualche apice?
    Inoltre, leggevo da vari commenti qui sul forum che PDO mette al riparo automaticamente dai problemi legati all'SQL-Injection... ma in che modo? I controlli effettuati tramite mysql_real_escape_string e dall'espressione regolare per eliminare apici e altri caratteri potenzialmente dannosi nel primo codice, come sono gestiti in PDO?
    Altra cosa, sto cercando di passare man mano alla oop e riconosco nel secondo esempio la sintassi tipica, ma mi aspettavo anche di trovare definizioni di classi, metodi ecc che invece non vedo da nessuna parte e l'unica cosa che mi viene in mente è che possano già essere definite di default in qualche altro posto... dove?

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Sembra che tutto funzioni, ma non avendo mai utilizzato PDO, non so se manca qualcosa... Ad esempio, se elimino il blocco "catch{...} mi viene segnalato un errore di sintassi; è perchè il blocco è obbligatorio o perchè ho toppato qualche apice?
    Se rimuovi catch, devi togliere anche try

    Inoltre, leggevo da vari commenti qui sul forum che PDO mette al riparo automaticamente dai problemi legati all'SQL-Injection... ma in che modo? I controlli effettuati tramite mysql_real_escape_string e dall'espressione regolare per eliminare apici e altri caratteri potenzialmente dannosi nel primo codice, come sono gestiti in PDO?
    Non vorrei sbagliare, ma come hai scritto non sei al sicuro da sql-injection, dovresti usare i parametri

    Codice PHP:
    $loginform = ($_POST["login"]); 
    $passwordform = ($_POST["password"]); 
    $emailform = ($_POST["email"]); 

    $sth $db->prepare("SELECT * FROM utenti WHERE login = :login"); 
    $sth->execute(array(":login"=>$loginform));

    // In alternativa puoi usare bindValue
    // $sth->bindValue(":login", $loginform [, PDO::PARAM_STR] ); [] : opzionale
    // $sth->execute(); 

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Ciao,
    grazie per la risposta...
    Puoi darmi qualche dritta su come agiscono le righe di codice che hai corretto? Sto cercando anche su altri siti, ma non riesco a trovare esempi o spiegazioni abbastanza complete in italiano :-s

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    E' abbastanza semplice:

    Codice PHP:
    $sth $db->prepare("SELECT * FROM utenti WHERE login = :login AND password = :password"); 
    :login, e assword sono due placeholder, che PDO sostituirà con i valori veri. Per dire a PDO quali sono questi valori e a quale placeholder corrispondono, puoi fare:

    Codice PHP:
    $sth->execute(array(":login"=>$loginform":password"=>$password)); 
    Oppure usare la bindValue
    Codice PHP:
    //bindValue(placeholder, valore);
    $sth->bindValue(":login"$loginform);
    $sth->bindValue(":password"$password);
    // In questo caso puoi specificare anche il tipo delle variabili 
    // $sth->bindValue(":login", $loginform, PDO::PARAM_STR); :login è una stringa
    $sth->execute(); 
    In questo modo PDO sostituirà i placeholder con i valori indicati occupandosi anche dell'aspetto della sicurezza

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    I due metodi sono equivalenti?

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    si, con l'eccezione che con il secondo puoi specificare di che tipo sono i parametri

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Codice PHP:
    $loginform = ($_POST["login"]); 
    $passwordform = ($_POST["password"]); 
    $emailform = ($_POST["email"]); 

    $sth $db->prepare("SELECT * FROM utenti WHERE login = :login"); 
    $sth->execute(array(":login"=>$loginform)); 
    Prima di tutto grazie per l'aiuto che mi stai dando!
    Mi sfugge qualche passaggio...
    Se da form digito "#@", la variabile $loginform conterrà ovviamente "#@" ... a questo punto cosa conterrà il placeholder :login ?
    Per come interpreto io il codice, conterrà comunque "#@"
    Cosa mi sfugge?

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Esatto, PDO sostituirà :login con '@#' e non dovrai preoccuparti della sicurezza (sql-injection)

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Originariamente inviato da boots
    Esatto, PDO sostituirà :login con '@#' e non dovrai preoccuparti della sicurezza (sql-injection)
    nel senso che il placeholder verrà interpretato di default come una stringa e non più come una variabile?

  10. #10
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Giusto per capirci:
    Codice PHP:
    "SELECT * FROM utenti WHERE login = :login" 
    Non è un 'istruzione sql valida (:login cos'è ?)

    Con
    Codice PHP:
    $sth->execute(array(":login"=>$loginform)); 
    Dici a PDO, di eseguire la query e di sostituire :login con $loginform, quindi se
    $loginform = "boots"
    La query eseguità diventerà:

    Codice PHP:
    "SELECT * FROM utenti WHERE login = 'boots'" 

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.