在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤,XSS就是需要重视的一点,先说一下什么是XSS,简单来说就是用户提交数据(例如发 表评论,发表日志)时往Web页面里插入恶意javascript代码例如死循环,疯狂的alert,这还不算还可能会修改页面页面上的html元素(例 如登录表单的action),这样当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到用户的特殊目的。
在使用PHP开发时,可以使用htmlspecialchars将用户提交过来的数据转换使之原样显示,但是这样一来会造成一些弊端,比如用户上传的图片 无法显示,html标签不会起作用,没有任何样式。解决方案就是可以使用UBB标签或者自定义标签来实现,要么就是自己写正则去过滤,但是防不胜防,并且 这样在处理起来有些繁琐。下载重点介绍一个开源的HTMLPurifier,这是一个符合W3C标准的HTML过滤器,可以生成标准的HTML代码,并且 有很多的自定义配置,我更关注的是可以过滤掉javascript代码,有效的防止XSS!
安装
使用composer安装
> composer require ezyang/htmlpurifierUsing version ^4.9 for ezyang/htmlpurifier./composer.json has been updatedLoading 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=<<Hello 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
输出结果如下:
Hello
- 1
- 2
过滤了XSS代码,过滤规则:
自动填充了残缺的标签
使用配置
$config = \HTMLPurifier_Config::createDefault(); // something.... $purifier = new \HTMLPurifier($config);
- 1
- 2
- 3
例如
function actionHtmlpurifer() { $dirty_html=<<Hello 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’ //输出
Hello
$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
详细的配置规则: