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
- 《深入浅出Node.js》
- 【社工】NodeJS 应用仓库钓鱼