Learn Node.js

这两天过了下《深入浅出Node.js》,记录下自己的理解。

PortScan

每次看一门语言都会去写个端口扫描器,其中可以学的到很多:模块编写/导入、网络 IO、并发控制、文件读写、命令行交互…

Node.js 版本的在:https://gist.github.com/chuhades/bceb5a9d27ac7056081ea90639855cf6

Node.js 的优劣

优点

  • 事件驱动
  • 原生异步
  • 分布式
  • 生态圈繁荣

因为这些优点,可以说 Node.js 就是为网络而生。借助 events.EventEmitter 可以很简单的实现事件驱动,用来做扫描器效果应该很好;)

npm 的存在使 Node.js 的生态圈极其繁荣,各种 package 都很齐全,开发者只需要 require; require ~

缺点

异步也带来了相应的缺点:callback hell。不过可以通过 Promise/Deferred 模式解决,PortScan 中我使用了 q 来做 Promise。

所以 Node.js 的典型应用场景:I/O 密集型;分布式应用。

至于计算任务可以通过 C++ 编写 module 解决。

可能的安全点

除了常规问题,个人感觉可能出现问题的点如下:

  • fake package

Node.js 对应第三方包的导入流程如下:

console.log(module.paths);

// output
[
  '/home/chu/Codz/learn_node/node_modules',
  '/home/chu/Codz/node_modules',
  '/home/chu/node_modules',
  '/home/node_modules',
  '/node_modules'
]

如果当前目录没有相应包,则自动去上级目录寻找,并且优先级高于全局包。这可能会带来相应的安全点:

⋊> ~/C/learn_node ls node_modules/
bagpipe/  commander/  netmask/  q-io/
⋊> ~/C/learn_node ls ../node_modules/
q/
⋊> ~/C/learn_node cat test.js
/**
 * Created by chu on 16-4-6.
 */

var Q = require("q");
⋊> ~/C/learn_node node test.js
faked package

// fake global
// 全局安装了 async
⋊> ~/C/learn_node ls node_modules/
async/  bagpipe/  commander/  netmask/  q-io/
⋊> ~/C/learn_node cat test.js
/**
 * Created by chu on 16-4-6.
 */

var async = require("async");
⋊> ~/C/learn_node node test.js
faked package async

可以用来留后门;)

  • npm 审核不严

npm 对用户提交缺乏审查机制,如果提交一个和知名包名字相近的包(Netmask -> netmask),用户错误输入就会导致安装恶意的包。造成代码执行。实例可以参考下:【社工】NodeJS 应用仓库钓鱼

References