我想允许用户发布嵌入youtube链接并将其显示在我的nodejs应用中。
Node提供了一种解析网址的便捷方式:
var url = require('url');
var youtube = url.parse("https://www.youtube.com/embed/eisKxhjBnZ0");
console.log(youtube);
/*
{ protocol: 'https:',
slashes: true,
auth: null,
host: 'www.youtube.com',
port: null,
hostname: 'www.youtube.com',
hash: null,
search: null,
query: null,
pathname: '/embed/eisKxhjBnZ0',
path: '/embed/eisKxhjBnZ0',
href: 'https://www.youtube.com/embed/eisKxhjBnZ0' }
*/
我打算检查host
以确保源链接确实来自官方Youtube,然后将pathname
保存到数据库。当用户请求页面时,我会通过拼凑硬编码的网址信息+路径名来加载视频:
即
// Verify Youtube source link
if (youtube.host == 'www.youtube.com') {
saveToDB(youtube.pathname);
}
// ... Later ...
<iframe src="https://www.youtube.com" + video.pathname></iframe>
这是一种从youtube上提供嵌入式视频的安全方式吗?另外,只检查host
,但是服务整个href
也是安全的,而不是附加到硬编码的网址上?
答案 0 :(得分:0)
原则上,在提供服务之前,应检查整个href,而不仅仅是顶级主机。正如您在代码中看到的那样,正在解析url并提取路径。没有检查实际内容 - 因此不能对其安全性提出任何要求。
但在这种情况下,真正的保证是YouTube本身。人们可以放心地假设YouTube比大多数人更好地检测和删除上传到其服务器的恶意内容。所以最后一步有点多余 - 通过将主机与硬编码值进行比较来检查主机并不能确保任何事情 - 因为它总是会返回true(它可能因为 www。而抱怨前面但这不是问题)。也可以使用原始URL而不是将提取的路径名附加到硬编码的主机名。