问题描述

laravel中,自带的blade模板参数,使用{{}}双花括号,自带有htmlspecialchars()编译,不会导致XSS
但是,在类似文章内容这样的字段,简单的换行不能满足样式需求,不得不使用{!! !!},从而导致潜在的XSS漏洞。
所以,我们需要在写入数据库之前,就对文章内容做过滤。

实现方法

安装扩展

使用mews/purifier扩展,github地址:mews/purifier

composer require mews/purifier
php artisan vendor:publish --provider="Mews\Purifier\PurifierServiceProvider"

使用方式

laravel 5.5+中直接使用以下方法:

clean(Input::get('inputname'));   // 辅助函数的形式
或者
Purifier::clean(Input::get('inputname'));  // facaded 形式

选择配置

使用指定配置规则过滤

clean('This is my H1 title', 'titles');

常用配置

配置文件位置:config/purifier.php;
注意插件库默认只支持受信任的安全元素,其他元素需要在custom_definition选项里面添加,如:添加nav元素,在custom_definition.elements选项定义之后,若定义了HTML.AllowedElements选项还需把nav元素添加进去,表示允许信任这个元素。

//受信任的的元素
'HTML.AllowedElements' => 'a,abbr,address,b,bdo,big,blockquote,br,caption,cite,code,col,colgroup,dd,del,div,dl,dt,em,font,h1,h2,h3,h4,h5,h6,hr,i,img,ins,li,ol,p,pre,s,small,span,sub,sup,strong,table,tbody,td,tfoot,th,thead,tr,tt,u,ul'
//受信任的的属性
'CSS.AllowedProperties' => 'background,background-attachment,background-color,background-image,background-position,background-repeat,border,border-bottom,border-bottom-color,border-bottom-style,border-bottom-width,border-collapse,border-color,border-left,border-left-color,border-left-style,border-left-width,border-right,border-right-color,border-right-style,border-right-width,border-spacing,border-style,border-top,border-top-color,border-top-style,border-top-width,border-width,caption-side,clear,color,font,font-family,font-size,font-style,font-variant,font-weight,height,letter-spacing,list-style,list-style-image,list-style-position,list-style-type,margin,margin-bottom,margin-left,margin-right,margin-top,padding,padding-bottom,padding-left,padding-right,padding-top,text-align,text-decoration,text-indent,text-transform,width,word-spacing'

特殊说明

目前一些富文本编辑器,会将输入的内容进行htmlspecialchars()编码,编码过的内容,使用此扩展无法起到过滤作用无法起到过滤作用!无法起到过滤作用!.
所以,建议先对内容进行htmlspecialchars_decode()解码!,然后再过滤,这点非常重要。

$content = clean(htmlspecialchars_decode( $content));
Last modification:February 17th, 2020 at 07:19 pm