TP升级到5.17后的一点安全小问题的排除
编辑时间:2018-06-27 作者:金满斗 浏览量:2088 来源:原创

前几天因为一些别的原因,网站要小小的改版下,后来想现在tp已经升到了5.17了,而我那时候是5.0时代,反正内容不多,干脆升下级吧。

别的不表,一切顺利。毕竟老司机了,干脆加了个快捷发帖。方便自己和有些网友也可以发帖。后台加了审核功能,默认是关闭了,反正网站没什么人气,一阵得意。

昨天快捷发帖,玩了看效果突然发现列表页排序有点乱,尼玛,难道有一些东西没有转义,影响到了排版,因为刚发的是转载的一个关于前端的文章,里面css代码很多。而我的摘要栏如果手动没填写的话默认的是摘取的文章里的内容。

为了证实我的猜想,跑去数据库看了一下,果然以前现在发的文章在数据库里没有转义。为了证实我的猜想,分别吧标题和摘要写上“<script>alert(112)</script>”试下,发现再详情页没弹窗,而在列表页竟然可以弹窗,不由得倒吸了一口凉气。

我对到底存入数据库的数据是否应该转义以前一直都有一些摇摆,认为这样有必要吗?这次加深了我对存入数据库的数据必须要转义的认识。tp5.17版号称增加了安全性,而我看文档说每次都会在生成模版前自动转义的,为什么还有这个问题呢??

排查自己的代码,发现了列表页上这样一句,

{:mb_substr($vo.desc,0,70,'utf-8')}...

这也就是列表也上自动截断多余摘要文字的一句,看了下自动生成的临时文件,果然模版里如果用了函数,就不自动再加转义了。

问题找到了,本来想就改这里,但想到治标不治本,数据库存入先转义才是王道。看文档,文档里说了默认是无任何转义的,要自己添加。

跑到配置文件  app.php 里,把'default_filter'=> 'htmlspecialchars',加上。再提交测试,当时用的是助手函数,过滤代码如下

$data= input('post.');
	    	foreach ($data as $key => $value) {
	            $data[$key] = trim($value);
	        }

先获取数据,再去掉空格。好像是没毛病的,但看数据库那边,没什么反应,还是没转义。

干脆用了一个我后来通用的获取数据的方法。

 /**
     * 数据库字段 网页字段转换
     * #Date:
     * @param $array 转化数组
     * @param $method 访问方式
     * @return 返回数据数组
     */
    protected function buildParam($array = [], $method = 'param')
    {
        $result_data = [];
        if (empty($array)) {
         return $this->request->$method();
        } elseif (is_array($array) && !empty($array)) {
         foreach ($array as $index => $item) {
            if (is_numeric($index)){
                $result_data[$item] = trim($this->request->$method($item));
            } else {
                $result_data[$index] = trim($this->request->$method($item));
             }
            }
        }
        return $result_data;
    }
    
     $data= $this->buildParam();



试了下,转义了。

当然也许是我没清缓存,当时第一次配置了过滤配置文件没生效,后来才生效也说不定。

搞定,睡觉了,美滋滋!


来说两句吧