CSRF与XSS的区别以及防护

前言

国际惯例,先上一下维基百科:

CSRF:跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。

XSS:跨站脚本(Cross-site scripting,通常简称为 XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及用户端脚本语言。

大话解释

CSRF

充用户发起请求(在用户不知情的情况下),完成一些违背用户意愿的请求(如恶意发帖,删帖,改密码,发邮件等)。

举个栗子:

用户 A 登陆微博之后,点开了用户 B 发布的一条网址 www.weibo.com/hehe/deletepage=30 好了用户 A 的 id=30 号的文章就被删除掉了,你没有插入任何恶意代码,你只是调用了网站本身的 js 代码接口,好了你就完成了一次未经授权的删帖操作。

XSS

通过客户端脚本语言(最常见如:JavaScript)在一个论坛发帖中发布一段恶意的 JavaScript 代码就是脚本注入,如果这个代码内容有请求外部服务器,那么就叫做 XSS!

前端如何防护

CSRF

目前最常用的做法就是 token 防护。由于 CSRF 的原理是冒用 cookie 里面的信息,那这里再加一个 token,由前端手动填充到请求中就可以避免这种情况。

XSS

XSS 的防护理论上比较简单,一是尽量少用 innerHTML 属性。二是在用户输入的地方做 HTML 标签过滤。目前已经有比较成熟的方案xss.js npm