当前位置: 首页 > news >正文

【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

相关文章:

  • 让 webpack 加载 Source Map
  • 常见Oracle HINT的用法
  • vSphere虚拟化之外部存储部署(上)
  • C#枚举-避免不合理赋值
  • python3基础2--变量-字符编码-缩进-注释-用户输入-模块初识
  • 【强烈推荐】Kindle3下使用的提供加密功能的记事本,可以输入中文 -- KindleNote...
  • PTGAN:针对行人重识别的生成对抗网络 | PaperDaily #36
  • SqlParameter的作用与用法
  • vue官方推荐的环境
  • managedwifi.codeplex.com
  • 微信小程序之 Swiper(轮播图)
  • 方丈被害子女有没有权利继承遗产?
  • js数组之filter
  • 故障处理记录--nginx反向代理显示不了部分图片
  • TCP通信粘包问题分析和解决
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • JAVA并发编程--1.基础概念
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Material Design
  • ucore操作系统实验笔记 - 重新理解中断
  • vue-cli3搭建项目
  • 笨办法学C 练习34:动态数组
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 如何在GitHub上创建个人博客
  • 实现菜单下拉伸展折叠效果demo
  • 如何用纯 CSS 创作一个货车 loader
  • ​香农与信息论三大定律
  • #{}和${}的区别?
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (javascript)再说document.body.scrollTop的使用问题
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (十一)图像的罗伯特梯度锐化
  • (转)fock函数详解
  • (转载)OpenStack Hacker养成指南
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET CLR基本术语
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET delegate 委托 、 Event 事件
  • .Net 垃圾回收机制原理(二)
  • .net专家(张羿专栏)
  • /dev/sda2 is mounted; will not make a filesystem here!
  • :中兴通讯为何成功
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @NestedConfigurationProperty 注解用法
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [1525]字符统计2 (哈希)SDUT
  • [2669]2-2 Time类的定义
  • [4.9福建四校联考]
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [Bada开发]初步入口函数介绍