2

我知道多年来有很多关于使用 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

4 回答 4

8

我相信HTML Purifier Library会很好地工作:

http://htmlpurifier.org/

HTML Purifier 是一个用 PHP 编写的符合标准的 HTML 过滤器库。HTML Purifier 不仅会使用经过全面审核、安全且允许的白名单删除所有恶意代码(更广为人知的 XSS),它还将确保您的文档符合标准,这只有在全面了解 W3C 规范的情况下才能实现。由于当前 HTML 过滤器不足或不安全的情况而厌倦了使用 BBCode?拥有 WYSIWYG 编辑器但从未使用过它?正在为您正在构建的应用程序寻找高质量、符合标准的开源组件?HTML 净化器适合您!

于 2009-12-29T16:55:19.387 回答
1

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

编辑:哦和:不要用正则表达式来做这个。数学上不可能正确地做到这一点。

于 2009-12-29T17:06:41.193 回答
1

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

strip_tags($string, "<b><i><u><a><s><big><small><ul><li><ol><blockquote><h1><h2><h3>");
于 2009-12-29T17:00:08.583 回答
1

另一种方法是使用 strip_tags 和第二个参数。

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

于 2009-12-29T17:00:41.373 回答