【问题标题】:Should I use bindValue() or execute(array()) to avoid SQL injection?我应该使用 bindValue() 还是 execute(array()) 来避免 SQL 注入?
【发布时间】:2013-12-31 07:52:54
【问题描述】:

为了防止 SQL 注入,我正在使用 PDO。我见过人们同时使用这两种方法,即:bindValue() 然后 execute() 或只是 execute(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();
    }


    ?>

【问题讨论】:

  • 有趣的是你应该问。 Have a read at this...阅读全文,你会很惊讶;我是。
  • mysql_real_escape_string 本身并没有被弃用。 ENTIRE mysql_*() 函数集已弃用。同样, m_r_e_s() 需要与服务器建立活动连接才能运行,因为您使用的是 PDO,所以您不太可能拥有。你不能像那样混合/匹配库。 PDO 准备好的语句几乎完全消除了手动转义数据的需要。
  • 由于您使用的是准备好的语句,因此 m_r_e_s 调用实际上只会对数据进行双重转义,并以您以后不喜欢的方式将其丢弃。
  • 我现在明白了。我不会使用 m_r_e_s()!谢谢。

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


【解决方案1】:

execute(array) 只是在每个数组元素上调用 bindValue 的循环的快捷方式。使用最适合您的程序流程的任何内容。两者都可以防止 SQL 注入。

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

【讨论】:

  • 类型转换可能仍然有助于解决“尝试将字符串插入数字列时出现数据库错误”的情况,但如果将其应用于绑定值( execute(array) 只是绑定值的一个特例)。
猜你喜欢
  • 2016-12-28
  • 2018-10-25
  • 2014-03-01
  • 2011-07-31
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多