zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    [Swift]LeetCode96. 不同的二叉搜索树 | Unique Binary Search Trees
    [Swift]LeetCode95. 不同的二叉搜索树 II | Unique Binary Search Trees II
    [Swift]LeetCode94. 二叉树的中序遍历 | Binary Tree Inorder Traversal
    [Swift]LeetCode93. 复原IP地址 | Restore IP Addresses
    [Swift]LeetCode92. 反转链表 II | Reverse Linked List II
    [Swift]LeetCode91. 解码方法 | Decode Ways
    [Swift]LeetCode90. 子集 II | Subsets II
    谈谈我对P2P网络借贷的一些看法
    辣妈萌宝面试心得体会
    辣妈萌宝面试心得体会
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8324329.html
Copyright © 2011-2022 走看看