anchor.diff: -= 把Express用于产品的最佳实践 - 第一篇：安全
  += 把Express用于生产的最佳实践 - 第一篇：安全
   :hp-tags: node express
   :hp-alt-title: Best Practices for Express in Production – Part One: Security
   
  -这两篇博客是关于在产品环境中运行Express的最佳实践。第一篇主要讲安全，第二篇是效率和可靠性。这里假设你已经熟悉了Node.js和网络开发的基本内容，以及产品环境的一些重要概念和主题。
  +https://strongloop.com/strongblog/best-practices-for-express-in-production-part-one-security/[原文链接]
  +
  +这两篇博客是关于将Express用于生产环境的最佳实践。第一篇主要讲安全，第二篇是效率和可靠性。这里假设你已经熟悉了Node.js和网络开发的基本内容，以及生产环境的一些重要概念。
   
   ## 概述
   
  -术语“_产品_”是指在软件生命周期内，一个应用或者API可以让终端用户或消费者使用的场景。相对开发阶段，仍在编写和测试代码，则应用是不对外开放的。对应的系统环境分别称为_产品环境_和_开发环境_。
  +术语“_生产_”是指在软件生命周期内，一个应用或者API可以让终端用户或者说消费者使用的场景。相对开发阶段，仍在编写和测试代码，应用是不对外开放的。对应的系统环境分别称为_生产环境_和_开发环境_。
   
  -通常开发环境和产品环境在设置上有很大差异，且需求也明显不同。经常会出现在开发中OK的事项，无法适用于产品。举个例子，在开发环境中用来排错的大量日志信息，可能会在产品环境中成为一个安全隐患。还有就是在开发环境中，不需要担心稳定性、可靠性及效率。
  +通常开发环境和生产环境在设置上有很大差异，且需求也明显不同。经常会出现在开发中OK的事项，无法适用于生产。举个例子，在开发环境中用来排错的大量日志信息，可能会在生产环境中成为一个安全隐患。还有就是在开发环境中，不需要担心稳定性、可靠性及效率。
   
   这篇博客就来讲讲，对于采用Express的应用上线后，一些安全方面的最佳实践。
   
   ## 不要使用废弃或漏洞版本的Express
   
  -Express 2.x和3.x已停止维护，不会再修正安全和效率上的问题。不要使用它们！如果还未更新到版本4，可以根据 http://expressjs.com/guide/migrating-4.html[这篇引导]来升级你的程序。
  +Express 2.x和3.x已停止维护，不会再修正安全和效率上的问题。不要使用它们！如果还未更新到版本4，可以根据 http://expressjs.com/guide/migrating-4.html[这篇引导]来升级程序。
   
   同时查看一下 http://expressjs.com/advanced/security-updates.html[安全升级页面]，确保没使用有漏洞的版本。如果正在用，先更新到最近的稳定版。
   
   ## 使用TLS
   
  -如果需要传输敏感数据，请使用 https://en.wikipedia.org/wiki/Transport_Layer_Security[Transport Layer Security(TLS)]保护连接和数据。这个技术会在客户端向服务器发送数据之前先对其加密，因而防御一些常见的（且容易）的攻击。虽然像Ajax以POST发送请求会看不到数据，像是被“隐藏”在浏览器中，但脆弱网络传输很容易被 https://en.wikipedia.org/wiki/Packet_analyzer[抓包]或者被 https://en.wikipedia.org/wiki/Man-in-the-middle_attack[中间人攻击]。
  +如果需要传输敏感数据，请使用 https://en.wikipedia.org/wiki/Transport_Layer_Security[Transport Layer Security(TLS)]保护连接和数据。这个技术会在客户端向服务器发送数据之前先对其加密，因而防御一些常见的（容易的）攻击。虽然像Ajax以POST发送请求会看不到数据，像是被“隐藏”在浏览器中，但脆弱的网络传输很容易被 https://en.wikipedia.org/wiki/Packet_analyzer[抓包]或者被 https://en.wikipedia.org/wiki/Man-in-the-middle_attack[中间人攻击]。
   
   如果你知道Secure Socket Layer(SSL)加密，那么 https://msdn.microsoft.com/en-us/library/windows/desktop/aa380515(v=vs.85).aspx[TLS就是下一代的SSL]。换句话说，如果之前你在用SSL，可以考虑升级成TSL。一般来说，推荐使用Nginx处理TLS。这里有一篇不错的文章讲如何在Nginx（或其它服务器）上配置TLS， https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Server_Configurations[推荐服务器配置(Mozilla Wiki).]
   
  -还有一个小工具 https://letsencrypt.org/about/[Let's Encrypt]用来获得TLS证书，由 https://letsencrypt.org/isrg/[网络安全研究组织（ISRG)]提供：免费、自动的、开放认证授权（CA)。
  +还有 https://letsencrypt.org/about/[Let's Encrypt]用来获得TLS证书，由 https://letsencrypt.org/isrg/[网络安全研究组织（ISRG)]提供：免费、自动的、开放认证授权（CA)。
   
   ## 使用Helmet
   
  
positive.code: 
  这里有一份相当不错的 https://blog.risingstack.com/node-js-security-checklist/[Node.js安全检测规范]。这里列一部分出来：
  
  * 实现rate-limiting，预防暴力的认证攻击。安利一个方法 https://strongloop.com/node-js/api-gateway/[StrongLoop API Gateway]，或者使用比如 https://www.npmjs.com/package/express-limiter[express-limiter]的中间件，不过这样一来可能需要改代码。
  * 使用 https://www.npmjs.com/package/csurf[csurf]中间价，防御跨站伪造请求(CSRF)。
  * 始终过滤用户输入，保护跨站脚本(XSS)和命令行注入空间。
  * 使用参数化请求或者预设SQL语句，防御SQL注入攻击。
  
negative.code: 
  ## 避免其它已知的漏洞
  
  时刻关注 https://nodesecurity.io/advisories[Node安全项目顾问]，这是一个非常棒的关于Node安全方面的项目。
  
  最后，像其它网络应用一样，Express应用也会遭到各种漏洞攻击。尽量熟悉 https://www.owasp.org/index.php/Top_10_2013-Top_10[网络漏洞]做好提前预防。
  
  