Web 安全防御指南:CSP、HttpOnly 与 XSS Filter 深度解析

Web 安全防御指南:CSP、HttpOnly 与 XSS Filter 深度解析

_

XSS 跨站 — 安全防御:CSP / HttpOnly / XSSFilter

下面整理了三类常见的 XSS 防御技术:CSP(Content Security Policy)、HttpOnly Cookie 与基于过滤/编码的 XSS 过滤器,包含原理、实践配置、实验提示与常见绕过/注意点。


一、CSP(Content Security Policy 内容安全策略)

内容安全策略是一种可信白名单机制,用于限制页面中可加载或执行的来源。浏览器根据网站返回的 CSP 头部决定允许哪些资源执行或加载,等于把执行/加载权限交给浏览器以白名单方式控制。

主要作用

  • 限制外域代码加载,降低复杂攻击逻辑的风险。
  • 限制敏感数据外传(限制 connect-src 等),防止被注入后外泄到任意域。
  • 禁止内联脚本执行('unsafe-inline' 被禁用),可以阻断大量基于 inline script 的 XSS。
  • 结合 report-uri / report-to 能上报违反策略的事件,便于快速发现与修复。

启用示例(PHP)

header("Content-Security-Policy: default-src 'self'; img-src 'self' https://cdn.example.com; script-src 'self'; report-uri /csp-report-endpoint");

优点:浏览器端强制执行、能显著降低攻击面。
缺点/限制:旧浏览器支持不完整;错误配置可能导致页面功能失效;某些绕过技巧(例如通过允许的第三方脚本链路)仍然可能被利用。

参考与绕过研究


二、HttpOnly(Cookie 标志)

原理:将敏感 cookie 标记为 HttpOnly 后,客户端 JavaScript 不再能通过 document.cookie 读取该 cookie,从而防止基于 XSS 的窃取(常用于会话 cookie)。

配置示例(PHP):

; php.ini
session.cookie_httponly = 1
// 在代码中设置
ini_set("session.cookie_httponly", 1);
setcookie('SESSIONID', $value, time()+3600, '/', '', false, true); // 最后一个 true 表示 HttpOnly

注意与绕过

  • HttpOnly 无法阻止攻击者通过 XSS 发起操作(例如用 XSS 发起受害者的授信操作),但能阻止 JS 直接读取 cookie。
  • 已知绕过案例较少但存在(例如极老的浏览器漏洞 CVE-2012-0053、某些 phpinfo 泄露/页面回显、Flash/Java 插件交互等),因此 HttpOnly 只是降低风险的手段之一。
  • 结合 SecureSameSite 与短会话时长使用,能进一步强化安全性。

参考: https://blog.csdn.net/weixin_42478365/article/details/116597222


三、XSS Filter(基于过滤/实体化的防护)

思路:在服务端或前端检查并处理用户输入,针对危险字符(如 <, >, ', " 等)进行实体化或移除危险片段。

实现方式

  • 最简单的:对输出做上下文相关编码(HTML encode / Attribute encode / JS encode / URL encode)。
  • 过滤器:对输入做黑名单或白名单过滤(推荐白名单)。
  • 使用成熟库或框架的自动转义能力(例如模板引擎内置的转义功能)。

实验与绕过示例(来自靶场/实战):

  1. 无过滤<script>alert()</script>
  2. 部分实体化/回显"> <script>alert()</script> <"
  3. 全部实体化但事件属性可用' onfocus=javascript:alert() '
  4. 采用大小写绕过匹配"> <sCript>alert()</sCript> <"
  5. 字符双写/混淆绕过"> <a hrehreff=javasscriptcript:alert()>x</a> <"
  6. Unicode/实体编码绕过&#x006a&#x0061&#x0076&#x0061&#x0073&#x0063&#x0072&#x0069&#x0070&#x0074&#x003a&#x0061&#x006c&#x0065&#x0072&#x0074&#x0028&#x0029(拼接 javascript:alert())
  7. 属性闭合利用?t_sort=" onfocus=javascript:alert() type="text

更多绕过技巧与案例:


黑盒 XSS 手工分析(思路)

  1. 在页面中找所有显示(回显)的数据点(包括隐藏字段与动态注入点)。
  2. 在这些点注入 JS payload,观察哪些能执行。
  3. 若不能执行,分析为何(被实体化、被引号包裹、关键词被过滤等),并据此调整 payload。
  4. 记录测试过程、截图与响应,便于报告与修复。

小结与建议

  • 优先级:最稳健的组合是:正确的上下文输出编码 + HttpOnly + 严格 CSP(按业务允许最小化脚本来源)。
  • 不要单靠过滤器:输入过滤/黑名单易被绕过,必须结合输出编码与浏览器策略(CSP)。
  • 测试流程化:使用靶场与自动化工具(Burp、XSStrike)结合手工测试,确保高覆盖率。

XSS 跨站脚本深度利用:凭据盗取、业务数据提交、钓鱼攻击与溯源工具指南 2026-01-09
XSS 绕过实战:编码变形、标签混淆与 CSP/WAF 绕过全攻略 2026-01-09

评论区