用PHP写了个基于白名单的HTML标签、属性、属性值过滤库 White HTML Filter
White HTML Filter
项目地址: https://github.com/lincanbin/White-HTML-Filter
简介
XSS是什么就不介绍了,很多时候因为老板的需求之类的,必须用到UEditor之类的HTML富文本编辑器,这时候XSS防御就很重要了。
很多人会选择用strip_tags()之类的来去除HTML标记,但是去除了标签,还有onclick之类的危险属性。而且过滤了属性,对于必须通过iframe插入HTML5视频的情况,还要过滤属性的值。
一个常见做法是用正则表达式来切分HTML字符串,然后得到多个多维数组,利用黑名单过滤完后再拼接回HTML,这种方法因为解析HTML的方式跟浏览器不同,所以很容易被绕过。
这款工具应运而生,使用基于与浏览器解析HTML方式一致的标记化算法(The Tokenization Algorithm)的DOMDocument来解析HTML,然后利用白名单来过滤HTML标签、属性、乃至属性值。
更多特性请查看测试用例:
https://github.com/lincanbin/White-HTML-Filter/blob/master/test.php
使用方法
1、引入
在命令行直接用composer引入:
composer require lincanbin/white-html-filter
或者在composer.json加入以下内容:
"require": { "lincanbin/white-html-filter": "~1.0" }
然后执行:
composer update
2、使用
use lincanbin\WhiteHTMLFilter; //跨站脚本白名单过滤 function XssEscape($html) { $filter = new WhiteHTMLFilter(); $urlFilter = function($url) { $token = parse_url($url); if (empty($token['scheme']) || in_array($token['scheme'], array('http', 'https')) === false) { return ''; } $hostWhiteList = array( 'www.youtube.com', 'youtube.com', 'www.youtu.be', 'youtu.be', 'player.youku.com', 'v.youku.com', 'video.tudou.com', 'www.tudou.com', 'player.video.qiyi.com', 'open.iqiyi.com', 'imgcache.qq.com', 'v.qq.com', 'static.hdslb.com', //'www.le.com', 'share.vrs.sohu.com', 'tv.sohu.com', 'player.pptv.com', 'cdn.aixifan.com', 'v.ifeng.com', 'video.sina.com.cn', 'galaxy.bjcathay.com'//CNTV ); if (empty($token['host']) || in_array($token['host'], $hostWhiteList) === false) { return ''; } return $url; }; $iframeRule = array( 'iframe' => array( 'src' => $urlFilter, 'width', 'height', 'frameborder', 'allowfullscreen' ) ); $filter->config->modifyTagWhiteList($iframeRule); $filter->loadHTML($html); $filter->clean(); return $filter->outputHtml(); }
以上这段代码表示在默认白名单列表(https://github.com/lincanbin/White-HTML-Filter/blob/master/src/WhiteHTMLFilterConfig.php)后追加配置,允许iframe标签的使用,只允许iframe的src、width、height、frameborder、allowfullscreen属性。
并对src的属性值进行过滤,使得当iframe的src属性值的URL的域属于以上域名列表中的其中之一时,才允许该值出现,否则令src属性值为空。
更多示例
登录后方可回帖
二楼备用。