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

    [PDO] - dubbio su sicurezza e performance.

    Sto migrando a PDO, ed ho dei dubbi in merito alla sicurezza (SQL injection) e performance,
    vorrei sapere tra i seguenti metodi quale è il più sicuro / veloce;
    metodo 1: prepare bindValue & execute
    metodo 2: prepare execute array

    Codice PHP:
    <?php 
    // test pdo
    try {
        
    $dsn='mysql:host=localhost;dbname=mydb;charset=utf8';
        
    $username='*****';
        
    $password='******';
        
    $dbh = new PDO($dsn$username$password);
        
    $dbh->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
        
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARESfalse);
    }catch(
    PDOException $e){
        
    print_r($e->getMessage());
    }
    //URL ?id_categoria=13&id_marca=1&keyword=a 
        
    $id_categoria=$_GET['id_categoria'];
        
    $id_marca=$_GET['id_marca'];
        
    $keyword=$_GET['keyword'];
    //--------------------------------------------------------------------------------------------
    // 1 Test bindValue
    //--------------------------------------------------------------------------------------------
    $sql='SELECT * FROM `prodotti` WHERE `id_categoria`=? AND `id_marca`=? AND `prodotto` LIKE ? LIMIT 10';
    $sth=$dbh->prepare($sql);
    $sth->bindValue(1$id_categoriaPDO::PARAM_INT);
    $sth->bindValue(2$id_marcaPDO::PARAM_INT);
    $sth->bindValue(3"%$keyword%"PDO::PARAM_STR);
    $sth->execute();
    echo 
    '<pre>';
    echo 
    "1 Test bindValue\n";
    while(
    $row=$sth->fetch(PDO::FETCH_ASSOC)){
        echo 
    'id_categoria -> '.$row['id_categoria']."\n";
        echo 
    'id_marca -----> '.$row['id_marca']."\n";
        echo 
    'prodotto -----> '.$row['prodotto']."\n";
        echo 
    "-------------------------------------------------------------\n";
    }
    echo 
    '</pre>';
    //--------------------------------------------------------------------------------------------
    // 2 Test execute array
    //--------------------------------------------------------------------------------------------
    $sql='SELECT * FROM `prodotti` WHERE `id_categoria`=? AND `id_marca`=? AND `prodotto` LIKE ? LIMIT 10';
    $sth=$dbh->prepare($sql);
    $sth->execute(array((int)$id_categoria, (int)$id_marca"%$keyword%"));
    echo 
    '<pre>';
    echo 
    "2 Test execute array\n";
    while(
    $row=$sth->fetch(PDO::FETCH_ASSOC)){
        echo 
    'id_categoria -> '.$row['id_categoria']."\n";
        echo 
    'id_marca -----> '.$row['id_marca']."\n";
        echo 
    'prodotto -----> '.$row['prodotto']."\n";
        echo 
    "-------------------------------------------------------------\n";
    }
    echo 
    '</pre>';
    ?>


    Grazie

  2. #2
    come da documentazione http://www.php.net/manual/en/pdostatement.execute.php execute tratta tutti i parametri come se fossero stringhe. Quindi se vuoi un enforce del tipo di dato, o se devi fare cose piu complicate, devi usare bindValue.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    ti ringrazio per i chiarimenti... alcune domande.. c'è differenza in termini di performance tra i due metodi? per la sicurezza mi sento orfano di mysql_real_escape_string e non so come processare i get e i post in PDO grazie

  4. #4
    Sulle performance non lo so ma credo che siano le stesse perchè internamente execute userà immagino gli stessi meccanismi di bindValue solo trattando il dato come stringa e non distinguendo tra tipi e tipi. Sul "come trattare i dati del GET/POST" è sempre scritto nella documentazione che

    Calling PDO:repare() and PDOStatement::execute() for statements that will be issued multiple times with different parameter values optimizes the performance of your application by allowing the driver to negotiate client and/or server side caching of the query plan and meta information, and helps to prevent SQL injection attacks by eliminating the need to manually quote the parameters.
    ovviamente puoi aiutare e aiutarti validando l'input del sistema prima di passare alle query. Questa risposta mi sembra poi molto interessante:

    http://stackoverflow.com/questions/1...-sql-injection
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    grazie per i chiarimenti e la documentazione.

Tag per questa discussione

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.