Skip to content

CSRF和XSS #386

@wxgg

Description

@wxgg

安全问题:CSRF和XSS

前言

前端开发可能不太重视相关知识的补充,但多数时候安全问题也是能从前端角度防范。对于前端可以不会,但大致得了解。熟知的SQL注入,这个其实跟前端的关系不是很大。很少有做接口的人会笨到直接接收参数不做任何处理入库。

CSRF

CSRF的攻击原理

CSRF(Cross-site request forgery):跨站请求伪造。

用户是网站A的注册用户,且登录进去,于是网站A就给用户下发cookie。要完成一次CSRF攻击,受害者必须满足两个必要的条件:

  • 登录受信任网站A,并在本地生成Cookie。(如果用户没有登录网站A,那么网站B在诱导的时候,请求网站A的api接口时,会提示你登录)
  • 在不登出A的情况下,访问危险网站B(其实是利用了网站A的漏洞)。

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

CSRF如何防御

方法一、Token 验证:(用的最多)

  • 服务器发送给客户端一个token;
  • 客户端提交的表单中带着这个token。
  • 如果这个 token 不合法,那么服务器拒绝这个请求。

方法二:隐藏令牌:

  • 把 token 隐藏在 http 的 head头中。
  • 方法二和方法一有点像,本质上没有太大区别,只是使用方式上有区别。

方法三、Referer 验证:

  • Referer 指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截。

XSS

XSS的基本概念

XSS(Cross Site Scripting):跨域脚本攻击。

接下来,我们详细讲一下 XSS 的内容。

预备知识:HTTP、Cookie、Ajax。

XSS的攻击原理

XSS攻击的核心原理是:不需要你做任何的登录认证,它会通过合法的操作(比如在url中输入、在评论框中输入),向你的页面注入脚本(可能是js、hmtl代码块等)。

最后导致的结果可能是:

  • 盗用Cookie
  • 破坏页面的正常结构,插入广告等恶意内容
  • D-doss攻击

XSS的攻击方式

  • 反射型

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

  • 存储型

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

XSS的防范措施(encode + 过滤)

XSS的防范措施主要有三个:

1. 编码:

对用户输入的数据进行HTML Entity编码。

Encode的作用是将$var等一些字符进行转化,使得浏览器在最终输出结果上是一样的。

比如说这段代码:

<script>alert(1)</script>

若不进行任何处理,则浏览器会执行alert的js操作,实现XSS注入。

进行编码处理之后,L在浏览器中的显示结果就是<script>alert(1)</script>,实现了将$var作为纯文本进行输出,且不引起JavaScript的执行。

2、过滤:

移除用户输入的和事件相关的属性。如onerror可以自动触发攻击,还有onclick等。(总而言是,过滤掉一些不安全的内容)
移除用户输入的Style节点、Script节点、Iframe节点。(尤其是Script节点,它可是支持跨域的呀,一定要移除)。

3、校正

避免直接对HTML Entity进行解码。
使用DOM Parse转换,校正不配对的DOM标签。

备注:我们应该去了解一下DOM Parse这个概念,它的作用是把文本解析成DOM结构。

比较常用的做法是,通过第一步的编码转成文本,然后第三步转成DOM对象,然后经过第二步的过滤。

还有一种简洁的方式:

首先是encode,如果是富文本,就白名单。

CSRF 和 XSS 的区别

CSRF:

  • 需要用户先登录网站A,获取 cookie
  • 是利用网站A本身的漏洞,去请求网站A的api。
    XSS:
  • 不需要登录。
  • 是向网站 A 注入 JS代码,然后执行 JS 里的代码,篡改网站A的内容。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions