crsf跨站脚本攻击描述

image.png

假设当我们要访问一个A网站时,我们正常登入,完成鉴权操作(注意,鉴权有时效),此时网站会将鉴权信息存在cookie里面。此时我们不将浏览器关闭,又打开了一个B网站,此时B网站上存在着黑客留下的一些隐藏的业务逻辑,例如他可以通过IMG标签的SRC属性触发一个GET请求,请求A页面,此时这个请求就会携带上cookie鉴权信息。这样他就相当于发起一些伪造的请求。

假设此时黑客能获取到你的cookie时,他就可以伪造请求正常的访问A页面了。

crsf跨站脚本攻击防御

防御的手段其实很简单,就是在页面中加入token,后台保存在session中(注意sessionid保存在cookie里面的,session是保存在服务器端的),请求时带上token。

这里那nodejs来举例子:不同语言实现方式不同

  1. >npm install csurf --save
  2. >npm install ejs --save
  3. // 后端NodeJS中使用csurf生成csrf_token, 使用ejs在index.html注入token
  4. var csrf = require('csurf');
  5. //指定ejs模版文件的名字仍然为.html
  6. //请求过来,仍然默认返回index.html,nodejs可以往index.html写变量拉
  7. app.engine('.html', require('ejs').__express);
  8. app.set('views', path.resolve(publicDir));
  9. app.set('view engine', 'html');
  10. var csrfProtection = csrf({ cookie: true });
  11. app.get(appPath, csrfProtection, function (req, res){
  12. // 把生成的csrfToken写入到index.html中去
  13. res.render('index', { csrfToken: req.csrfToken() })
  14. });
  15. index.html
  16. <!doctype html>
  17. <html class="bootstrap3 legacyfalse chrometwo">
  18. <head>
  19. <meta content="<%= csrfToken %>" name="csrf-token">
  20. ...
  21. 前端发送POST中加入csrf_token
  22. form表单中加入_csrf
  23. <form method="post" action="/changevalue" class="ng-pristine ng-valid">
  24. <input value="value" name="input1">
  25. <input value="value2" name="input2">
  26. <input type="hidden" value="{{ csrfToken }}" name="_csrf">
  27. <button type="submit">submit</button>
  28. </form>
  29. 后端接口验证csrf_token

攻击手段

模拟表单
提交表单