使用 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
修改时间 2024-05-29
声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。