我应该使用bindValue()还是execute(array())来避免SQL注入?

时间:2013-12-12 18:29:32

标签: php security pdo database-connection sql-injection

作为SQL注入的预防措施,我正在使用PDO。我见过人们使用这两种方法,即:bindValue()然后执行()或者只执行(array())

这两种方法都可以防止攻击吗?由于不推荐使用mysql_real_escape_string(),还有什么我应该考虑在这里使用的吗?

喜欢$ aenrollmentno我应该转型为

$aenrollmentno = (int)($_POST['aenrollmentno']);

如果我没有在准备好的声明中使用它,这是否足够安全?我缺少的任何其他安全措施?

   <?php  


     if(isset($_POST['aenrollmentno']))
     {
    $aenrollmentno = mysql_real_escape_string($_POST['aenrollmentno']); 
     }



 if(isset($_POST['afirstname']))
        {
            $afirst_name  = mysql_real_escape_string($_POST['afirstname']);
            $afirstname = ucfirst(strtolower($afirst_name));

    }




    //PDO connection     
    try {


        $conn = new PDO('mysql:host=localhost;dbname=practice','root','');
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

        $stmt = $conn->prepare('INSERT INTO  modaltable(afirstname, alastname,aenrollmentno) VALUES (:afirstname,:alastname,:aenrollmentno)');

        $stmt->execute(array(

        'afirstname' => $afirstname,
        'alastname' => $alastname,
        'aenrollmentno' => $aenrollmentno,

        ));



    echo "Success!";


    }
    catch (PDOException $e) {
        echo 'ERROR: '. $e->getMessage();
    }


    ?>

1 个答案:

答案 0 :(得分:1)

execute(array)只是在每个数组元素上调用bindValue的循环的快捷方式。使用适合您的程序流程的最佳方案。两者都阻止了SQL注入。

经验法则:无论你准备什么,都不应该以任何方式依赖于用户输入。你可以传递你想要执行的任何东西() - 你可能会遇到运行时错误,例如:如果您尝试将非数字字符串放入数字列 - 但您不允许SQL注入。