我有一个我创建的小部件,并将其嵌入到其他使用iFrame的网站上。我想要做的是确保没有人能够查看源代码并复制iFrame代码并将其放在他们自己的网站上。保护iFrame - 只允许它在一个域上工作
我可以将应该允许的URL存储在数据库中。我已经看到它做过,一个网站有一个长的加密代码,如果它不匹配的域然后它说拒绝访问..
有谁知道我该怎么做到这一点?
谢谢!
我有一个我创建的小部件,并将其嵌入到其他使用iFrame的网站上。我想要做的是确保没有人能够查看源代码并复制iFrame代码并将其放在他们自己的网站上。保护iFrame - 只允许它在一个域上工作
我可以将应该允许的URL存储在数据库中。我已经看到它做过,一个网站有一个长的加密代码,如果它不匹配的域然后它说拒绝访问..
有谁知道我该怎么做到这一点?
谢谢!
不,你不能这样做。你能做的最好的事情是:
if (window.top.location.host != "hostname") {
document.body.innerHTML = "Access Denied";
}
添加上述到您的JavaScript,然后使用JavaSript obfuscator
我更正了你的DOM参考到'window.top.location.host' - 它将引用顶部框架(试图嵌入Widget的站点)的主机而不是'window.location.host',它将会提供小部件的主机。 – Cheekysoft
@Cheekysoft ohh谢谢我忘记了 – noob
当我将其添加到我的代码并查看它在Firebug中嵌入的站点时,我得到:“权限被拒绝访问属性'主机'” – Drew
在IFRAME中显示页面代码的服务器上,检查Referer
标头的值。除非由于隐私原因阻止此标头,否则它包含承载IFRAME的页面的URL。
推荐人很容易被欺骗。永远不要依赖它(或任何其他HTTP头) – Cheekysoft
当然可以,但某些任意的客户端浏览器不会欺骗。他并没有要求阻止人们查看他的来源,他只是想阻止人们将框架放在自己的网站上。 –
你所要求的几乎是不可能的。如果您在网络上提供源代码,则可以通过其他方式进行复制。任何JavaScript技巧都可以通过使用像wget或curl这样的低级工具来打败。
所以,即使你保护它,你仍然会发现有人可能在理论上复制代码(如浏览器会收到它),并且如果这样决定将它放在自己的网站上。
它*不可能阻止某人查看小部件是如何嵌入的,但如果小部件可以确定它已经被插入到某个不想要的位置,就不可能阻止小部件正常工作。 – Cheekysoft
@Cheekysoft我同意你可以使其无法操作,但这种解决方案不会为确定工作。这行代码可以很容易地通过使用file_get_contents的PHP文件运行,并将行用静态值替换为完全击败它。 –
非常好的一点;你是绝对正确的。如果小部件依靠通信回到母机上运行,那么这可以得到补救。把一些关键的功能放到你的服务器上,然后用XHR调用它,XHR必须确认相同的原始策略,否则如果有人改变并重新发布JS代码就会失败。 – Cheekysoft
你不能阻止人们看你的HTML,但也有一些头可以让你指定哪些网站可以嵌入您的iframe。看看X-Frame-Options
标题和frame-ancestors
指令Content-Security-Policy
。尊重它的浏览器将嵌入到其他人的网站时拒绝加载iframe。
我面临同样的问题,但我在主页上返回用户。我宣传了这个决定。
它必须放在那里是IFRAME
<script>
$(window).load(function() {
var timetoEnd = '';
var dstHost = 'YOUR-ALLOW-HOST';
var backToUrl = 'BACK-TO-URL';
function checkHost(){
var win = window.frames.YOUR-IFRAME-NAME;
win.postMessage('checkHost', dstHost);
console.log('msg Sended');
clearInterval(timetoEnd);
timetoEnd = setInterval(function() {
window.location.href = backToUrl;
}, 5000);
}
function validHost(event) {
if (event.data == 'checkHostTrue') {
clearInterval(timetoEnd);
console.log('checkHostTrue');
} else {
return;
}
}
window.addEventListener("message", validHost, false);
checkHost();
setInterval(function() {
checkHost();
}, 10000
);
});
</script>
它必须被放置到你的src iframe中绝对不可能的
<script>
function receiveMessage(event)
{
if(event.data=='checkHost'){
event.source.postMessage("checkHostTrue",
event.origin);
} else {
return;
}
}
window.addEventListener("message", receiveMessage, false);
</script>
许多阴影。 – rook
+1 @Rook。与Mech Software进行了一次交谈,让我认真思考它,但当然,你是完全正确的。 :-) – Cheekysoft