java面试题精解1:详解XSS攻击、SQL注入攻击、CSRF攻击


1、xss攻击

1.1 什么是xss攻击

XSS全称cross-site scripting(跨站点脚本),是当前 web 应用中最危险和最普遍的漏洞之一。攻击者向网页中注入恶意脚本,当用户浏览网页时,脚本就会执行,进而影响用户,比如关不完的网站、盗取用户的 cookie 信息从而伪装成用户去操作,携带木马等等。

1.2 xss分类

  1. 反射型XSS(非持久性跨站攻击)
  2. 存储型XSS(持久性跨站攻击)
  3. DOM Based XSS(基于 dom 的跨站点脚本攻击)

1.2.1 反射型XSS(非持久性跨站攻击)

利用网站某些页面会直接输出请求参数的特性,通过在url的请求参数包含恶意脚本,诱使用户点击嵌入恶意脚本的url链接执行恶意脚本以达到攻击的目的。目前有很多攻击者利用论坛、微博发布含有恶意脚本的URL就属于这种方式。

1.2.2 存储型XSS(持久性跨站攻击)

通过表单输入(比如发布文章、回复评论等功能中)插入一些恶意脚本,并且提交到被攻击网站的服务器数据库中。当用户浏览指定网页时,恶意脚本从数据库中被加载到页面执行,QQ邮箱的早期版本就曾经被利用作为持久型跨站脚本攻击的平台。

与反射型 XSS 相比,该类的攻击更具有危害性,因为它影响的不只是一个用户,而是大量用户,而且该种类型还可进行蠕虫传播。

1.2.3 DOM Based XSS(基于 dom 的跨站点脚本攻击)

通过前面两种类型的方式,注入的脚本是通过改变 DOM 来进行攻击的。采用该种方式有一个好处就是从源代码中不易被发现。

1.3 防范xss攻击

1.3.1 xss攻击漏洞产生的原因

产生xss攻击漏洞主要是因为服务器没有对用户输入进行编码和过滤。

另一个原因是,这种攻击方法有很多变体,攻击的手法却不断翻新,要设计出一个能完全防御的XSS过滤器是非常困难的。

1.3.2 xss攻击防护防范

防范xss攻击的原则就是不相信用户输入的数据,我们可以从俩分泌入手:

  1. 消毒(对危险字符进行转义)
  2. HttpOnly(防范XSS攻击者窃取Cookie数据)。
消毒
  • 对数据进行转义,比如<转义成<,这样脚本就运行不了了。
  • 录入数据设置白名单,比如javaWeb项目,设置过滤器过滤特殊字符
  • 前端页面限制用户输入数据类型,比如用户输入完年龄后验证输入内容只能是数字。
  • 过滤JS事件的标签,比如onclickload

HttpOnly

将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了

2、SQL注入攻击

2.1 什么是SQL注入

SQL注入,顾名思义就是通过注入SQL命令来进行攻击,更确切地说攻击者把SQL命令插入到web表单或请求参数的查询字符串里面提交给服务器,从而让服务器执行执行的该SQL。

SQL 注入漏洞产生的原因

既然SQL注入是通过让服务器执行了恶意的SQL命令从而进行攻击的,那么主要问题就出在于服务器是如何生成 SQL语句的。绝大多数拥有SQL注入漏洞的Web系统,在生成SQL语句的时候,采用的是拼接字符串的方式,并且没有对要组装成SQL语句的参数进行检验和过滤。另外Mybatis框架的占位符用的$而不是#也存在被注入的风险。

2.2 SQL注入攻击防范

SQL注入攻击的防护与xss攻击的有点类似,也可以采用消毒的方式,过滤特殊操作字符来避免大部分的注入攻击。

3、CSRF攻击

3.1 定义

CSRF攻击,全程Cross Site Request Forgery(跨站请求伪造),攻击者通过跨站请求,以合法的用户身份进行非法操作(如转账或发帖等)。CSRF的原理是利用浏览器的Cookie或服务器的Session,盗取用户身份,从而进行操作。

3.2 CSRF漏洞产生的原因

CSRF漏洞产生的原因是服务器端没有对请求的发起源进行合理的检验,不加分析地认为请求者一定是正常的用户,响应请求给非法分子。

3.3 防范

CSRF 攻击是一种请求伪造的攻击方式,它利用的是服务器不能识别用户的类型从而盗取用户的信息来攻击。因此要防御该种攻击,因为从服务器端着手,增强服务器的识别能力,设计良好的防御机制。
主要有以下几种方式:

  1. 请求头中的Referer验证(不推荐)
  2. 请求令牌验证(token验证)

3.3.1 请求头中的Referer验证

HTTP的头部有一个Referer信息的字段,它记录着该次HTTP请求的来源地址(即它从哪里来的),既然CSRF攻击是伪造请求是从服务器发送过来的,那么我们就禁止跨域访问,在服务器端增加验证,过滤掉那些不是从本服务器发出的请求,这样可以在一定程度上避免CSRF攻击。 但是这也有缺点,比如如果是从搜索引擎所搜结果调整过来,请求也会被认为是跨域请求。

3.3.2 请求令牌验证(token验证)

token验证是一种比较广泛使用的防止CSRF攻击的手段,当用户通过正常渠道访问服务器时,服务器会生成一个随机的字符串保存在session中,并作为令牌(token)返回给客户端,以隐藏的形式保存在客户端中,客户端每次请求都会带着这个token,服务器根据该token判断该请求是否合法

你可能感兴趣的:(面试系列)