先看定义(根据AI回答修改调整):
XSS攻击,全称跨站脚本攻击(Cross-Site Scripting),是一种常见的Web安全漏洞。攻击者通过利用网页开发时留下的漏洞,注入恶意代码到网页中。当其他用户访问这些网页时,恶意代码会在用户的浏览器中执行,从而达到攻击的目的。
攻击成功后,攻击者可能获取用户的敏感信息,如Cookie、会话信息等,甚至执行更高权限的操作,如劫持用户会话、插入恶意内容、重定向用户到恶意网站等。XSS攻击的危害一般来说不如sql注入漏洞,但一次成功的XSS攻击可以进行很多操作,仍属于高危漏洞。
XSS攻击可以分为三种类型:
- 持久型XSS:攻击者将恶意代码植入到服务器上,每当用户访问含有该代码的页面时,都会受到攻击。
- 非持久型XSS(反射型XSS):攻击者将恶意代码包含在URL中,并通过诱使用户点击这些链接来触发攻击。。
- DOM型XSS:基于DOM(文档对象模型)的漏洞,攻击者利用客户端脚本处理逻辑的安全问题实施攻击。
html显示中如<div style='color:red'>123</div>会被解释成红色的123
想一个最简单的例子,前端接收一个msg参数,后端直接返回一个jsp页面
@WebServlet("/xssTestServlet")
public class XssTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String msg = req.getParameter("msg");
req.setAttribute("msg",msg);
req.getRequestDispatcher("xsstest.jsp").forward(req,resp);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<div style='color:red'>${msg}</div>
</body>
</html>
研发人员的本意只是想把msg当成一个普通的字符串处理,即无论用户输入什么,前端都应返回红色的内容。
但是如果用户输入参数
?msg=<h1 style='color:blue'>123<h1>
这个直接就显示成蓝色了。
关键是,研发人员应该控制把参数当成一个纯字符串,而不应对<h1 style='color:blue'></h1>当成html中的标签。
仔细看看会发现,xss攻击其实和sql注入攻击很像,都是通过输入一些未预期的参数来扭曲原本的语义,只不过前者扭曲的sql语句,后者扭曲的是html便签。
sql注入可以有预编译(PreparedStatement),html却没有;同样,html的输入也很难是一个白名单能列举完全的,那就只剩下一个,就是过滤、转义。
在过滤器中加上一个全局的输入转义或输入转义即可,由于post请求中可能带有 < > & 等符号,为了防止正常输入被转义后无法识别,建议只对输出转义即可。