CodeIgniter PDO驱动程序使用查询而不是准备?这不是不太安全吗?



我是php的CodeIgniter框架的新手,正在研究2.1.0版本的PDO数据库驱动程序。我注意到它使用了PDO的"query"函数,而不是"prepare"one_answers"bindParam"/"bindValue"。

这不是完全错过了首先使用PDO的要点吗?事实上,与使用他们提供的普通mysql驱动程序相比,PDO对sql注入的保护更少。它似乎不像其他提供的驱动程序那样逃避查询?还是我完全误解了什么?

编辑:看起来CodeIgniter实际上可能正在使用PDO::quote进行消毒。但即使是php文档也表示不建议这样做,因为它不太安全,而且似乎首先错过了PDO的要点

我没有使用CodeIgniter,所以我实际上不得不对此进行一些研究。事实证明,CodeIgniter确实提供了一种称为QueryBindings的参数化查询的外观。

它是这样工作的:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick')); 

根据文件:

使用绑定的第二个好处是自动转义值,从而生成更安全的查询。您不必记住手动转义数据;发动机自动为你做这件事。

不过,它对准备好的语句功能进行了抽象,这对我来说很奇怪。我觉得这几乎是一纸空文。Heh:/

我正在查看源代码,我看到escape_str调用quoteDB_driver->escape调用escape_str。我还没有完全弄清楚整体结构。所以我不确定escape本身是否被调用到它应该在的位置

但是,如果使用得当,PDO::quote是安全的。准备好的语句对于应用程序编程来说更容易,但对于提供自己抽象的库来说,PDO::quote可能是更好的选择。

我不知道CI,但有一条简单的规则需要记住:

尽管人们普遍认为

独自逃跑没有什么好处

事实上,它应该总是转义+引用
如果我们不引用转义的数据,那么转义对我们没有好处。

所以,我想CI两者都有。如果是这样的话,它应该是安全的。

我能想到的唯一结果就是极限参数。如果将它们作为字符串类型的变量传递,CI查询可能会抛出错误,就像兼容模式下的PDO一样。如果你能测试一下这种行为并公布结果,我将不胜感激。

这听起来很对。pdo::query()的文档说"应该正确转义查询中的数据。"

如果使用此函数构建SQL语句,强烈建议使用PDO::prepare()来准备带有绑定参数的SQL语句,而不是使用PDO:quote()将用户输入插入SQL语句。带有绑定参数的预处理语句不仅更便携、更方便、不受SQL注入的影响,而且执行速度通常比插值查询快得多,因为服务器端和客户端都可以缓存编译后的查询形式。

不过,我无法深入了解为什么codeigniter使用query()而不是prepare()。

要在prepare语句中使用pdo,需要做一些修改。

http://christopherickes.com/web-app-development/using-pdo-in-codeigniter/

然后,您可以使用prepare语句。

相关内容

最新更新