在laravel中,自带的blade模板参数,使用{{}}双花括号,自带有htmlspecialchars()编译,不会导致XSS。但是,在类似文章内容这样的字段,简单的换行不能满足样式需求,不得不使用{!! !!},从而导致潜在的XSS漏洞。所以,我们需要在写入数据库之前,就对文章内容做过滤。
实现方法安装扩展使用mews/purifier扩展,github地址:mews/purifier
composer require mews/purifierphp 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));