XSS攻击全称跨站脚本攻击,是指攻击者在网页中注入恶意HTML或JavaScript代码,当其他用户访问该页面时,恶意代码会被浏览器执行,从而窃取用户cookie、篡改页面内容甚至进行钓鱼攻击。PHP作为常用的后端开发语言,需要开发者主动做好输入输出的转义处理来防范这类风险。

XSS攻击的常见场景
最常见的场景是用户提交表单内容后,后端直接将内容输出到页面上。比如一个留言板功能,攻击者提交内容为<script>alert('xss')</script>,如果后端不做处理直接输出,其他用户访问留言板时就会弹出警告框,这就是最简单的XSS攻击。
反射型XSS
恶意脚本通过URL参数传递,服务器直接将参数输出到页面,比如搜索功能中,搜索关键词直接显示在结果页,攻击者可以构造带恶意脚本的搜索链接诱导用户点击。
存储型XSS
恶意脚本被存储到服务器数据库,所有访问对应页面的用户都会触发脚本执行,危害范围比反射型更大,比如上面提到的留言板场景。
htmlspecialchars函数的基本用法
htmlspecialchars是PHP内置的字符串处理函数,作用是将字符串中的特殊HTML字符转换为HTML实体,从而避免浏览器将其解析为HTML标签或脚本。默认情况下它会转换以下字符:
- & 转换为 &
- " 转换为 "(当ENT_NOQUOTES未设置时)
- ' 转换为 '(当ENT_QUOTES设置时)
- < 转换为 <
- > 转换为 >
函数参数说明
函数完整语法为:htmlspecialchars(string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = null, bool $double_encode = true): string
常用参数说明:
| 参数 | 说明 |
|---|---|
| string | 需要转义的原始字符串 |
| flags | 控制转换规则,常用值有ENT_COMPAT(仅转换双引号,默认)、ENT_QUOTES(转换单双引号)、ENT_NOQUOTES(不转换引号) |
| encoding | 字符编码,建议使用UTF-8避免乱码问题 |
| double_encode | 是否对已存在的HTML实体再次转义,默认true,建议保持默认 |
实际使用示例
基础转义输出
对用户输入的内容进行转义后再输出到HTML页面,是最基础的防护方式:
<?php
// 模拟用户提交的留言内容
$user_input = "<script>alert('恶意脚本')</script><p>正常内容</p>";
// 转义后输出,设置ENT_QUOTES处理单双引号,编码为UTF-8
$safe_output = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
echo $safe_output;
// 输出结果:<script>alert('恶意脚本')</script><p>正常内容</p>
// 浏览器会将其作为纯文本显示,不会执行脚本
?>
处理表单提交数据
在接收表单数据后,输出到页面前一定要做转义,比如用户昵称展示场景:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 接收用户提交的昵称
$nickname = $_POST['nickname'] ?? '';
// 转义后存储到变量,后续输出使用
$safe_nickname = htmlspecialchars($nickname, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户中心</title>
</head>
<body>
<h2>欢迎您,<?php echo $safe_nickname; ?></h2>
</body>
</html>
处理HTML属性中的输出
如果转义后的内容要放到HTML标签的属性中,需要特别注意引号的处理,建议使用ENT_QUOTES参数:
<?php $user_title = '测试"标题'; // 转义时开启ENT_QUOTES,确保单双引号都被转义 $safe_title = htmlspecialchars($user_title, ENT_QUOTES, 'UTF-8'); ?> <div title="<?php echo $safe_title; ?>">内容区域</div> <?php // 最终生成的HTML为:<div title="测试"标题">内容区域</div> // 不会出现属性截断的问题 ?>
其他辅助防范措施
htmlspecialchars可以处理大部分输出场景的XSS风险,但还需要配合其他措施提升安全性:
- 对用户输入做严格的格式校验,比如邮箱、手机号只接收对应格式的内容,减少恶意输入的可能
- 设置HTTP响应头Content-Security-Policy,限制页面可以加载的脚本来源,即使有XSS注入也无法执行外部恶意脚本
- 对于富文本场景,不要直接使用htmlspecialchars,需要使用专门的富文本过滤库,比如HTML Purifier,只允许安全的HTML标签和属性通过
- 用户上传的文件要做严格的类型校验和存储路径控制,避免上传恶意脚本文件被执行
注意:htmlspecialchars只负责输出转义,不要用来处理存储到数据库的内容,存储时保持原始内容即可,输出时再做转义,避免多次转义导致内容异常。
PHPXSS攻击htmlspecialcharsweb安全修改时间:2026-07-06 12:48:31