如何在PHP白名单中允许HTML

时间:2009-12-29 16:51:00

标签: php filter sanitization

我知道多年来有很多关于使用PHP过滤数据的最佳方法的讨论,但我想在我当前的项目中采用白名单方法。

我只希望用户能够使用以下HTML

<b>bold</b>
<i>italics</i>
<u>underline</u>
<s>strikethrough</s>
<big>Big size</big >
<small>Small size</small>

Hyperlink <a href="http://www.site.com">website</a>

A Bulleted List:
<ul>
<li>One Item</li>
<li>Another Item</li>
</ul>

An Ordered List:
<ol>
<li> First Item</li>
<li> Second Item</li>
</ol>

<blockquote>Because it is indented</blockquote>

<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>

有人能告诉我在PHP中执行此操作的最佳方法吗?我过去只允许所有html减去某些代码

4 个答案:

答案 0 :(得分:8)

我相信 HTML Purifier Library 可以很好地运作:

<强> http://htmlpurifier.org/

  

HTML Purifier符合标准   用PHP编写的HTML过滤器库。   HTML Purifier不仅会删除所有内容   恶意代码(更好地称为XSS)   经过全面审核,安全无缺   容许白名单,它也会   确保您的文件是标准   合规,只有可以实现的东西   具有全面的知识   W3C的规格。厌倦了使用   BBCode由于当前的景观   缺陷或不安全的HTML过滤器?   有一个WYSIWYG编辑器,但从来没有   能用吗?寻找   高品质,符合标准,   开源组件   你正在建设的申请? HTML   净化器适合你!

答案 1 :(得分:1)

最简单的解决方案是strip_tags(),,它接受​​包含允许标记的第二个参数:

strip_tags($string, "<b><i><u><a><s><big><small><ul><li><ol><blockquote><h1><h2><h3>");

答案 2 :(得分:1)

另一条路线是使用带有第二个参数的strip_tags。

http://php.net/manual/en/function.strip-tags.php

答案 3 :(得分:1)

我会通过整理运行提交的代码来首先对其进行规范化,然后使用xpath或应用xslt来仅选择允许的元素。这样,没有可以泄漏。还要记住,在任何给定的网站情况下,对于每个写入请求[使用整齐和xpath / xslt],您可能会有成千上万的读取请求,因此平均而言,性能影响可以忽略不计。如果你正在进行批处理......

编辑:哦和:不要使用正则表达式执行此操作。在数学上不可能正确地做到这一点。