我有一个包含聊天的meteor.js应用。我们需要允许用户从youtube和soundcloud发布嵌入代码。安全。
我使用djedi:sanitize-html-client来清理用户输入,而不是包含" youtube"和" soundcloud.com"
因此,对于YouTube,我使用了该用户输入字符串,例如
<iframe width="560" height="315" src="https://www.youtube.com/embed/B65pLsah3XE" frameborder="0" allowfullscreen></iframe>
&#13;
,然后将其拆分为空格,并使用此RegEx循环遍历数组以查找有效的URL:
var pattern = new RegExp("(http|ftp|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?");
&#13;
之后,如果找到了有效的网址,我会在代码中重建iframe html,按常规插入到Mongo中,并在聊天窗口中显示。这部分正在运作。
但是这种方法对于soundcloud嵌入代码不起作用,例如:
<iframe width="100%" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/227010461&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true"></iframe>
&#13;
RegEx在该soundcloud iframe代码中找不到匹配项。
所以,我的问题是:我如何从soundcloud embed html中注册这两个网址,或者在Meteor.js中是否有一种安全的方式来允许嵌入iframe。
答案 0 :(得分:1)
你可以使用这个JS代码:
var getHostname = function(href) {
var l = document.createElement("a");
l.href = href;
return l.hostname;
};
并在您的代码中使用它:
getHostname("https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/227010461&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true")
返回:
“w.soundcloud.com”