thinkphp真的安全吗?进来看看就知道

浏览:11750 发布日期:2014/02/11 分类:求助交流 关键字: thinkphp不安全
求一份PHP工作晚上,有意请联系本人563268276
部分内容摘自网络。看完之后受益匪浅,和大家分享
之前发过关于thinkphp的一个ip获取漏洞,官方木有反应
http://www.thinkphp.cn/bug/2756.html
于是就考虑到官方的关于web中的sql注入过滤的问题是否也是非常马虎。
看来几篇文章,发现确实这个thinkphp 框架写的不怎么样。对于安全问题视而不见。以下部分内容摘自网络以及本人测试
测试:下载thinkphp的当前最新版本ThinkPHP_3.2,我们来看看代码,用事实说话,在sql注入防止上。thinkphp的处理方式
ThinkPHP\Library\Think\Model.class.php里面有如下的代码protected function parseSql($sql,$parse) {
        // 分析表达式
        if(true === $parse) {
            $options =  $this->_parseOptions();
            $sql    =   $this->db->parseSql($sql,$options);
        }elseif(is_array($parse)){ // SQL预处理
            $parse  =   array_map(array($this->db,'escapeString'),$parse);
            $sql    =   vsprintf($sql,$parse);
        }else{
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
        }
        $this->db->setModel($this->name);
        return $sql;
    }
array_map(array($this->db,'escapeString'),$parse);
关键是调用了对应的数据库类型里面的escapeString进行处理。因为php通常和mysql作为搭配,我就看了一下mysql的处理。里面包括了mysql和mysqli的处理代码
mysql版本的处理public function escapeString($str) {
        if($this->_linkID) {
            return mysql_real_escape_string($str,$this->_linkID);
        }else{
            return mysql_escape_string($str);
        }
    }
mysqli的处理方式。public function escapeString($str) {
        if($this->_linkID) {
            return  $this->_linkID->real_escape_string($str);
        }else{
            return addslashes($str);
        }
    }
看似很正常的处理方式,但是你们明白addslashes、mysql_escape_string、mysql_real_escape_string它们的真正的安全性吗,下面这些文章会让你明白的。
http://blog.csdn.net/felio/article/details/1226569
按照文章的说明,测试代码test.php,文件保存为gbk格式测试一下就明白addslashes安全性了<?php
error_reporting(0);
header('Content-Type: text/html; charset=gbk');  
$username = $_POST['username'];  
    $sqlx="select id,isDisplay from user where usname='".addslashes($username)."' and passwd='$password'";
    echo $sqlx;
    echo "<br>";
    echo addslashes($username);
    echo 444;
?>

<form action="" method=post>
 <input type=text name="username" value="">
 <input type=submit>
</form>
下面还有一个连接地址,详细说明了关于addslashes、mysql_escape_string、mysql_real_escape_string的安全性问题。而且这个问题早在2006年就被提出了哦,thinkphp还是不重视
http://blog.csdn.net/zhuizhuziwo/article/details/8525789
最后说一句,按照php官方说法,最好用pdo的预处理,看看thinkphp的封装,完全是误人子弟
ThinkPHP\Library\Think\Db\Driver\Pdo.class.phpprotected function parseValue($value) {
        if(is_string($value)) {
            $value =  strpos($value,':') === 0 ? $this->escapeString($value) : '\''.$this->escapeString($value).'\'';
        }elseif(isset($value[0]) && is_string($value[0]) && strtolower($value[0]) == 'exp'){
            $value =  $this->escapeString($value[1]);
        }elseif(is_array($value)) {
            $value =  array_map(array($this, 'parseValue'),$value);
        }elseif(is_bool($value)){
            $value =  $value ? '1' : '0';
        }elseif(is_null($value)){
            $value =  'null';
        }
        return $value;
    }

public function escapeString($str) {
         switch($this->dbType) {
            case 'PGSQL':
            case 'MSSQL':
            case 'SQLSRV':
            case 'MYSQL':
                return addslashes($str);
            case 'IBASE':                
            case 'SQLITE':
            case 'ORACLE':
            case 'OCI':
                return str_ireplace("'", "''", $str);
        }
    }
一点预处理的东西都没有,到处充斥着addslashes、mysql_escape_string、mysql_real_escape_string看懂了吧。这个封装就是骗小孩的把戏
不多吐槽了。按照php官方说法,大家还是老老实实用pdo的参数绑定方式吧。
下面是参考文章对于pdo有详细说明
http://zhangxugg-163-com.iteye.com/blog/1835721
http://zhangxugg-163-com.iteye.com/blog/1850461
最佳答案
评论( 相关
后面还有条评论,点击查看>>