xss是什么?
跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
xss的作用
1、盗用cookie,获取敏感信息。可通过盗用cookie,以受害者的身份访问页面,如管理员后台。
2、利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
4、利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
5、在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。
xss分为反射型、存储型和dom型,下面的demo属于反射型xss
public void Message(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
String message = req.getParameter("msg");
try {
resp.getWriter().print(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
xss的修复
输入过滤
- 对输入的内容诸如<script>、<img>等标签进行过滤
- 禁用不需要的事件,如"onmouseover", "onmouseout", "onmousedown"等
- 对符号进行编码,如<>在输入的时候要对其进行转换编码
纯前端渲染
- 浏览器先加载一个静态 HTML,此 HTML 中不包含任何跟业务相关的数据。
- 然后浏览器执行 HTML 中的 JavaScript。
- JavaScript 通过 Ajax 加载业务数据,调用 DOM API 更新到页面上
转义html
如果拼接 HTML 是必要的,就需要采用合适的转义库,对 HTML 模板各处插入点进行充分的转义。常用的转义库为 org.owasp.encoder
输入内容长度控制
对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止 Xss 发生,但可以增加 Xss 攻击的难度。
对于明确的输入类型,例如数字、URL、电话号码、邮件地址等等内容,进行输入过滤还是必要的。
Cookie的安全设置
HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
安全验证
- 验证码:防止脚本冒充用户提交危险操作。(通常用在重要操作时,如修改密码等)
X-XSS-Protection请求头
X-XSS-Protection 响应头是 IE,Edge,Chrome 和 Safari 的一个特性,当检测到跨站脚本攻击 (XSS) 时,浏览器将停止加载页面。
- # 0 表示禁止XSS过滤 1 表示开启XSS过滤
- X-XSS-Protection: 0
- X-XSS-Protection: 1
- # 启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。
- X-XSS-Protection: 1; mode=block
- # 启用XSS过滤 (谷歌浏览器专用)。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。
- X-XSS-Protection: 1; report=<reporting-uri>
CSP请求头
全称Content-Security-Policy(内容安全策略),允许站点管理者控制用户代理能够为指定的页面加载哪些资源。它通过一系列的指令声明可以决定URL、多媒体资源、字体的加载策略、脚本的执行策略。具体可以查看Content-Security-Policy文档。
在响应标头中设置内容安全策略将允许您告诉浏览器永远不要执行内联 JavaScript,并选择可以为页面托管 JavaScript 的域:
Content-Security-Policy: script-src ‘self’ https://apis.google.com
还可以将内容安全策略放置在页面元素的<meta>标记中<head>:
<meta http-equiv=”Content-Security-Policy” content=”script-scr ‘self’ https://apis.google.com”>
在Spring Security中可以这样配置它:
- httpSecurity.headers()
- .contentSecurityPolicy(“script-src https://apis.google.com”)
拦截器
结合 Servlet Filter 或者Spring MVC 拦截器
编写JSON序列化来实现对JSON返回的转义,例如Jackson中自定义XSS序列化
class XssStringJsonSerializer extends JsonSerializer<String> {
@Override
Class<String> handledType() {
String.class;
}
@Override
void serialize(String value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
if (value != ) {
jsonGenerator.writeString(HtmlUtils.htmlEscape(value));
}
}
}
参考文章:https://xz.aliyun.com/t/6937
https://blog.csdn.net/weixin_39916520/article/details/114565853
https://netsecurity.51cto.com/art/202106/668949.htm
https://www.neuralegion.com/blog/cross-site-scirpting-prevention/