病毒防治

巧用HTML Purifier抵御恶意代码

日期:2015/6/28来源: IT猫扑网

  任何安全风险都需要我们在设计时就加以重视和避免。对于网站的建设来说更是这样。大量的网站仍不能完全脱离HTML代码,如何保障这种代码输入时的安全性和合法性是避免安全问题的关键步骤。今天笔者就与各位一起看一个可以帮助你防止不良代码的好工具HTML Purifier,我们权且叫它HTML清洁器。

  功能与特性

  HTML Purifier可以帮助用户保障HTML的合法性,它可以使你确认HTML是否包含跨站脚本攻击企图或其它的恶意攻击。通过该软件你准许用户粘贴一些HTML内容,却不会让其插入恶意代码,而这种代码可在查看这些HTML的任何人的浏览器中运行。我们可以通过CodeIgniter、 Drupal、 MODx、 Phorum、 Joomla! 、wordPress等来使用该软件。

  HTML Purifier利用一个白名单列表来实现安全,要求一个合法文档的所有部分都必须明确地获得准许,而不是象一个黑名单列表那样查找已知的恶意HTML代码。冒烟测试(smoke testing)页明确地列示了有哪些东西被允许,其中还表明了相关的场合。HTML Purifier的一个重要目标是它应当完全理解合法的HTML是什么样的,哪些元素可被嵌套在其它元素中,对于一个特定元素的相关HTML属性来说,哪些是合法的内容。另外,该软件还包括了对CSS的支持,与其它的HTML验证工具相比,该软件有其自身的优越性。

  不过,用户(就是你,呵呵)需要注意,并不存在Ubuntu、Fedora、openSUSE等linux系统的HTML Purifier软件包。该软件可利用pear来安装,而且安装速度很快,这样我们就可以使用pear的升级来轻易地升级到最新的版本。Pear使得将HTML Purifier包含到用户的脚本中更加容易了,这是因为用户不必在其脚本中指明任何路径。

  安装与使用

  要通过pear安装HTML Purifier,用户必须首先安装php-pear软件包,然后利用pear命令安装HTML Purifier。下面的命令将把HTML Purifier安装到/usr/share/pear/HTMLPurifier中。

pear channel-discover htmlpurifier.org
pear install hp/HTMLPurifier

  对笔者而言,在此阶段利用HTML Purifier会导致一个Apache的日志文件错误,即关于Cache.Serializerpath路径并不存在。该软件会尽量将下面的目录用作一个高速缓冲内容的可写入路径:/usr/share/pear/HTMLPurifier/DefinitionCache/Serializer。这个高速缓冲存储器可被关闭,这在INSTALL安装中有详细描述,否则你可在/usr中创建目录,/usr正是 HTML Purifier 要用作一个内容易丢失的缓存的位置。第三种选择显示在下面:

# mkdir -p /var/cache/HTMLPurifier
# chown apache /var/cache/HTMLPurifier
# chmod o-rwx /var/cache/HTMLPurifier
# ls -ld /var/cache/HTMLPurifier
drwxr-x--- 2 apache root 4096 2008-06-25 14:25 /var/cache/HTMLPurifier

  不幸的是,SerializerPath的默认路径被编码后放在了HTMLPurifier/ConfigSchema/schema.ser中,这是一个长度定界的文件,不太容易编辑。最好的方案是使用PHP代码中的一个配置对象来改变路径,或采用更好的方法,即用户的PHP函数,它可以为网站建立配置对象。

  下面是一个简单的index.php文件,它使用了HTML Purifier来清理HTML内容,由同样的HTML网页上的一个表单来提交。注意,对htmlspecialchars的调用并不是为了安全性,而仅仅是为了支持由用户输入的HTML文本,目的是为了在pre元素内的完全可见。

# cd /var/www/html # mkdir HTMLPurifierTest # chown ben.apache
HTMLPurifierTest # chmod +s HTMLPurifierTest # su -l ben $ cd
/var/www/html $ vi index.php set('Core', 'Encoding', 'ISO-8859-1'); $config->set
('HTML', 'TidyLevel', 'heavy' ); $config->set('Cache', '
SerializerPath', '/var/cache/HTMLPurifier' ); $ purifier =
new HTMLPurifier($config); ?> < html> Enter your
nastiest HTML below! < /p > < form name="myfrom" action="index.php"
> < input type='text' name='query'>< /form>

  如果你希望明确地限制一个用户可以输入的HTML元素,可以使用ForbiddenElements配置指令,如下所示。本例将从所输入的HTML元素中剥离出任何大写的、斜体或预定格式的标签。你还可以采用另外一种方法,通过白名单利用AllowedElements明确地指明哪些元素是合法的。

$config->set('HTML', 'ForbiddenElements', 'b,i,pre');

  HTML Purifier包括了对过滤和管理URI(统一资源标识符)的支持,既可在主要的验证之前,也可在其后进行。能够在验证HTML输入之前进行过滤准许用户改变URI。

  有一种URI过滤器称为主机黑名单,它准许你阻止给定的主机名。不过,你一定要小心使用主机黑名单,因为你的黑名单中的任何东西一旦出现在URL(统一资源定位器)中,它都会被拒绝。幸运的是,主机黑名单类的代码是很短的,因此你能够轻易地定义一个类,它只为以特定后缀结尾的URL进行了测试。

  小结

  大概高速缓存目录的安装问题是一个PEAR的限制问题。至少让HTML Purifier无法正常运行同时又生成冗长的错误消息会迫使我们注意在什么地方存放易丢失的缓存文档的问题,而不仅仅是简单地使用/usr下的一个路径。

  HTML Purifier为防止人们输入错误或恶意的HTML代码起到了保护作用。能够输入白名单,又能够与URI过滤功能结合使用,这就避免了一些用户输入非法数据的企图。URI过滤是一个很好的功能,如果作为管理员的你准许任何人匿名发帖子的话,它可有助于减少论坛的垃圾信息。例如,你可以强化这样一种策略:在人们匿名发帖子时,他们只能连接到你的网站,如果他们想链接到其它的网站,就需要注册。

  总之,HTML Purifier是个实用的工具,你不妨试试。

 

相关文章

相关下载

网友评论

我要评论...
    没有更早的评论了
    取消