如何防止手动创建的查询中的SQL注入?

时间:2017-01-14 07:50:04

标签: php cakephp cakephp-2.0 cakephp-2.3

我正在使用cakephp,以下查询已经知道sql注入。但问题是如何在同一个查询中修复此问题。我不想用其他方法。请不要投票

Search->query("select * from subcategories where subcat_name like '%".$_GET['searchkey']."%' and subcat_status='active' ");

2 个答案:

答案 0 :(得分:1)

  

我不想使用其他方法

您应该使用提供所需功能的任何内容,而不是您喜欢的方法!

此外,你永远不应该直接在CakePHP中访问超全局,这只会给你带来麻烦,特别是在单元测试中。使用请求对象提供的正确抽象方法,即CakeRequest::query()

<强> Cookbook > Controllers > Request and Response objects > Accessing Querystring parameters

使用预备陈述

话虽如此,使用预准备语句,通过传递值绑定到Model::query()的第二个参数:

$result = $this->Search->query(
    "select * from subcategories where subcat_name like ? and subcat_status='active'",
    array('%' . $this->request->query('searchkey') . '%')
);

<强> API > Model::query()

或使用DboSource::fetchAll(),它也接受参数作为第二个参数:

$db = $this->Search->getDataSource();
$result = $db->fetchAll(
    "select * from subcategories where subcat_name like ? and subcat_status='active'",
    array('%' . $this->request->query('searchkey') . '%')
);

手动逃生

为了完整起见,还可以通过DboSource::value()手动转义值,但是你应该避免不惜一切代价构建查询字符串,因为一个小错误可以结束up会导致插入未转义的值,从而产生可能的SQL注入漏洞:

$searchkey = $this->request->query('searchkey');

$db = $this->Search->getDataSource();
$value = $db->value('%' . $searchkey . '%', 'string');

$result = $this->Search->query(
    "select * from subcategories where subcat_name like $value and subcat_status='active'"
);

<强> API > DboSource::value()

答案 1 :(得分:-2)

你应该完全避免这种构建查询的方式。 由于您已经标记了cakephp 2.0,2.3,因此Sanitize :: escape(string,conn)可能符合您的需求。

Search->query(Sanitize::escape("select * from subcategories where subcat_name like '%".$_GET['searchkey']."%' and subcat_status='active'"));