为了避免跨站脚本攻击、xss等安全问题,yii框架对输出到视图层的数据提供了一些方法供我们使用,例如 Html::encode、HtmlPurifier::process,研究了下yii框架的源码,将其抽取出来,作为一个小组件,记起来,以后可以单独使用:
1、首先是 Html::encode ,是使用php的原生函数htmlspecialchars,我们跟着模仿一个:
<?php
class Html
{
public static function encode($content, $doubleEncode = true)
{
return htmlspecialchars($content, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', $doubleEncode);
}
}
2、然后是HtmlPurifier::process,引用了这个 htmlpurifier 包,我们先安装起来,
composer require ezyang/htmlpurifier
然后原先的Html类里面,添加一个静态方法,这样Html类就变成了这样:
<?php
class Html
{
public static function encode($content, $doubleEncode = true)
{
return htmlspecialchars($content, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', $doubleEncode);
}
public static function process($content, $config = null)
{
$purifier = HTMLPurifier::instance($config);
return $purifier->purify($content);
}
}
3、最后就是使用测试了,编写一个index.php
目录结构如下:
<?php
require './vendor/autoload.php';
require './Html.php';
$html = <<<EOF
<a href="tes.php" onclick="alert(1)" title="hehe">测试</a>
<p>test</p><br>
<img src="1.jpg" alt="">
<script>
alert(1);
</script>
EOF;
echo Html::encode($html);
echo "<hr>";
$clean_html = Html::process($html);
echo $clean_html;
echo "<hr>";
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', 'br,a[href|title]'); //只是保留标签br和a,a标签的属性href和title保留
$clean_html = Html::process($html, $config);
echo $clean_html;
ok,完毕,最后在说明下这两个静态方法的应用场景:
要显示纯文本信息,那就使用: Html::encode方法,
要显示html内容,那就使用: Html::process方法。
至于htmlpurifier包,更多的功能,可以查看官方文档