计算机安全:XSS 和CSRF 攻击 以及防御方式

735 阅读4分钟

1. XSS(Cross site Scripting)跨站脚本攻击

1.1 定义:

是一种常见于web应用中的计算机安全漏洞,恶意攻击者往web页面中嵌入恶意的脚本,大部分的 XSS 漏洞都是由于没有处理好用户的输入,导致恶意脚本在浏览器中执行。任何输入提交数据的地方都有可能存在 XSS。

1.2 攻击原理:

不需要做什么的登录认证,通过合法的操作(比如url中输入,评论框中输入)向你的页面注入脚本(js,html代码块),

1.2.1 攻击产生的后果:

  • 盗用cookie
  • 破坏页面结构
  • 插入广告
  • 携带木马
  • 导航到恶意网站等

1.3 攻击方式:

方式一:反射型

  1. 发出请求时,XSS代码出现在url中,作为输入提交到服务器端,
  2. 服务器端解析后响应,XSS代码随响应内容一起传回给浏览器
  3. 最后浏览器解析执行XSS代码。 这个过程像一次反射,所以叫反射型XSS。

方式二:存储型:

存储型XSS和反射型XSS的差别在于

  1. 提交的代码会存储在服务器端(数据库、内存、文件系统等),
  2. 下次请求时目标页面时不用再提交XSS代码。

比如评论功能里写一个脚本提交后存到了数据库,那么每次加载评论列表都会执行,危害更大。


1.4 如何防御【重点】:

方式一: 编码

对不可信数据进行JavaScript编码。 encode

方式二: XSS Filter 过滤

针对用户提交的内容,只接受我们规定的长度和内容,过滤掉其他内容

  • 表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。
  • 过滤或移除特殊的 html 标签:<script>、<iframe>等。
  • 过滤 js 事件的标签:onclick、onerror、onfocus等。

方式三: 校正

html 实体的存在是导致 XSS 漏洞的主要原因之一,所以我们需要将实体转化为响应的实体编号。 比如 < 小于号应该用 &lt;


2. CSRF(Cross-site request forgery) 跨站请求伪造

2.1 背景

我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。

2.2 攻击原理

完成一次CSRF攻击,必须满足两个条件

  • 登录受信任的A网站,并在本地生成cookie
  • 不登出A的情况下,访问B网站

简单点说就是:用户在A网站里访问了危险的B网站,B要求去访问A网站, 浏览器带着 cookie去 访问A

cookie保证了用户可以处于登录状态,但网站B其实拿不到 cookie。

2.2.1 攻击产生的后果

可以直接从银行转走你的钱

 <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>

2.3 如何防御【!!重点!!】:

方式一: Referer验证(最不安全,但最简单)

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。只接受本站的请求,服务器才做响应;如果不是,就拦截。

image.png

优点:

  • 简单易行, 不用改变现有代码合逻辑

缺点:

  • 浏览器对referer的实现有差别,相当于依赖了第三方来保障的
    • 对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值
  • 用户可以自己设置发送请求时不提供referer,那么网站会认为没有referer值是CSRF攻击,而拒绝用户的访问

方式二: Token 验证

CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求。 信息不要存在cookie中 可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

缺点:

对于所有的请求都要手动或者遍历加上token

方式三: 在HTTP 头里自定义属性并验证

也是使用token, 但是是放在自定义属性中

优点:

  • 可以一次性给所有类请求加上这个头属性
  • xmlHttpRequest请求 地址不会被浏览器记录到地址栏,也不用担心token会透过rederer泄露到其他网站中

缺点:

  • xhr 请求通常用于ajax的局部页面的异步刷新,因为不被浏览器记录,所有不会有前进后退等操作
  • 对于没有CSRF 遗留防护系统来说,重构成本太大

3. XSS 和 CSRF区别:

CSRFXSS
需要用户先登录网站A不需要登录
是利用网站A 本身的漏洞,去请求网站A的API注入JS代码,并执行,篡改网站A的内容

总结:

xss 和csrf 是两种跨站攻击方式,一种是通过输入脚本,另一个是伪造请求。防御的话csrf可以通过跨域认证也就是token,因为这个token信息 黑客不能伪造,所以能够防御。也可以使用referer。 xss 的话主要就是过滤编码限制输入的内容