【发布时间】:2012-02-04 09:05:40
【问题描述】:
我正在尝试使用 Codeigniter 中 Active Record 助手中的 update_batch() 函数,如下所示:
var_dump($data);
$this->db->where('event_id',$data['event_id']);
$this->db->update_batch('results',$data['results'],'uid');
echo $this->db->last_query();
这会打印出以下内容:
array(2) {
["event_id"]=>
string(2) "11"
["results"]=>
array(2) {
[0]=>
array(2) {
["uid"]=>
string(36) "1beab26d-f705-11e0-a190-f46d048dfd25"
["res"]=>
string(1) "2"
}
[1]=>
array(2) {
["uid"]=>
string(36) "9dcc9e0a-bf24-11e0-838c-f46d048dfd25"
["res"]=>
string(1) "1"
}
}
}
UPDATE results SET res = CASE
WHEN uid = '1beab26d-f705-11e0-a190-f46d048dfd25' THEN '2'
WHEN uid = '9dcc9e0a-bf24-11e0-838c-f46d048dfd25' THEN '1'
ELSE res END WHERE `event_id` = '11' AND uid IN ('1beab26d-f705-11e0-a190-f46d048dfd25','9dcc9e0a-bf24-11e0-838c-f46d048dfd25')
显然,这是一个很大的安全漏洞,因为字段和表名没有从update_batch 部分转义(尽管它们在where 部分中转义)。难道我做错了什么?文档中未指定此行为:
http://codeigniter.com/user_guide/database/active_record.html#update
【问题讨论】:
-
实际上看起来像一个错误/疏忽,但除非您动态传递表名,否则我看不出不转义它们会造成麻烦。您能否举一个可能导致安全问题的示例?
-
$data 来自用户输入,不可信。
-
啊,'res' 和 'uid' 作为数据传入,这会是一个安全问题... :-/
标签: php sql codeigniter escaping