【问题标题】:Is CodeIgnighter's Database Library Enough to Prevent Against Sql InjectionsCodeIgnighter 的数据库库是否足以防止 Sql 注入
【发布时间】:2011-10-25 08:06:09
【问题描述】:
我正在尝试在 codeignighter 中编写模型,例如 here,它依赖于 CodeIgnighter 的数据库 API。我已经阅读了 forum post 关于 CodeIgnighter 的数据库 API 是否完全阻止 SQL 注入的内容。我知道很多people suggest 使用PDO Framework 作为防止SQL 注入的最佳方法。我知道如何使用 PDO 框架,但是我不知道如何使用准备好的语句在模型中生成查询。我是使用 CodeIgnighter 的数据库 API 从 SQL 注入中保存还是应该使用 PDO 框架?
【问题讨论】:
标签:
php
sql
security
codeigniter
sql-injection
【解决方案1】:
如果你使用内置函数的代码点火器,你会没事的。
这里有一个关于 stackoverflow 的链接,可以更详细地说明这一点:
StackOverflow Question,
使用参数化查询,并遵循上述 SO 问题中的示例,您将不会受到 SQL 注入的影响,您自己也无能为力,只需遵循 CI 最佳实践并使用所有内置的代码编写好的代码功能。
【解决方案2】:
关于 CodeIgniter 不能多说,但会以 Doctrine 为例。假设您想从数据库中获取用户。您可以在查询中添加条件:
// Correct usage. $user value will be passed as bound parameter to PDO
$query->where('u.username = ?', $user);
或者..
// Works fine but should not be used like this and can be exploited if $user was not sanitized/escaped
$query->where("u.username = '$user' ");
同样适用于普通 PDO。
所以答案是:它可以帮助你,但你仍然需要阅读文档并遵循指南。
【解决方案3】:
CI 的库与mysql_real_escape_string(或任何您喜欢的驱动程序)一样可以很好地防御 sql 注入。为什么是这样?因为他们的数据库库在所有输入上调用它。它还正确地转义了所有表名和列名。此外,使用 PDO 意味着您需要以某种方式重写 CI 的 Active Record 语法。
也就是说,PDO 有很多好处。我只是不认为安全实际上是其中之一。