White HTML Filter 基于 PHP 的白名单过滤器

Apache
PHP 查看源码»
跨平台
2017-07-14
lincanbin

White HTML Filter

简介

XSS是什么就不介绍了,很多时候因为老板的需求之类的,必须用到UEditor之类的HTML富文本编辑器,这时候XSS防御就很重要了。

很多人会选择用strip_tags()之类的来去除HTML标记,但是去除了标签,还有onclick之类的危险属性。而且过滤了属性,对于必须通过iframe插入HTML5视频的情况,还要过滤属性的值。

一个常见做法是用正则表达式来切分HTML字符串,然后得到多个多维数组,利用黑名单过滤完后再拼接回HTML,这种方法因为解析HTML的方式跟浏览器不同,所以很容易被绕过。

这款工具应运而生,使用基于与浏览器解析HTML方式一致的标记化算法(The Tokenization Algorithm)的DOMDocument来解析HTML,然后利用白名单来过滤HTML标签、属性、乃至属性值。

使用方法

1、引入

composer require lincanbin/white-html-filter

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();
}

以上这段代码表示在默认白名单列表后追加配置,允许iframe标签的使用,只允许iframe的src、width、height、frameborder、allowfullscreen属性。

并对src的属性值进行过滤,使得当iframe的src属性值的URL的域属于以上域名列表中的其中之一时,才允许该值出现,否则令src属性值为空。

更多示例

你可以在这里使用GitHub帐号登录 https://www.94cb.com/t/5280 ,并这个帖子下面回帖对这个库进行测试。

加载中

评论(0)

暂无评论

暂无资讯

暂无问答

Druid连接池及监控在spring配置如下:

Druid连接池及监控在spring配置如下: [html] view plaincopy <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <prope...

2016/11/24 09:44
11
0
css 线性渐变

线性渐变 首先看下示例 (1)垂直渐变 (2)垂直渐变 IE系列 filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr='#FF0000',endColorStr='#F9F900',gradientType='0'); 参数...

2013/05/13 23:04
30
0
zf2的inputfilter

' 使用语句(注,此处重点在于说明数据校验): $inputFilter->add($factory->createInput(array( 'name' => 'content', 'require' => true, 'filters' => array( array('name'=>'StripTags'...

2013/04/01 23:27
210
0
js 遮罩层效果代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <tit...

2014/07/16 11:28
27
0
css滤镜使文字变3D效果

四夕刚从 OECP社区看到了一篇文章 《css滤镜使文字变3D效果》,Css的确很强大, W3C 公布了样式单( CSS )的标准以来, HTML 的每一部分开始以元素的形式出现,并且事件开始真正被引入页面,...

2011/07/05 10:50
196
0
关于弹出提示框的一种比较好的方式

通过div弹出提示框,可以在提示框中加入任意你想加入的内容,如简单的内容提示或者是登陆框

2014/01/05 15:53
18
0
前端js实现弹出对话框实现进度条-10

前端js实现动态更新进度条

2014/04/18 17:26
62
0
弹出层2

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4...

2013/12/01 02:07
6
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部