您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
必须谨记!Node.js安全开发技巧
 
作者 Gergely Nemeth 火龙果软件  发布于 2014-11-27
  1063  次浏览      31
 

毫无疑问,Node.js已经变的愈加成熟,尽管这样,开发者仍然缺乏大量的安全指南。本文将分享一些有关Node.js安全要点给大家,希望大家能够谨记于心。

互联网安全事件层出不群,用户每时每刻都有可能会遭受攻击者袭击。作为软件开发人员,则是最大限度的保证应用程序安全。本文主要是对Node.js语言作出的安全开发建议。

以下为译文:

毫无疑问,Node.js已经变的愈加成熟,尽管这样,开发者仍然缺乏大量的安全指南。在这篇文章中,我将分享一些有关Node.js安全要点给大家,希望大家能够谨记于心。

1.避免使用Eval

Eval并不是唯一一个需要避免的函数,在后台,下面这几个表达式可以使用eval:

  • setInterval(String, 2)
  • setTimeout(String, 2)
  • new Function(String)

为什么要禁止使用eval?因为它会打开代码引起注入攻击,并且降低运行速度。

2.请用严苛模式(Strict mode)

这种情况下,你可以使用一个受限制的JavaScript变量,它可以消除一些隐性错误并且会把这些错误抛出去。

3.Undeletable属性

4.对象声明必须是独一无二的

5.Prohibits with

获得这些隐性错误的完整列表,你可以访问MDN。

6.测试

不用说,测试,测试,多点测试~

当然,不仅仅是单元测试,直戳测试金字塔。

7.对sudo node app.js说再见

我看到很多人在运行拥有超级用户权限的Node APP,为什么?因为他们想让应用程序能够监听80或443端口。

这种做法是错误的。小心一个错误/bug进程就能降低整个系统,因为它已经拥有合法的凭证去做任何事情。

取而代之,你应该设置一个HTTP服务器/代理来转换请求,可以是nginx、Apache等等。

8.避免命令注入

看看下面这段代码有什么问题?

child_process.exec调用去执行/bin/sh,所以,这是一个bash注射器,而不是一个程序启动器。

当用户输入的内容传递到这个方法中,就会产生问题——要么是一个\要么就是$(),攻击者很可能会注入一个新的命令。

开发人员可以使用child_process.execFile来解决此类问题。访问LiftSecurity来查看如何处理命令注入。

9.临时文件

开发人员在创建文件时要特别注意,例如处理上传文件。这些文件很容易吃掉你所有的磁盘空间。

解决方法是使用Streams。

10.确保Web应用程序安全

这里不仅仅是针对Node——而是关于如何确保你的Web应用程序安全。

11.跨站脚本反射

当攻击者把代码注入到HTTP响应时,这种情况才会发生。应用程序在返回无效的输入到客户端时(大多数都是基于JavaScript编写的),应用程序很容易遭受这种类型攻击。攻击者可以盗取cookies、执行剪贴板和修改页面本身。

具体示例:

如果用户查询字符串在没有验证的情况下被发送回客户端,并且插入到DOM中,它便会执行。

如何预防:

  • 禁止插入不可信的数据到DOM中;
  • 在插入前进行HTML escape。

点击链接可以查看更多关于跨站脚本反射和解决之道。

12.停止Cookie盗窃

默认情况下,在同一个域里,JavaScript可以读取cookies,在跨站脚本攻击里,这是非常危险的。不仅如此,任何第三方JavaScript库都可以读取它们。

示例:

如何预防:

开发者可以在cookies里面设置httponly标记,这样,JavaScript便无法接近cookie了。

13.内容安全策略(CSP)

CSP(Content Security Policy)是一个额外添加的安全层,它有助于检测和减轻某些类型的攻击,包括跨站脚本(XSS)和数据注入攻击。

通过HTTP header中的Content-Security-Policy方法来启动CSP。

示例

这样便会允许内容来自可信域或子域。

点击查看更多有关CSP示例。

14.跨站请求伪造(CSRF)

CSRF(Cross-Site Request Forgery)是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

示例:

执行上面这段代码的后果就是轻易删除用户配置文件。

如何预防:

要想阻止CSRF,你应该实现同步令牌模式(Synchronizer Token Pattern),幸运的是,Node社区已经帮你完成了这件事。长话短说,一起来看看它的工作原理:

  • 当一个GET请求被服务检查为CSRF令牌——如果不存在,就创建一个;
  • 当用户输入显示时,确保要添加一个隐形的CSRF令牌值;
  • 当发送表单时,确保值是来自表单并且要与session相匹配。

行动

开发者应该有所行动,制作一个Security Adventure车间来指导现实应用开发。

15.保护Express应用程序:Helmet

Helmet是一系列帮助增强Node之Express/Connect等Javascript Web应用安全的中间件。安全功能包括:

  • csp
  • crossdomain
  • xframe
  • xssfilter
  • 等等

有关Helmet更多内容,可以访问其托管地址:https://github.com/evilpacket/helmet。

16.使用工具

  • npm shrinkwrap:该命令可以给一个包的所有依赖关系上锁,并且创建一个npm-shrinkwrap.json文件。更多详情可以访问NPM。
  • retire.js:retire.js是一个命令行扫描器,帮助你找到你应用中依赖库存在的漏洞。

如果你想了解更多关于Node安全方面的内容,你可以关注Node Security项目。他们的目标是审核NPM中的每一个模块,发现问题并修复问题。

   
1063 次浏览       31
相关文章 相关文档 相关课程



深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程
最新活动计划
嵌入式软件架构设计 12-11[北京]
LLM大模型与智能体开发实战 12-18[北京]
嵌入式软件测试 12-25[北京]
AI原生应用的微服务架构 1-9[北京]
AI大模型编写高质量代码 1-14[北京]
需求分析与管理 1-22[北京]

Android手机开发(一)
理解Javascript
非典型ajax实践
彻底的Ajax
javascript 使用Cookies
使用 jQuery 简化 Ajax 开发
更多...   


Struts+Spring+Hibernate
基于J2EE的Web 2.0应用开发
J2EE设计模式和性能调优
Java EE 5企业级架构设计
Java单元测试方法与技术
Java编程方法与技术


某航空公司IT部 JavaScript实践
某电视软件 HTML5和JavaScript
中航信 JavaScript高级应用开发
大庆油田 web界面Ajax开发技术
和利时 使用AJAX进行WEB应用开发
更多...