本章目录:
1·XSS能做什么 2·XSS攻击原理 3·防范XSS攻击的方式 4·使用框架防范XSS攻击
XSS的全名为:Cross Site Scripting。它的详细说明,大家可以自己百度了解一下,这里就不浪费篇幅了。
利用XSS攻击可以给指定的在线软件或网站挂马,通过获取用户的Cookie可以获取任何一个人的账号信息,包括密码等敏感信息。甚至管理员的后台地址及账号信息。
钓鱼攻击,在你毫不知情的情况下其实已经跳转到了对方指定的链接或者网站。
以上只是XSS攻击的一部分作用,详细的大家可以自行扩展。
XSS攻击一般是利用开发者遗留下来的漏洞进行攻击。如通过提交表单的方式,将恶意代码发送至服务器执行或使指定内容被返回,亦或者是将恶意代码保存至数据库中,每当该内容被读取都会执行该段代码从而达到更大范围杀伤力。
一般在网页中含有Editor(富文本编辑器)的时候比较常见这种攻击,对于以前的老网站来说,可以说这种攻击只能通过管理员后期维护来防止攻击,而在互联网飞快发展的今天,防御策略已经非常的成熟了。
但是毕竟互联网在进步,攻击手法也在进步,各位程序员还是勤快点多维护一下你的数据库,以防被别人挂马了造成不必要的损失。
防范XSS攻击行为,一般有三种方式,一是对输入内容和URL参数进行过滤,二是对动态输出的内容进行编码,使该脚本无法生效。三是对Cookie设置http-only
,使JS无法对Cookie进行操作。
对用户输入的内容,URL参数等进行过滤
针对可能发生的XSS攻击行为进行过滤,一般在挂马之类的恶意内容都是通过JS脚本进行的,而JS脚本需要<script>
标签作为载体,所以我们应该在过滤内容中的JS标签。要么使它无法提交,要么在提交后,过滤掉该标签。
当然高级一点的手法,攻击者可能会针对你的后台语言进行相应的写法,从而绕过你的围追堵截。
对用户输入时进行白名单过滤
比如使用户只能输入英文、中文、数字、下划线等简单符号,而不能输入标签。从而达到白名单过滤,这种手法效率比较高,但是对于网站需要富文本输入框来说,这种过滤就不太现实了。
从数据库读取内容长度超过20字符串的内容时,对内容进行过滤或编码转义,使恶意内容无法生效。
将Cookie设置成http-only
,是为了防止恶意代码生效后窃取Cookie内容。
设置方式:以下内容均使用Java
使用Spring:
// 该类实现org.springframework.web.servlet.HandlerInterceptor接口
// 重写preHandle方法
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
Cookie cookie = new Cookie("timestamp", new Long(new Date().getTime()).toString());
cookie.setSecure(true);
// 设置cookie为http-only
cookie.setHttpOnly(true);
httpServletResponse.addCookie(cookie);
return true;
}
使用Servlet:
// 注意从servlet3.0开始支持cookie设置httpOnly
// 利用HttpResponse的addHeader方法设置cookie
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");
可以自行复制链接到浏览器查看。
Node.js:https://github.com/leizongmin/js-xss
Java:https://github.com/naver/lucy-xss-filter