核心内容摘要
川味“嘶吼”大揭秘:BBB嗓与BBBB嗓,谁是真正的“麦霸”?
修复方案反射型 XSS漏洞
输入验证
输出时编码HTML 上下文编码HTML 属性上下文编码JavaScript 上下文编码
内容安全策略 (CSP)
使用安全的框架和库在处理任何来自客户端的数据时包括 URL 参数、表单数据、HTTP 头等都必须将其视为不可信的。
修复的重点不是“输入时过滤”而是 “输出时编码”
输入验证输入验证不能替代输出编码它主要用于业务逻辑校验如邮箱格式、电话号码长度因为攻击者可能找到绕过验证的方法。
输出编码是最后一道也是最可靠的防线。
在输出之前可以进行严格的输入验证。
白名单原则 例如只允许字母、数字和特定符号拒绝任何不符合格式的输入。
输出时编码HTML 上下文编码当用户输入的数据需要被输出到 HTML 页面中时例如在div、span、p标签内部必须进行 HTML 编码。
例如Java代码的修复StringuserNamerequest.getParameter(name);// 浏览器会将 scriptalert(XSS)/script 作为纯文本显示而不会解析为标签StringsafeUserNameEncode.forHtml(userName);// 使用ESAPI安全库HTML 属性上下文编码当用户输入需要被放入 HTML 属性如 value、href、src、onclick时也需要特殊处理。
对于普通的属性值除了 HTML 编码外始终用引号单引号或双引号将属性值括起来。
对于 href、src 等 URL 属性需要进行 URL 编码并严格验证协议白名单只允许 http:、https:。
JavaScript 上下文编码当需要将用户输入插入到script标签中时这是最危险的场景之一。
应避免将用户输入直接放入 JavaScript 中。
如果必须这样做必须使用 JavaScript 编码。
例如StringuserDatarequest.getParameter(data);StringsafeUserDataEncode.forJavaScript(userData);
内容安全策略 (CSP)可以通过 HTTP 头Content-Security-Policy CSP告诉浏览器只允许加载和执行来自特定来源的脚本、样式等资源。
这样即使网站存在 XSS 漏洞攻击者注入的内联脚本script.../script也不会执行CSP 默认会阻止它们。
一个通用的 CSP 配置Content-Security-Policy:default-srcnone;script-srcself;connect-srcself;img-srcselfdata:https:;style-srcselfunsafe-inline;font-srcself;base-uriself;form-actionself;frame-ancestorsnone;object-srcnone可以通过 Web 服务器的配置来设置这个 HTTP 头add_headerContent-Security-Policydefault-src none; script-src self; connect-src self; img-src self data: https:; style-src self unsafe-inline; font-src self; base-uri self; form-action self; frame-ancestors none; object-src none;always;