CSRF 是什么

CSRF(Cross-site request forgery):跨站请求伪造。也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

CSRF 可以做什么?

你这可以这么理解 CSRF 攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF 能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账。… 造成的问题包括:个人隐私露以及财产安全。

CSRF 的攻击原理

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

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

我们在讲 CSRF 时,一定要把上面的两点说清楚。 温馨提示一下,cookie 保证了用户可以处于登录状态,但网站 B 其实拿不到 cookie。

举个例子,前端事假你,微博网站有个 api 接口有漏洞,导致很多用户的粉丝暴增。

CSRF 如何防御

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

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

示例:

// 生成随机数token
crutime := time.Now()
h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime, 10))
io.WriteString(h, "ganraomaxxxxxxxxx")
token := fmt.Sprintf("%x", h.Sum(nil))

方法二:隐藏令牌

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

方法三、Referer 验证

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

常见防御手段:CSRF

CSRF 工具的防御手段:

  1. 尽量使用 POST,限制 GET

  2. 添加验证码(验证码,强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制 CSRF 攻击)

  3. 验证 referer(HTTP Referer 是 header 的一部分,当浏览器向 web 服务器发送请求的时候,会带上 Referer,通过验证 Referer,可以判断请求的合法性,如果 Referer 是其他网站的话,就有可能是 CSRF 攻击,则拒> 绝该请求。)

  4. 使用 token(这个 Token 的值必须是随机的,不可预测的。由于 Token 的存在,攻击者无法再构造一个带有合法 Token 的请求实施 CSRF 攻击。另外使用 Token 时应注意 Token 的保密性,尽量把敏感操作由 GET 改为 POST,以 form 或 AJAX 形式提交,避免 Token 泄露)

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

核心是 注入 恶意代码

XSS 的攻击原理

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

最后导致的结果可能是:盗用 Cookie 破坏页面的正常结构,插入广告等恶意内容 D-doss 攻击 XSS 的攻击

预防 xss

  1. 验证所有输入数据,有效检测攻击——限制输入数据的类型,值,范围等等
  2. 个是对所有输出数据进行适当的处理——一般的 web 框架会进行自动转义,以防止任何已成功注入的脚本在浏览器端运行。

html 转义,就是将包含的 html 标签输出,而不被解释执行

比如,Django 会将如下字符自动转义:

< 会转换为&lt;

> 会转换为&gt;

' (单引号) 会转换为&#39;

" (双引号)会转换为 &quot;

& 会转换为 &amp;

CSRF 和 XSS 的区别

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