首先引用别人的原话: HTML Purifier:PHP防止xss跨站攻击利器
xss是什么?
(百度到的→)XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。 比如说在博客的新建文章的编辑框里输入 然后保存,以后每次访问这篇文章都会弹提示框出来。
怎么防止?
html purifier的方式的过滤掉 比如编辑框里的文本是1 2 3 <script id='test'>alert('world');</script>,然后过滤之后,存进数据库的是1 2 3,所以访问文章就不会有提示框弹出啦。
HTML Purfiler怎么用?
官方文档:http://htmlpurifier.org/live/configdoc/plain.html
好啦是全英的,反正我也看不太懂_(:з」∠)_, 就挑一些我会的又比较重要的来说咯
1.首先是使用这个库的基本格式
require_once 'library/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
//这里配置$config,以下2 3 4点的代码都是插在这里啵
$purifier = new HTMLPurifier($config);
$dirty_html = " 要过滤的字符串";
$clean_Html = $purifier->purify($dirty_html);//过滤后的字符串
2.配置Attr(属性)
$config->set('Attr.EnableID', true); // 允许使用id
$config->set('Attr.IDPrefix', 'test_'); // 给所有id加上前缀test_
$config->set('Attr.AllowedClasses', array('test_by_willko'));// 设置允许使用的class名
$config->set('Attr.ForbiddenClasses', array('ignore'));// 设置拒绝使用的class名
比如:
使用了
$config->set('Attr.EnableID', true); // 允许使用id
$config->set('Attr.IDPrefix', 'test_'); // 给所有id加上前缀test_
↓ h1的id加了前缀了,其他没有id就没有变
3.配置HTML(html标签)
$config->set('HTML.AllowedElements',array('tr','div','h1'),true);//设置允许的tagname
$config->set('HTML.ForbiddenElements',array('div'),true);//设置拒绝使用的tagname
$config->set('HTML.Allowed','div'); //设置允许的标签名
$config->set('HTML.SafeScripting',array(''));//第二个参数是什么好像结果都是一样的...
比如:
(1)使用了
$config->set('HTML.AllowedElements',array('tr','div','h1'),true);//设置允许的tagname
↓(忽略br,那是我方便查看所以加在前面的)h1和div标签都可以,但p标签被过滤了
(2)使用了
$config->set('HTML.SafeScripting',array(''));//第二个参数是什么好像结果都是一样的...
说明一下,第二个参数是什么都会把script的内容显示出来,嗯貌似也有点用的样子...
↓把script文本过滤出来了
4.其他 AutoFormat(自动格式)、CSS(css配置)、Output(输出配置)
$config->set('CSS.AllowedProperties',array('width'),true);//设置允许的CSS属性
$config->set('AutoFormat.RemoveEmpty', true); // 清除空标签
比如:
使用了
$config->set('CSS.AllowedProperties',array('width'),true);//设置允许的CSS属性
↓ style中width能出来,height就被过滤了
PS:官方有很多不同的配置,可以去官方文档里面深扒,我这里只列举一些重要的(并且我会的_(:з」∠)_),还望大神指点...
总代码块:
<?php
require_once 'library/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
//$config->set('Attr.EnableID', true); // 允许使用id
//$config->set('Attr.IDPrefix', 'test_'); // 给所有id加上前缀test_
//$config->set('Attr.AllowedClasses', array('test_by_willko'));// 设置允许使用的class名
//$config->set('Attr.ForbiddenClasses', array('ignore'));// 设置拒绝使用的class名
//$config->set('HTML.AllowedElements',array('tr','div','h1'),true);//设置允许的tagname
//$config->set('HTML.ForbiddenElements',array('div'),true);//设置拒绝使用的tagname
//$config->set('HTML.Allowed','div'); //设置允许的标签名
//$config->set('HTML.SafeScripting',array(''));//第二个参数是什么好像结果都是一样的...
//$config->set('CSS.AllowedProperties',array('width'),true);//设置允许的CSS属性
//$config->set('AutoFormat.RemoveEmpty', true); // 清除空标签
$purifier = new HTMLPurifier($config);
$dirty_html = "<h1 id='haha'>123</h1><p style='width:200px;height:200px;'>321</p><script>alert(123)</script>";
$clean_Html = $purifier->purify($dirty_html);
echo "处理前<br/>";
echo $dirty_html;
echo "处理后<br/>";
echo $clean_Html;
?>
主页:http://htmlpurifier.org/
参考:http://blog.csdn.net/hanzengyi/article/details/43019479