以下是PHP中htmlspecialchars()函数的系统化讲解与实例演示,包含HTML源码和浏览器显示效果的对比说明:
一、基础防护(防XSS攻击)
$input = '<script>alert("attack")</script>';
echo "原始输出:".$input."<br>";
echo "安全输出:".htmlspecialchars($input);HTML源码输出:
原始输出:<script>alert("attack")</script><br>
安全输出:<script>alert("attack")</script>浏览器效果:
原始输出:实际执行JS代码弹出警告框
安全输出:显示为文本
<script>alert("attack")</script>
二、表单属性防护
$value = '" onmouseover=alert(1)'; echo '<input value="'.htmlspecialchars($value, ENT_QUOTES).'">';
HTML源码输出:
<input value="" onmouseover=alert(1)">
浏览器效果:
输入框显示文本
" onmouseover=alert(1),不会触发事件
三、引号处理模式对比
$str = "O'Reilly & \"Test\""; echo "ENT_COMPAT:".htmlspecialchars($str)."<br>"; echo "ENT_QUOTES:".htmlspecialchars($str, ENT_QUOTES);
浏览器效果:
ENT_COMPAT:显示
O'Reilly & "Test"(单引号保留)ENT_QUOTES:显示
O'Reilly & "Test"(单双引号均转义)
四、邮件头注入防护
$subject = "Hello\r\nBCC: victim@example.com"; echo "<pre>".htmlspecialchars($subject)."</pre>";
浏览器效果:
显示完整内容(包含
\r\n换行符),防止邮件头注入
五、JSON数据预处理
$data = ['name' => '</script><script>alert(1)'];
$safeData = array_map('htmlspecialchars', $data);
echo json_encode($safeData);输出结果:
{"name":"\u003C\/script\u003E\u003Cscript\u003Ealert(1)"}效果说明:
避免破坏JSON结构,同时防止DOM型XSS
系统总结表

最佳实践建议
始终指定编码:
htmlspecialchars($str, ENT_QUOTES, 'UTF-8')属性值必须转义:使用
ENT_QUOTES模式避免双重转义:设置
false参数处理已编码内容富文本例外:需配合白名单过滤器(如HTML Purifier)