我有一個我創建的小部件,並將其嵌入到其他使用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