【PHP】富文本HTML过滤器:HTMLPurifier使用教程,防止XSS

在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤,XSS就是需要重视的一点,先说一下什么是XSS,简单来说就是用户提交数据(例如发 表评论,发表日志)时往Web页面里插入恶意javascript代码例如死循环,疯狂的alert,这还不算还可能会修改页面页面上的html元素(例 如登录表单的action),这样当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到用户的特殊目的。

在使用PHP开发时,可以使用htmlspecialchars将用户提交过来的数据转换使之原样显示,但是这样一来会造成一些弊端,比如用户上传的图片 无法显示,html标签不会起作用,没有任何样式。解决方案就是可以使用UBB标签或者自定义标签来实现,要么就是自己写正则去过滤,但是防不胜防,并且 这样在处理起来有些繁琐。下载重点介绍一个开源的HTMLPurifier,这是一个符合W3C标准的HTML过滤器,可以生成标准的HTML代码,并且 有很多的自定义配置,我更关注的是可以过滤掉javascript代码,有效的防止XSS!

使用composer安装

> composer require ezyang/htmlpurifier
Using version ^4.9 for ezyang/htmlpurifier
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing ezyang/htmlpurifier (v4.9.3)
    Downloading: 100%

Writing lock file
Generating autoload files
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后将vendor/autoload.php 引入项目中,即可使用

用法

        $dirty_html=<<<EOF
<h1>Hello
<script>alert("world");</script>
EOF;
        $config = \HTMLPurifier_Config::createDefault();
        $purifier = new \HTMLPurifier($config);
        $clean_html = $purifier->purify($dirty_html);
        dump($clean_html);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出结果如下:

<h1>Hello
</h1>
  • 1
  • 2

过滤了XSS代码,过滤规则:

http://htmlpurifier.org/live/smoketests/xssAttacks.php

自动填充了残缺的标签

使用配置

$config = \HTMLPurifier_Config::createDefault();  
// something....  
$purifier = new \HTMLPurifier($config);  
  • 1
  • 2
  • 3

例如

    function actionHtmlpurifer()
    {
        $dirty_html=<<<EOF
<h1><a href="http://www.baidu.com">Hello</a>
<script>alert("world");</script>
EOF;
        $config = \HTMLPurifier_Config::createDefault();
        //$config->set('HTML.Allowed', '');//过滤掉所有的HTML标签
        //输出 Hello
        $config->set('HTML.Allowed', 'h1,a[href]');//保留超链接标签a及其href链接地址属性,还有h1标签
        $config->set('HTML.TargetBlank', true);//并自动添加target属性值为’_blank’
        //输出<h1><a href="http://www.baidu.com" target="_blank" rel="noreferrer noopener">Hello</a></h1>
        $purifier = new \HTMLPurifier($config);
        $clean_html = $purifier->purify($dirty_html);
        dump($clean_html);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
// 让文本自动添加段落标签,前提是必须允许P标签的使用
$config->set('HTML.Allowed', 'p');
$config->set('AutoFormat.AutoParagraph', true);
// 清除空标签
$config->set('AutoFormat.RemoveEmpty', true);
  • 1
  • 2
  • 3
  • 4
  • 5

详细的配置规则:http://htmlpurifier.org/live/configdoc/plain.html