如何防止本身的頁面被別人利用iframe盜用(該頁面自己須要被本身頁面iframe嵌套)

前些天遇到一個問題,javascript

原本使用iframe嵌套在本身網頁裏的幾個小圖表(如下稱「被套頁」),被不良商家竊走,套在了他們的網頁中。java

因爲被套頁並無作反盜用措施,且頁面裏的數據很重要,因此須要嘗試一下反盜用。
跨域

目前上能查到的防止盜用的方法,不少的適應場景爲頁面自己不用於嵌套而作的,對於上述問題不太適用,所以還需另尋他法。瀏覽器

如下是解決思路:

首先想到的是,盜用者使用iframe嵌套,那麼個人頁面加載後可經過window.top查看外層頁面的地址,從而判斷是不是我本身的框架使用。
查看window.top.location,發現確實如此,盜用者的頁面能夠查看到地址的不一樣,那麼

if(window.top.location.hostname.search('10jqka.com.cn')===-1){//只容許本身的地址嵌套 
  // window.top.location.href='//stockpage.10jqka.com.cn/'+(getCode()||'')
}複製代碼
使用本地代理js文件進行測試,!失敗!

DOMException: "Permission denied to access property "hostname" on cross-origin object"複製代碼
瀏覽器提示代碼出錯!!
緣由是由於它們跨域(cross-domain)了,瀏覽器的安全政策不容許被嵌套者的網頁操做嵌套者的網頁,反之亦然。
IE把這種錯誤叫作"沒有權限"。進一步說,瀏覽器甚至不容許你查看top.location.hostname,跨域狀況下,一看到這個對象,就直接報錯。

那麼該如何修改呢?

對於上面的報錯,咱們能夠利用起來。
咱們只要查看top.location.hostname是否報錯就能夠了。若是報錯了,代表存在跨域,就對top對象進行URL重導向;若是不報錯,代表不存在跨域(或者未使用框架),就不採起操做。
劇情彷佛漸漸明朗了起來。

try{  top.location.hostname;}catch(e){  top.location.href = window.location.href;}複製代碼
這樣作應當能夠正確重定向,
可是,部分瀏覽器默認禁止重定向,甚至不會彈出確認按鈕
所以能夠換成另外一種解決辦法 

try{  
  top.location.hostname;
}catch(e){  
  document.getElementsByTagName('body')[0].innerHTML='股票實時行情,歡迎點擊進入同花順查詢:<a target="_blank" href="'+'http://stockpage.10jqka.com.cn/'+'">'+'http://stockpage.10jqka.com.cn/'+'</a>'
}複製代碼
放到嵌套者網頁看,ok
放到本身網頁看,

竟然也走進了catch??

緣由是:本身網頁的domain和iframe的domain不相同。須要讓兩個頁面的domain保持徹底相同('music.baidu.com'和'www.baidu.com'和'baidu.com'都是不相同的)

首先要將二者保持一致,而後再執行上述方案。安全

document.domain='10jqka.com.cn'; 複製代碼

 搞定!
bash

相關文章
相關標籤/搜索