答案是使用HTML Purifier等专业库结合转义与过滤策略。PHP中过滤HTML标签的核心目标是防范XSS攻击,主要手段包括strip_tags()和htmlspecialchars(),但前者无法处理危险属性如onclick,后者仅将特殊字符转义为实体,适用于纯文本输出。当需允许安全HTML时,应使用HTML Purifier等基于白名单和DOM解析的净化库,确保只保留合法标签和属性,从而在功能与安全间取得平衡。

PHP过滤HTML标签主要目标是提升安全性,尤其是防范跨站脚本(XSS)攻击。这通常通过移除或转义HTML代码来实现,具体选择哪种方式取决于你希望用户输入的内容是被完全净化为纯文本,还是允许显示部分安全的HTML标签。
处理PHP中的HTML标签,我们通常会用到两种核心策略:过滤(Filtering)和转义(Escaping)。它们的目的不同,但都是为了安全。
最基础的过滤手段是使用PHP内置的
strip_tags()
<?php
$userInput = &quot;<p>Hello, <script>alert('XSS');</script> world!</p><a href='#' onclick='alert(\&quot;evil\&quot;)'>Click Me</a>&quot;;
// 示例1:完全剥离所有标签
$cleanText = strip_tags($userInput);
echo &quot;完全剥离: &quot; . $cleanText . &quot;\n&quot;;
// 输出: 完全剥离: Hello, world!Click Me
// 示例2:允许保留部分标签,比如<p>和<a>
$allowedTags = '<p><a>';
$partiallyCleanText = strip_tags($userInput, $allowedTags);
echo &quot;部分保留: &quot; . $partiallyCleanText . &quot;\n&quot;;
// 输出: 部分保留: <p>Hello, world!</p><a href='#' onclick='alert(&quot;evil&quot;)'>Click Me</a>
?>从上面的示例2可以看到,
strip_tags()
<script>
<a>
onclick
strip_tags()
立即学习“PHP免费学习笔记(深入)”;
这时,转义就显得非常重要了。PHP的
htmlspecialchars()
htmlentities()
<
>
&
"
'
<?php
$maliciousInput = "<script>alert('You are hacked!');</script>";
// 使用htmlspecialchars进行转义
$escapedInput = htmlspecialchars($maliciousInput, ENT_QUOTES, 'UTF-8');
echo "转义后的内容: " . $escapedInput . "\n";
// 输出: 转义后的内容: <script>alert(&amp;#039;You are hacked!&amp;#039;);</script>
// 当在HTML中显示时,浏览器会将其作为文本处理
// <p><script>alert(&amp;#039;You are hacked!&amp;#039;);</script></p>
?>我个人认为,对于绝大多数需要展示用户输入的情况,
htmlspecialchars()
strip_tags()
讲真,
strip_tags()
strip_tags()
它最主要的局限在于:
strip_tags()
<a>
onclick
<img>
onerror
strip_tags()
<img src="nonexistent.jpg" onerror="alert('XSS via onerror');">这段代码经过
strip_tags()
<img>
<img>
onerror
strip_tags()
strip_tags()
<script>
style
strip_tags()
所以,我常常强调,在处理用户输入时,安全是一个系统性的工程,不能寄希望于一个单一的函数就能解决所有问题。
strip_tags()
这是一个非常经典的问题,也是很多开发者容易混淆的地方。我的看法是,这并非一个“二选一”的问题,而是取决于你的具体需求和最终展示的场景。很多时候,你可能需要两者结合。
让我们先明确两者的核心目的:
转义(Escaping): 它的目的是将用户输入中的特殊字符(如
<
>
&
"
'
过滤(Filtering / Sanitization): 它的目的是从用户输入中移除或净化掉所有不安全或不允许的HTML标签和属性,只留下一个经过“清洗”的、安全的HTML子集。
我的建议是:
strip_tags()
可以这样理解:转义是你的“安全网”,确保任何意外的或恶意的HTML代码都不会被执行。而过滤,是在你决定让用户“走钢丝”(允许部分HTML)时,为这条钢丝搭建的坚固“防护栏”。两者结合,才能在安全性和功能性之间找到平衡。
当
strip_tags()
htmlspecialchars()
HTML Purifier
HTML Purifier
为什么它如此可靠?
基本使用示例:
首先,你需要通过Composer安装它:
composer require ezyang/htmlpurifier
然后,在你的PHP代码中:
<?php
require_once '/path/to/vendor/autoload.php'; // 根据你的Composer安装路径调整
$config = HTMLPurifier_Config::createDefault();
// 你可以根据需求配置允许的标签、属性等
// 例如,允许<a>标签和其href、title属性
// $config->set('HTML.Allowed', 'p,a[href|title],strong,em');
// 允许所有默认安全的HTML标签和属性
// $config->set('HTML.AllowedElements', array('p', 'a', 'strong', 'em', 'ul', 'ol', 'li', 'br', 'img'));
// $config->set('HTML.AllowedAttributes', array('a.href', 'a.title', 'img.src', 'img.alt'));
$purifier = new HTMLPurifier($config);
$dirty_html = '<p>Hello, <script>alert("XSS");</script> world!</p><a href="javascript:alert(\'evil\')">Click Me</a><img src="x" onerror="alert(\'more evil\')">';
$clean_html = $purifier->purify($dirty_html);
echo "原始HTML:\n" . $dirty_html . "\n\n";
echo "净化后HTML:\n" . $clean_html . "\n";
?>运行上述代码,你会看到
<script>
<a>
javascript:
<img>
onerror
对于一些非常特殊的需求,或者当你需要对HTML结构进行更细粒度的控制时,PHP内置的
DOMDocument
优点: 提供了极高的灵活性和控制力。 缺点: 实现起来相对复杂,需要对DOM操作有深入的理解,而且你自己编写的净化逻辑需要经过严格的安全审查,否则很容易引入新的漏洞。它不适合新手,也不建议作为通用解决方案。
示例(非常简略,仅作概念说明):
<?php
$html = '<p>Hello, <script>alert("XSS");</script> <a href="http://example.com" onclick="alert(\'evil\')">Link</a></p>';
$dom = new DOMDocument();
// 抑制HTML解析错误
@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
// 移除所有script标签
foreach ($xpath->query('//script') as $node) {
$node->parentNode->removeChild($node);
}
// 移除所有元素的onclick属性
foreach ($xpath->query('//*[@onclick]') as $node) {
$node->removeAttribute('onclick');
}
// 进一步可以遍历所有标签,只保留白名单中的标签和属性
$cleanHtml = $dom->saveHTML();
echo $cleanHtml;
?>使用
DOMDocument
总而言之,如果你需要处理用户提交的HTML内容并确保其安全性,我的建议是:优先使用HTML Purifier。它久经考验,提供了最全面的安全保障。只有在极少数极端定制化的场景下,并且你对Web安全和DOM操作有足够的信心时,才考虑自己基于
DOMDocument
以上就是PHP怎么过滤HTML标签_PHPHTML标签安全处理教程的详细内容,更多请关注php中文网其它相关文章!
HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号