Node.js 最佳实践

概述

提供在Node.js中开发更安全程序码的一般最佳实践。

建议
  • 始终验证外部输入
    通常软件中最危险的部分是它将处理不受信任的外部资料的地方。
    因此这是确保给予关注的最重要领域之一。
    • 问题范例
      https://cwe.mitre.org/data/definitions/20.html
      function buildList(var untrustedListSize)
      {
          if(0> untrustedListSize)
          {
              new Error("为列表大小提供了负值!");
          }
      
          var list = new Widget [untrustedListSize];
          list [0] = new Widget();
      }
      
    • 修正
      验证函式库是一个受欢迎的选择。
      express-validator.js
    • 风险等级
      它要求程序码的底层区域很容易受到利用,因此,这被视为低严重性问题。
      尽管如果基础程序码容易受到攻击,则将导致高严重漏洞。
    • 参考
      MITRE指南
      OWASP指南
  • HTTP标头
    HTTP标头可以使页面开发人员通知浏览器对Web攻击采取各种保护措施。
    例如Clickjacking和XSS。
    • 问题范例
      • X-Frame-Options:防止点击劫持
      • Strict-Transport-Security:实施HTTPS并防御降级攻击
      • X-XSS-Protection:在支持此标头的浏览器中启用XSS保护
      • Content-Security-Policy:可以限制程序码脚本来自并可以执行
    • 修正
      手动检查并根据您的HTTP连接采用标头。
      OWASP在其安全标头项目中提供了不错的相关标头列表。
      此外也推荐使用Helmet(也可通过npm获得)来帮助提供这些保护。
    • 风险等级
      低高
    • 参考
  • 使用eval()
    使用eval()函数非常危险,几乎不需要。
    该功能使攻击者可以在目标站点上直接简单地执行程序码。
    • 问题范例
        eval(<Any Thing>);
      
    • 修正
      通常执行不受信任的程序码是完全不安全的,因此应完全避免。
      任何此类使用的情况都将被认真考虑。
      在某些情况下,使用暴露Node.js V8引擎的本地VM模组是可以接受的,在其他情况下,可能需要更强大的隔离。
    • 风险等级
      低高
    • 参考
      • https://developer.mozilla.org/zh- CN/docs/Archive/Add- ons/Overlay_Extensions/XUL_School/Appendix_C:_Avoid_using_eval_in_Add- ons(关於在插件中使用的讨论,但也适用於其他地方)
  • 始终使用HTTPS( > TLS1.1)
    HTTP流量是未加密的,这意味着跨不受信任/不受控制的通道的任何流量都是完全不可信的。
    监於从加密通道获得的信任增加,HTTPS的性能几乎可以忽略不计。
  • Localhost 并非本质上不受网路安全
    我们发现,许多团队错误地认为本地客户端REST服务的接口被设计为绑定到localhost可以防止远程攻击者的入侵。
    但是,可以通过Web浏览器访问localhost,从而使这些服务容易受到恶意网页的攻击。
    • 问题范例
      参见CVE-2017-12939
    • 修正
      在您的项目中启用CORS。
      范例:
      Access-Control-Allow-Origin:https://localhost:<通讯埠>
    • 风险等级
    • 参考
      • Express有一个流行的CORS库:https://github.com/expressjs/cors
  • NPM 打包工具和风险
    npm的审核选项可以自动扫描项目的已安装软件,并具有严重性等级以及指向所扫描风险的详细讯息的链接。
    建议对所有项目定期运行此程序,以帮助识别依赖项中可能存在的漏洞。
    未修补的npm软件包可以很容易地被利用,因为漏洞一经修补便被公开。
  • 过时的软件包
    与所有第三方原始码码一样,确保使用软件包的最新可用版本。
    漏洞每天都会被发现,通常与更新包一样容易修复。
    • 问题范例
      Express,一个广泛使用的HTTP程序包,在这里发布了它们的漏洞:
      https://expressjs.com/en/advanced/security-updates.html
    • 修正
      使用npm update,或利用本文档中描述的npm audit命令。
    • 风险等级
      漏洞的风险等级由报告问题的供应商确定。
其他
- Node.js安全问题的讯息:https://www.owasp.org/images/f/fa/AppSecIL2016_NodeJS-Security_LiranTal.pdf
- Express小组的安全建议:https://expressjs.com/en/advanced/best-practice-security.html
- OWASP的Node Goat项目:https://github.com/OWASP/NodeGoat

<<:  [DAY28]番外篇-使用fetch发送请求

>>:  【验证模型】3-7 「今晚,我想来点⋯⋯」动手做的餐点选择器进化!(上集)

【没钱买ps,PyQt自己写】Day 22 - PyQt 视窗的个性化/属性控制 setWindowFlags,禁止放大缩小、永远显示於最上层/最下层

看完这篇文章你会得到的成果图 之前内容的重点复习 (前情提要) 我们接下来的讨论,会基於读者已经先读...

[DAY18] 用 Azure Machine Learning SDK 建立 Workspace

DAY18 用 Azure Machine Learning SDK 建立 Workspace 大家...

IDCAPSA303 | Bandar Slot Game Situs Joker123 Gaming

Idcapsa303 is the trusted and largest slot bookie ...

Sass/Css Smacss模组化 DAY38

这里必须先介绍 为什麽我们需要模组化呢? 这里举一个例子我们尚未模组化的css //基本按钮 .bt...

TOGAF 的个 六个组件

[开放组] Open Group (http://www.opengroup.org/)架构框架 (...