Web安全:XSS、CSRF等常见漏洞及防御措施
一、XSS(跨站脚本攻击)
定义与原理
XSS攻击指攻击者将恶意脚本(如JavaScript、HTML标签)注入到Web页面中,当用户访问该页面时,脚本在浏览器端执行,从而窃取用户信息、劫持会话或篡改页面内容。根据注入方式和持久性分为:
- 存储型XSS:恶意脚本存储在服务器数据库(如评论、留言板),持久存在,每次用户访问时触发。
- 反射型XSS:通过URL参数(如
https://example.com/search?q=<script>alert('XSS')</script>
)注入,脚本反射到响应中,需用户点击恶意链接触发。 - DOM型XSS:脚本通过修改页面DOM结构(如通过
location.hash
、innerHTML
)执行,不依赖服务器端存储,但可能绕过传统输入过滤。
危害示例
- 窃取Cookie:通过
document.cookie
获取用户身份信息,发送至攻击者服务器。 - 钓鱼攻击:在页面中插入伪造的登录框,诱导用户输入账号密码。
- 蠕虫传播:通过社交平台自动发送含恶意链接的消息,扩大攻击范围。
防御措施
- 输入/输出过滤与编码
- 对用户输入(如表单、URL参数)进行严格校验,过滤或转义特殊字符(如
<
,>
转为<
,>
)。 - 输出时根据上下文使用HTML实体编码、JavaScript编码或URL编码。
- 对用户输入(如表单、URL参数)进行严格校验,过滤或转义特殊字符(如
- HTTP-only Cookie
设置Cookie
的HttpOnly
属性,阻止JavaScript读取敏感Cookie(如Set-Cookie: session=XXX; HttpOnly
),防止劫持会话。 - 内容安全策略(CSP)
- 通过
Content-Security-Policy
头配置允许加载的资源源(如script-src 'elf'
),禁止外部脚本执行。 - 可细粒度控制
script
,style
,img
等资源的来源,防止XSS注入。
- 通过
- 上下文感知编码
根据数据用途(HTML、JavaScript、CSS)选择不同的转义函数,避免二次注入(如富文本编辑器需更复杂的过滤逻辑)。 - 沙箱环境
使用<iframe sandbox>
或JavaScript沙箱
限制嵌入内容的权限,即使发生XSS也无法访问主页面上下文。
二、CSRF(跨站请求伪造)
定义与原理
CSRF攻击利用用户已登录的身份,在用户不知情的情况下,通过第三方网站发送恶意请求到目标站点(如转账、修改密码)。攻击关键在于:
- 用户已通过认证,浏览器自动携带有效Cookie。
- 目标站点未验证请求是否由用户主动发起。
经典场景
攻击者在恶意网站嵌入以下代码:
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="amount" value="10000">
<input type="hidden" name="toAccount" value="attacker">
</form>
<script> document.forms[0].submit(); </script>
当用户访问该页面时,浏览器自动向银行网站发送转账请求,若银行未验证CSRF令牌,则攻击成功。
防御措施
- CSRF令牌(同步令牌模式)
- 服务器生成随机令牌(如
_csrf
参数或Cookie),嵌入到表单或请求头(如X-CSRF-Token
)。 - 服务器验证请求中的令牌与用户会话中的令牌一致。
- 服务器生成随机令牌(如
- 双重提交Cookie
- 将CSRF令牌同时存储在Cookie和请求参数中,服务器需同时验证两者匹配(防御部分浏览器不发送
Referer
的情况)。
- 将CSRF令牌同时存储在Cookie和请求参数中,服务器需同时验证两者匹配(防御部分浏览器不发送
- 验证Referer头
- 检查请求是否来自合法域名(如
Referer: https://example.com
),但可被篡改或绕过(如移动应用请求常不带Referer
)。
- 检查请求是否来自合法域名(如
- SameSite Cookie属性
- 设置
Cookie
的SameSite
属性(Strict
或Lax
):Strict
:仅允许同站请求携带Cookie(完全阻止跨站请求)。Lax
:允许部分GET请求(如链接点击)携带,但POST等危险请求仍需CSRF令牌。
- 设置
- 自定义请求头验证
- 要求所有敏感请求携带自定义头(如
X-Requested-With: XMLHttpRequest
),服务器检查是否存在。
- 要求所有敏感请求携带自定义头(如
三、其他常见Web安全漏洞
- SQL注入
- 原理:未对用户输入进行参数化查询,导致攻击者拼接恶意SQL语句(如
' OR 1=1;--
)。 - 防御:使用预编译语句(如
PreparedStatement
)、避免动态拼接SQL、限制数据库用户权限。
- 原理:未对用户输入进行参数化查询,导致攻击者拼接恶意SQL语句(如
- 文件上传漏洞
- 原理:未验证上传文件类型或路径,导致攻击者上传Webshell(恶意脚本文件)。
- 防御:
- 白名单验证文件扩展名与MIME类型。
- 上传后服务器端二次检测(如文件头检查)。
- 存储文件到非Web根目录,避免直接访问。
- SSRF(服务器端请求伪造)
- 原理:应用通过用户提供的URL发起网络请求(如图片加载、文件下载),可被利用攻击内网资源。
- 防御:限制请求白名单、检查URL是否包含内网IP、使用代理隔离内外部请求。
- 认证与会话管理漏洞
- 弱密码/爆破:使用复杂密码策略、账户锁定机制。
- 会话固定攻击:生成随机会话ID,避免用户可预测。
- 过期未注销:设置合理会话超时时间,强制注销。
- 越权访问
- 水平越权:攻击者访问其他用户数据(如
/user/123
改为/user/456
)。 - 垂直越权:低权限用户执行高权限操作(如普通用户修改管理员信息)。
- 防御:基于角色权限控制(RBAC)、资源访问列表验证。
- 水平越权:攻击者访问其他用户数据(如
四、综合防御策略
- 安全开发流程
- SDLC集成:在开发各阶段(设计、编码、测试、部署)引入安全评审、自动化扫描(如SAST、DAST)。
- 代码审计:定期审查关键代码(如认证、数据库交互、文件处理)。
- 基础设施安全
- Web应用防火墙(WAF):拦截常见攻击特征,但需避免误报。
- HTTPS强制:使用TLS加密,防止中间人劫持。
- 防火墙/入侵检测系统:限制入站流量,监控异常请求。
- 日志与监控
- 记录关键操作日志(如登录、修改密码),实时分析异常行为(如高频请求、异常IP)。
- 使用安全信息和事件管理(SIEM)系统聚合告警。
- 第三方组件管理
- 定期更新依赖库,避免已知漏洞(如Log4j、Struts2)。
- 使用漏洞扫描工具(如NPM Audit、Dependabot)检测组件风险。
- 用户安全意识培训
- 教育用户识别钓鱼邮件、不点击未知链接、使用双因素认证。
五、实战建议
- 漏洞扫描工具:使用Burp Suite、OWASP ZAP进行手动渗透测试,或集成Acunetix、Nessus自动化扫描。
- 安全测试框架:采用OWASP Top 10作为漏洞检查基准,定期自查。
- 应急响应计划:预设漏洞发现与修复流程,确保快速响应。
总结
Web安全是攻防对抗的持续过程,需从输入验证、权限控制、安全配置、持续监控等多维度构建防御体系。需保持警惕,及时跟进最新漏洞与修复方案,才能有效降低风险。