白狼栈 2016-04-18 16:25:41 12415次浏览 5条回复 6 3 0

作者:白狼 出处:http://www.manks.top/article/yii2_filter_xss_code_or_safe_to_database 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

实际开发中,涉及到的语言也好,框架也罢,web安全问题总是不可避免要考虑在内的,潜意识中的考虑。

意思就是说喃,有一条河,河很深,在没办法游过去的情况下你只能沿着河上唯一的一座桥走过去。

好啦,我们看看在yii框架的不同版本中是怎么处理xss攻击,sql注入等问题的。

啥啥啥,xss是啥,sql注入又是啥?哦我的天呐,不好意思,我也不知道,这个您问问小度小哥都行,随您。

通俗的说喃,就是两个原则问题:

1、表单提交内容,想安全的存入数据库

2、想安全的对数据进行输出

有同学疑问来了,我的数据都安全的存到数据库了,都已经是安全的了,咋输出还要过滤呢?博主si是si犯浑,有毛病勒。

不着急,我们先来看看yii中是怎么处理我们所说的安全问题。

无论是yii还是yii2版本,数据查询,数据入库,我们都可以很好的用AR操作进行,这样就灰常简单的避免了sql注入问题,为啥就so easy的避免了呢,这是因为在AR的底层,其实对PDO进行的封装,所以喃,妈妈再也不用担心注入的问题了

有同学在嘀咕了,我们查询的sql很复杂的,用yii的AR操作不了,不写sql不行,你看着办吧。吓唬小孩呢,还有操作不了的,头一次见!

当然啦,在不涉及接收参数的情况下,要不要用原生sql您随意,但是涉及外参的情况下,您要是想用sql查询请尽量用占位去操作,不是不相信您自己个的"过滤",其实也是不敢相信,如果您坚持自己个写原生sql,您随意好吧

下面我们来看看问题2,数据安全的输出,这个在yii和yii2中还是有一丁点差别滴。

yii中,纯文本输出呢,很简单,我们对要输出的内容 CHtml::encode() 即可,别嚷嚷,我知道你想说啥,对于想输出html文本,可以采用如下方式:

$purifier = new CHtmlPurifier;echo $purifier->purify($content);

放心,代码里面的js啥的统统会以文本的形式输出显示,那这里的xss问题我们也就可以放心了。

那要是yii2,又是怎样处理的喃?

<?= \yii\helpers\Html::encode($title) //纯文本 ?>
<?= \yii\helpers\HtmlPurifier::process($content) //html显示的文本 ?>

注意: HtmlPurifier 帮助类的处理过程较为费时,建议增加缓存

觉得很赞
亿速云
  • 回复于 2016-04-20 09:24 举报

    写的挺好 赞一个

    1 条回复
    回复于 2016-04-20 11:55 回复

    有用就好。

  • 回复于 2016-11-08 23:23 举报

    赞,风趣诙谐,就是“短”了点。

    1 条回复
    回复于 2017-09-11 18:05 回复

    短字圈起来,要考

  • 回复于 2017-04-27 14:34 举报

    <?= \yii\helpers\HtmlPurifier::process($content) //html显示的文本 ?>
    \yii\helpers\HtmlPurifier这个类里没有process()方法,怎么回事?

    6 条回复
    回复于 2017-04-27 15:06 回复

    yii2的版本

    回复于 2017-04-27 15:14 回复

    什么意思,能详细点吗?

    回复于 2017-04-28 08:12 回复

    你的yii2版本号贴一下

    回复于 2017-05-02 15:18 回复

    版本是2.0.8,跟版本有什么关系吗?

    回复于 2017-05-02 20:21 回复

    我还以为你是报错说是没这个方法呢。你是在这个类里没看到这个方法的意思?如果是,可以回去补补类相关的基础知识了(参考父类的process方法)

    回复于 2017-05-03 08:23 回复

    不好意思没仔细看搞错了类,还以为是HTMLPurifier类了。那怎么用了,整个项目都要使用?我们现在同事的做法是修改了源码的查询public function queryAll($fetchMode = null)

    {
        $res=$this->queryInternal('fetchAll', $fetchMode);
        if(is_array($res)){
            foreach($res as &$row){
                $row=array_map(function($name){
                    return Html::encode($name);
                },$row);
            }
        }
        return $res;
    }
    

    我觉得这种做法不是很好,还望指点。

  • 回复于 2017-12-20 15:56 举报

    yii2可以用

  • 回复于 2019-12-20 16:36 举报

    存的时候使用框架的save保存 还是会把html存到数据库

您需要登录后才可以回复。登录 | 立即注册