我是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
调用quote
,DB_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语句。