ThinkPHP 3.1.3及之前的版本使用不当可造成SQLi

Lib/Core/Model.class.php中解析SQL语句的函数parseSql没有对SQL语句进行过滤,使用不当可导致SQL注入。(哈哈,其实用再安全的框架使用不当都可能造成SQLi)

函数:

/**
* 解析SQL语句
* @access public
* @param string $sql SQL指令
* @param boolean $parse 是否需要解析SQL
* @return string
*/
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;
}

如果使用以下方式编写查询数据库代码,则会造成SQL注入。

$model=M('test');
$m=$model->query('select * from test where id="%s"',$_GET['id']);
dump($m);
die;

可提交以下请求造成SQLi

http://localhost/Main?id=foo" or 1="1
上一篇:SqlServer和Oracle中一些常用的sql语句10 特殊应用


下一篇:Java后端程序员都做些什么?