谈谈对 URIEncode 的一些处理

最近斗志非常差,当然很大程度还是自己的锅……这又不是个情感博客我就不细说了……

这周公司里又开始做新的东西了,大概是类似于反向代理,但是授权了私有库的权限,需要做一些限制,比如 GitHub 路径限制为 dist

最初的时候我们这么验证路径:

// file: such as dist/test.js
!/^(dist|lib)\//ig.test(file)

然后我们发现这个方案不靠谱,GitHub 可以解析 dist/../src 于是又回到了最初的起点,就想着能不能排除 ..,为了装逼又改了一波:

/^(dist|lib)\/((?!\.\.).)*$/

然而我们发现并没有什么卵用妈蛋怎么和公司里写的不一样这个亲测可用……

后来想到了用 path.resolve 去解决,它会自动计算出默认值……

但是实际上我们的这个 path 并不仅仅可以是 /,有可能经过一次 encode,用户也可能耍流氓想要通过 encode 去绕过什么。

刚开始想的是根据 %25(即 %) 为特征进行 while 处理,但是这样万一玩脱是否会造成死循环,或者或者会过度浪费系统资源……

然后又试验了一波,GitHub 可以解析一次 encode 的结果,但是二次就不行了,利用这个结果我们可以使用一次 encodeURIComponent(file),这样相当于做了一个请求时必须为 / 的强约定,就可以省去考虑 N * decode 了。

接下来就可以用 path.resolve 后的结果做愉快的目录判断了。

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 知识, 代码段, 语法

添加新评论