XSS漏洞定义
XSS(Cross Site Scripting,跨站脚本攻击),为避免与层叠样式表(Cascading Style Sheets,CSS)缩写混淆而得名。其核心攻击逻辑是:攻击者在Web页面中插入未被严格控制或过滤的恶意代码,当用户访问该页面时,会加载并执行这些恶意程序(常见为JavaScript、VBScript、ActiveX、Flash等),最终实现攻击者针对用户的恶意攻击目的。
XSS漏洞的主要类型
XSS漏洞根据攻击原理和传播方式,主要分为三大类:
1. 反射性XSS
恶意代码通过URL参数等方式提交,服务器未做过滤直接反射到页面响应中,仅在单次请求中生效,需诱导用户点击恶意链接触发;
2. 存储型XSS
攻击者将恶意代码提交至服务器并存储(如数据库、评论区、日志等),其他用户访问包含该恶意代码的页面时,会自动加载执行,影响范围更广、危害更大;
3. DOM型XSS
恶意代码通过修改页面DOM结构(如URL片段、页面元素属性等)触发,攻击全程在客户端完成,无需服务器端数据存储与反射,隐蔽性较强。
XSS漏洞核心防护方案
1. HTML实体转换(htmlspecialchars函数)
通过htmlspecialchars()函数将字符串中的特殊HTML字符转换为HTML实体,转换后的字符串不再具备HTML执行特性,浏览器会将其解析为普通可展示文本,从而阻断恶意脚本执行。
原始代码示例:
<?php
declare(strict_types = 1);
$str = 'hello world <b> Hello HeiKe </b><a href="/">click</a>';
echo $str;
原始显示效果:hello world Hello HeiKe click(标签被浏览器解析执行,<b>标签使文字加粗,<a>标签生成可点击链接)
防护代码示例:
<?php
declare(strict_types = 1);
$str = 'hello world <b> Hello HeiKe </b><a href="/">click</a>';
echo htmlspecialchars($str);
防护后源代码效果:hello world <b> Hello HeiKe </b><a href="/">click</a>
防护后显示效果:hello world Hello HeiKe click(标签以原始文本形式展示,无执行效果)
2. DOM标签过滤(strip_tags函数)
XSS漏洞的核心诱因之一是恶意脚本依赖HTML、XML或PHP标签实现执行,通过strip_tags()函数可直接过滤字符串中所有HTML、XML及PHP标签,从根源上破坏恶意脚本的完整结构,防止其执行。
防护代码示例:
<?php
declare(strict_types = 1);
$str = 'hello world <b> Hello HeiKe </b><a href="/">click</a>';
echo strip_tags($str);
防护后效果:hello world Hello HeiKe click(所有标签被过滤,仅保留纯文本内容)
3. 开启HttpOnly属性防护Cookie
修改PHP配置文件php.ini中的相关配置项,开启Cookie的HttpOnly属性,可阻止客户端JavaScript访问Cookie,即使页面存在XSS漏洞,攻击者也无法通过恶意脚本窃取用户Cookie,降低会话劫持风险。
配置方式:
session.cookie_httponly = 1
4. Cookie与IP绑定强化防护
用户登录成功后,将用户的Cookie信息与登录时的客户端IP进行绑定存储。后续用户访问系统时,服务器校验当前请求的IP是否与Cookie绑定的IP一致,若不一致则拒绝使用该Cookie进行身份验证。即使Cookie被攻击者拦截,因其无法伪造绑定的IP,也无法劫持用户会话。


