Php PDO::ATTR_EMULATE_PREPARES=>;假的

Php PDO::ATTR_EMULATE_PREPARES=>;假的,php,pdo,Php,Pdo,我不熟悉php和PDO,所以我读了一篇类似的帖子-> PDO真的没有在mysql中使用准备好的语句吗?是的 默认设置(至少在测试版本I时),但可以打开本机模式 手动打开。若否,政府可否透过雇用雇员,强迫他们这样做 PDO::ATTR_EMULATE_PREPARES设置,名称很漂亮 不言自明$dbh->setAttribute(PDO::ATTR\u EMULATE\u), 假);你应该那样做吗?这是他们中最难的问题。 嗯,我想说——是的,你应该。如果选择PDO作为db驱动程序, 在仿真模式中使

我不熟悉php和PDO,所以我读了一篇类似的帖子->

PDO真的没有在mysql中使用准备好的语句吗?是的 默认设置(至少在测试版本I时),但可以打开本机模式 手动打开。若否,政府可否透过雇用雇员,强迫他们这样做 PDO::ATTR_EMULATE_PREPARES设置,名称很漂亮 不言自明$dbh->setAttribute(PDO::ATTR\u EMULATE\u), 假);你应该那样做吗?这是他们中最难的问题。 嗯,我想说——是的,你应该。如果选择PDO作为db驱动程序, 在仿真模式中使用它没有任何意义。


准备好的语句不受SQL注入的保护吗?如果从'true'->false,为什么要更改呢??什么是本机模式???

从那以后我改变了主意

首先,每种模式都同样安全。
使准备好的语句安全的不是本机绑定,而是参数化语句的一般原则,它完成了格式化,从而生成了不受攻击的查询

因此,我宁愿将仿真模式保持在上,因为它对于平均的web使用更有意义,并且允许一些小的便利,例如更合理的错误消息(在查询中实际替换了数据)或具有相同名称的多个占位符


从模拟模式改为本机模式的唯一原因是预处理语句的另一个好处——可以多次执行一次预处理的语句。但是,如上所述,很少需要它。

这取决于对您来说最重要的是什么-简单的编码和很少的行数或适当的方式来避免sql注入。 只要您不使用大型数据库,它对速度没有任何影响,所以最好将其保留为avay 您可以像这样编写代码

$result = $this->db->select('SELECT * FROM tbl_users WHERE login = :login AND password = :password', $arraiul);
还是那样

function editusers(){
        $id = $_POST['id'];
        $name = $_POST['name'];
        $login = $_POST['username'];
        $password = $_POST['password'];
        $email = $_POST['email'];
        $power = $_POST['power'];
        if ($password ==''){
            $sqlstm = "UPDATE tbl_users SET name='$name', login='$login', email='$email', power='$power' WHERE id='$id'";
        } else {
            $sqlstm = "UPDATE tbl_users SET name='$name', login='$login', password=MD5('$password'), email='$email', power='$power' WHERE id='$id'";
        }
        $sth = $this->db->prepare($sqlstm);
        $sth->execute();        
    }
enter code here

这是如何回答这个问题的?另外,这个答案很容易受到SQL注入的影响,因为它直接将$\u POST变量中的内容插入到SQL中。在答案中显示错误的做法是不好的做法。如果这两种模式同样安全,那么为什么您会说最好保持模拟模式打开?当一个查询只执行一次时,只是为了避免两次往返?这是一个合理的理由,我只是在问。@BillKarwin实际上,我不觉得额外的往返也那么重要。是奥卡姆的剃刀把它剃掉的。此外,仿真模式的小方便性允许多个占位符具有相同的名称。@BillKarwin感谢您提到
两次往返。您是否同意从安全角度来看,这两种方法是相同的?也许我太偏执了,但我会关闭仿真(如果可能的话)PDO现在已经相当成熟和可靠了,所以我同意@YourCommonSense的观点——只要你不使用古老版本的PHP,就不会有太大的风险。如果您有妄想症,并且想要冗余安全性,您还可以在将应用程序变量作为参数传递之前对其进行筛选或白名单。此问题及其答案可能也会有所帮助: