安全问题 CSRF 与 XSS

1,113 阅读3分钟

什么是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 先总结到这里啦,关于安全问题其实还有好多,之后还会继续进行补充的。