XSS攻击

跨站脚本攻击,代码注入攻击,为了获取用户敏感信息如Cookie、SessionId。
两大要素:攻击者提交恶意代码,浏览器执行恶意代码

场景

  • 存储型:sql注入,恶意代码提交到数据库,页面渲染的时候在页面执行。使用Sequelize可以预防,不用刻意去解决。只要不裸写sql语句,常见的数据库工具,都可以解决sql注入的问
  • 反射型:恶意代码在URL
  • DOM型:纯前端的攻击

    防御手段

    过滤代码提交,禁止恶意代码执行。
    1、模板引擎一般都对XSS攻击做了防护。 通过vue和react可以防止,h5也可以通过vue ssr防止。

  • vue中输出原生html要用v-html

  • React要用danerouslySetInnerHtml
  • 如果想要单独处理,用

2、CSP 1.0内容安全策略,禁止加载不该加载的脚本。
CSP2.0 扫描所有的JavaScript脚本,并加上nonce字段,这个字段由服务端生成。浏览器只会允许带有nonce的脚本执行,其他脚本都不会执行。

CSRF攻击

跨站请求伪造,主要是冒充用户cookie,躲开服务端的验证。
攻击者诱导受害人进入第三方网站,在第三方网站中向攻击网站发送跨站请求,利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击者网站执行某些操作的目的。
【有三种类型】

防御手段

  • 提交数据用post请求
  • jwt有token检查
  • Samesite Cookie
  • 同源检测,阻止外域请求。
    • 检测请求头的Origin、Referer字段
  • CSRF Token
    • 讲CSRF Token输出到页面中,带到请求头上,不要放在Cookie中。
  • 双重Cookie验证:
  • 通过验证码去验证

    越权漏洞

跨域

【定义】
浏览器的安全策略,限制一个源的文档或者它加载的脚本如何与另一个源进行交互,为了阻止恶意文档,减少被攻击。
【限制的对象】

  • Cookie、LocalStorage、IndexedDb的存储性内容
  • DOM节点
  • XMLRequest
  • 允许加载跨域资源的三个标签:img、Link、script

【解决手段】

  • CORS:跨域资源共享
    • Access-Control-Allow-Origin
    • Access-Control-Request-Method
    • Aceess-Control-Request-Headers
  • Node中间件代理
  • Nginx反向代理
  • JSONP
    • 利用script标签和img标签获取资源没有跨域限制的漏洞,网页可以得到其他源动态得到的JSON数据,兼容性好。
    • 实现:声明一个回调函数callback,window[callback] = function (data){…}

创建script,把script的src赋值为请求,callback作为请求的参数传递给后端。
服务端接收到请求后,返回callback(res)。
客户端会执行window[callback]这个函数。

  • window.postMessage
    • 允许来自不同源(协议、域名、端口)进行通信,实现跨文本当,多窗口,跨域通信。
  • window.name+iframe
    • window.name当window的location变化重新加载,值不变。利用它来传输数据。
    • 在页面A用iframe加载其他域的页面B,页面B赋值window.name。

然后A完成加载后,修改iframe的地址未同域的地址,这样就可以拿到window.name的值。

开发Node时遇到的安全问题

使用非root用户运行Nodejs

避免带来安全隐患、和权限操作问题。

使用子进程的时候要格外小心

尽可能避免使用子进程childProcess,如果必须这样做,必须验证和清理以减轻shell注入攻击。
childProcess.execFile可以执行单个命令,可以对命令做白名单处理。

不安全的npm包

20%的npm包不安全,危害

  • 随着应用重启,npm包内的脚本会主动运行,可以执行各种命令。
  • 很多包甚至带有挖矿脚本,在计算机后台

解决:

  • npm audit审计依赖是否安全
  • npm audit fix可以自动修复该库的风险,原理就是升级依赖库,升级至已修复了风险的版本号 ```javascript $ npx snyk

$ npx wizard ```

  • 通过 CI/gitlab/github 中配置机器人,使他们每天轮询一次检查仓库的依赖中是否有风险。
    在 Github 中,可单独设置 dependabot 机器人,在仓库设置中开启小机器人,当它检测到有问题时,会自动向该仓库提交 PR,而它的解决方案升级版本号

    网络端口

    服务器只开放80 和443端口,其它由nginx去做转发,通过内外访问就可以绕开防火墙的限制。

    网络攻击

    中小型网站容易受到DDOS攻击,用第三方服务来解决,比如阿里云的Web应用防火墙,简称WAF,价格便宜(一年200块),能够预防常见的网络攻击。