前几天因为一些别的原因,网站要小小的改版下,后来想现在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();
试了下,转义了。
当然也许是我没清缓存,当时第一次配置了过滤配置文件没生效,后来才生效也说不定。
搞定,睡觉了,美滋滋!