Node.js 的 URL 的模块

使用 url.parse() 函数转换

'https://www.yuque.com!.evil.com'
'https://www.yuque.com%0a.evil.com'


会变成:

'https://www.yuque.com/!.evil.com'
'https://www.yuque.com/%0a.evil.com'


可以看到 legacy API 并不认为 ! 字符属于域名的一部分,所以原始的 www.yuque.com!.evil.com 域名其实是非法的,而为了不抛异常,legacy API 尝试对它进行了一次转换,把它当成 www.yuque.com/!.evil.com 来处理,解析出来 hostname 为 www.yuque.com。这带来了一个严重的安全风险:恶意用户可以通过这样的域名来绕过我们的一些安全校验。例如 CORS 的校验中,我们会根据用户传递的 Origin 字段来判断用户的请求来源是否属于白名单域名中:


const origin = ctx.get('origin') || '';
const parsedUrl = url.parse(origin);
if (isSafeDomain(parsedUrl.hostname)) return origin;
return '';


所以,新项目直接不建议使用 legacy API,而应该使用 WHATWG API:

const myURL = new URL('https://example.org/?abc=123');
console.log(myURL.searchParams.get('abc'));
// Prints 123

myURL.searchParams.append('abc', 'xyz');
console.log(myURL.href);
// Prints https://example.org/?abc=123&abc=xyz

myURL.searchParams.delete('abc');
myURL.searchParams.set('a', 'b');
console.log(myURL.href);
// Prints https://example.org/?a=b


参考:

https://developer.mozilla.org/zh-CN/docs/Web/API/URLSearchParams

https://zhuanlan.zhihu.com/p/102338473

修改时间 2022-11-27

真诚赞赏,手留余香
赞赏
操作系统
Linux 中 top 命令的 Load Average 含义
2022-11-05
JavaScript,前端
JavaScript 检查 Date 是否为 Invalid Date
2022-11-07
ngtwewy
随机推荐
WordPress 获取当前主题文件夹的路径
Node.js 使用 Jest 和 supertest 做接口测试
Vue3 挂载全局方法
ReferenceError: __dirname is not defined in ES module scope
SQL 注入的生命力
Node.js 的 URL 的模块
MySQL 批量插入数据时如何解决重复问题
WordPress 按自定义排序的两种方法
WordPress 支持事务
uni-app 实现暗黑模式/夜间模式/深色模式/暗黑主题(DarkMode)的几种方法

微信联系我

夜间模式切换
回到顶部