如何在手动创建的查询中防止 SQL 注入?
How to prevent SQL injections in manually created queries?
我正在使用 cakephp,下面的查询有 sql 我知道的注入。但问题是如何在同一个查询中解决这个问题。我不想使用其他方法。请不要取消投票
Search->query("select * from subcategories where subcat_name like '%".$_GET['searchkey']."%' and subcat_status='active' ");
你应该完全避免这种构建查询的方式。
由于您已标记 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'"));
I dont want to use other method
您应该使用提供所需功能的任何方法,而不是您比其他人更喜欢的方法!
此外,您永远不要在 CakePHP 中直接访问 superglobals,这只会给您带来麻烦,尤其是在单元测试中。使用请求对象提供的适当抽象方法,即 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') . '%')
);
或者使用 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()
、 手动转义该值,但是您应该不惜一切代价避免以这种方式构造查询字符串,因为一个小错误最终可能会导致插入一个未转义的值,从而产生一个可能的 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'"
);
我正在使用 cakephp,下面的查询有 sql 我知道的注入。但问题是如何在同一个查询中解决这个问题。我不想使用其他方法。请不要取消投票
Search->query("select * from subcategories where subcat_name like '%".$_GET['searchkey']."%' and subcat_status='active' ");
你应该完全避免这种构建查询的方式。 由于您已标记 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'"));
I dont want to use other method
您应该使用提供所需功能的任何方法,而不是您比其他人更喜欢的方法!
此外,您永远不要在 CakePHP 中直接访问 superglobals,这只会给您带来麻烦,尤其是在单元测试中。使用请求对象提供的适当抽象方法,即 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') . '%')
);
或者使用 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()
、 手动转义该值,但是您应该不惜一切代价避免以这种方式构造查询字符串,因为一个小错误最终可能会导致插入一个未转义的值,从而产生一个可能的 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'"
);