Express框架路由层错误处理

Express 框架

Express框架是基于Node.js的Web框架,由于js的特殊性,Express还在使用Promise或者原生callback

因为Node.js的众多优秀特性例如单线程,异步,事件驱动,使得Express框架异常轻量高效。

问题出现

现在ES6使用asyncawait来方便的执行异步语句,使用try{}catch(e){}来捕捉错误,而Express还在使用Promise或者原生callback执行异步操作。这样混合会造成很多隐患。

对于Express框架而言,未捕捉到的错误会直接卡死整个Node进程,造成拒绝服务,不能正确的抛出500错误。

由于Node.js的特殊性,单线程卡死等于整个Node进程死了。更加蛋疼的是,由于Promise,没有catch的会卡在事件循环中,不会正常停止,而会一直拒绝服务。

问题解决

Mark一下解决方法,这里是路由层的代码。

// handle uncaughtExpection
const Layer = require('express/lib/router/layer');

Object.defineProperty(Layer.prototype, 'handle', {
  enumerable: true,
  get() {
    return this.__handle;
  },
  set(fn) {
    if (fn.length === 4) {
      this.__handle = fn;
    } else {
      this.__handle = (req, res, next) =>
        Promise.resolve(fn(req, res, next)).catch(next);
    }
  },
});

将这段代码加在任意一个路由文件中即可正常的抛出500错误了。

LCTF Web Travel复现

关于比赛

这场CTF可以说打的非常怀疑人生了,上次护网杯还能挖点东西出来,这次可以说是被按在地上摩擦,毫无游戏体验。。。

看了大神的WP才发现还有这么多东西,Web题还能这么玩。。

Let’s Encrypt泛域名SSL证书申请

为什么要用 SSL

HTTPS是HTTP的加密协议。使用HTTPS协议可以防止中间人攻击,防止网络流量包被窃听。
讲得简单点,就是可以保护客户端数据在发送至服务器端时的安全性。
同时也可以验证网站服务端的身份。

不仅如此,新一代HTTP/2协议也是建立在HTTPS之上的。想要客户端和服务端使用HTTP/2协议必须使用HTTPS协议进行传输。

更现实的问题是,Chrome已经将所有HTTP协议的站点都标记为了不安全。。。

记令人蛋碎的修服务器经历

先说说 Vultr

充5刀送25刀,最适合我这种穷苦人了,于是义无反顾的入坑了
讲道理 Vultr 还是不错的,很多自定义功能,譬如逆向 DNS 解析,自定义ISO引导等等,可以说是相当良心了
但是 Vultr 有个蜜汁问题我一直没想通

CPU满载一段时间后ssh会挂,重启也不能解决问题

Docker 1.12 配置 direct-lvm

概念

Device Mapper

Docker 最先是跑在 Ubuntu 和 Debian 上的,使用 aufs 存储器。由于 Docker 越来越流行,许多公司希望在 RHEL 上使用,但是上游内核中没有包括 aufs,所以 RHEL 不能使用 aufs。最终开发者们开发了一个新的后端存储引擎 Device Mapper,基于已有的 Device Mapper 技术,并且使 Docker 支持可插拔,现在全世界有很多真实案例在生产环境使用 Device Mapper。