在CakePHP中清理SQL的所有方法

时间:2015-02-19 22:56:05

标签: mysql cakephp sql-injection

我为我的高级项目继承了一个用CakePHP编写的大型网站。不幸的是,它非常容易受到SQL注入的攻击。我之前从未使用过CakePHP,所以我试图确保我理解所有需要做的事情。使用save和find函数时,我所要做的就是使用正确的数组表示法来防止SQL注入?对于使用查询方法,我所要做的就是使用预处理语句?但是,我还需要做其他任何命令和方法吗?提前谢谢。

1 个答案:

答案 0 :(得分:3)

Cake的模型类的“典型”用法将通过正确转发数据和参数来保护您免受SQL注入漏洞的影响。

BUT !!:

模型query() method假定将使用value()函数手动转义参数,该函数可以在模型中访问,例如:

$db = $this->getDataSource();
$sql = "SELECT * FROM foo WHERE bar='" . $db->value($param, 'string') . "'";
$data_array = $this->Foo->query($sql);

仅供参考,如果您需要访问控制器中的value()函数,您必须执行以下操作:

   $db = ConnectionManager::getDataSource('default');
   ...

正如您所提到的,您也可以使用prepared statements,在这种情况下,驱动程序本身会处理转义。

请注意,虽然标准使用模型方法(query()除外)会为您处理所有事情,但您可以做一些时髦的事情 - 比如通过数组键传递参数或创建复杂的查找(例如,全文MATCH ... AGAINST语法) - 仍然需要您通过手动编码来防止SQL注入漏洞!

通常,只要ORM和标准模型方法能够解决问题,请尽量避免使用query()和/或预处理语句!

使用任何框架,信任但验证。即,使用API​​ doc来确认广告功能。 。E.g,:

http://api.cakephp.org/2.6/class-Mysql.html#_value