在Nodejs中验证并安全地提供youtube链接?

时间:2015-05-25 23:07:46

标签: node.js security youtube

我想允许用户发布嵌入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也是安全的,而不是附加到硬编码的网址上?

1 个答案:

答案 0 :(得分:0)

原则上,在提供服务之前,应检查整个href,而不仅仅是顶级主机。正如您在代码中看到的那样,正在解析url并提取路径。没有检查实际内容 - 因此不能对其安全性提出任何要求。

但在这种情况下,真正的保证是YouTube本身。人们可以放心地假设YouTube比大多数人更好地检测和删除上传到其服务器的恶意内容。所以最后一步有点多余 - 通过将主机与硬编码值进行比较来检查主机并不能确保任何事情 - 因为它总是会返回true(它可能因为 www。而抱怨前面但这不是问题)。也可以使用原始URL而不是将提取的路径名附加到硬编码的主机名。