什么是CSRF?
CSRF/XSRF,全名:Cross-site request forgery,中文:跨站请求伪造。是一种冒充受信任用户,向服务器发送非预期请求的攻击方式。
他是怎么进行攻击的?
举个例子:
- A用户打开了某个页面,登录生成Cookie存储到浏览器。
- 这时候弹出一个广告窗口,说给A钱,A想也没想,点了。
- A点完之后发现账户少了钱。。。,怎么做到的?
仔细想想,如果你的支付操作是GET请求,所有的参数就在你的URL上展示着,获取你的URL轻轻松松。
利用浏览器发起请求的时候会自动携带上你的Cookie,伪造你URL发起请求,你就傻眼了。
- 该网站:不行,我给改成POST请求。
- 黑客:你当我傻子?老子做黑客的。我不会用from表单提交一个POST请求?
- 该网站:WDNMD?这可咋防御啊?
服务端:我有办法防御!!!
服务端进行防御
Token
- 服务端:我给客户端生成一个token(令牌),客户端你可千万别给放在Cookie中使用啊。否则又自动携带上了,我就没招了。(我得自己将token存起来,存到session里,别下回给我我找不着了。)
- 客户端:好嘞,我给存储到localStorage里面,免的总自动携带。路由发生跳转的时候去判断 localStorage 中有无 token。
- 黑客:哎呦喂?不能用了啊?你行,我再研究研究。
什么是XSS?
XSS,全名:Cross-site scripting,中文:跨站脚本攻击。攻击者可以注入恶意的客户端代码。当被攻击者登陆网站时这会自动运行这些恶意代码,这样攻击者就可以冒充受害者。
XSS可以分为三类:反射型、存储型、基于DOM。
反射型:
当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。
Web服务器将注入脚本,比如一个错误信息,搜索结果等 返回到用户的浏览器上。
由于浏览器认为这个响应来自"可信任"的服务器,所以会执行这段脚本。
- A用户的页面被注入了一个恶意链接的a标签(类似于广告)。
- A用户点击了这个恶意的链接,进入了恶意网站,恶意网站能够获取到用户的Cookie。
存储型:
注入型脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器上传回并执行。
- A打开一个网站,没有发现这个网站有其他用户评论了一段恶意的javaScript代码。
- 这段代码被存储在了该网站的服务器上。
- 这段代码会将A评论的内容获取到,然后显示在其他网站上。
- A聊点隐私全被别人看到了。
基于DOM:
通过修改原始的客户端代码,受害者浏览器的 DOM 环境改变,导致有效载荷的执行。
也就是说,页面本身并没有变化,但由于DOM环境被恶意修改,有客户端代码被包含进了页面,并且意外执行。
- 这个攻击是纯粹发生在客户端的攻击。
- 点击submit按钮,给页面添加一个a标签。
-
<a href onlick="alert(/xss/)">testLink</a>
客户端进行防御
HttpOnly 防止截取 Cookie
响应头添加:
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
这样会使得JavaScript Document.cookie API 无法访问Cookie。
持久化服务器端会话的 Cookie 不需要对 JavaScript 可用。
输入检查
-
将用户输入的“<”,">"等特殊字符,进行过滤或编码。
const decodingMap = { '<': '<', '>': '>', '"': '"', '&': '&', ' ': '\n' }
输出检查(服务端防御)
- 除富文本的输出外,在变量输出到HTML页面时,可以使用编码或转译的方式来防御XSS攻击。
总结:
关于CSRF 和 XSS 先总结到这里啦,关于安全问题其实还有好多,之后还会继续进行补充的。