2010-04-19 90 views
1

我有一個包含轉義HTML的JavaScript變量。有可能是內部的HTML腳本標記,像這樣:IE中的Javascript HTML和腳本注入問題

var valueToInsert = "%3Cscript%20type%3D%22text/javascript%22%3Ealert%28%27test%27%29%3B%3C/script%3E%0A%3Cscript%20type%3D%22text/javascript%22%20src%3D%22http%3A//devserver/testinclude.js%22%3E%3C/script%3E%0A%3Cimg%20src%3D%22http%3A//www.footballpictures.net/data/media/131/manchester_united_logo.jpg%22%20/%3E" 

我希望把這段DOM,並獲得預期解僱所有的JavaScript。現在我正在使用這種方法:

var div = document.createElement("div"); 
div.innerHTML = unescape(valueToInsert); 
document.body.appendChild(div); 

在IE中,當我設置div.innerHTML - 所有腳本標記被刪除。

如果我使用jQuery和做到這一點:

$(document.body).append(valueToInsert) 

這一切工作正常。糟糕的是,我無法使用jQuery,因爲這些代碼將被添加到網站中,我無法控制使用一些「已實施」的腳本。

有人有一招嗎?如果jQuery能做到這一點,它一定是可能的?

我在Opera中遇到了另一個問題。我改變注射腳本是這樣的:(仍然在IE中不起作用)

var div = document.createElement("div"); 
    div.innerHTML = unescape(valueToInsert); 
    var a = new Array(); 

    for (var i = 0; i < div.childNodes.length; i++) 
     a.push(div.childNodes[i]); 

    for (var i = 0; i < a.length; i++) 
    { 
     if (a[i].nodeName == "SCRIPT" && a[i].getAttribute("src") != null && a[i].getAttribute("src") != "" && typeof (a[i].getAttribute("src")) != "undefined") 
     { 
      var scriptTag = document.createElement("script"); 
      scriptTag.src = a[i].getAttribute("src"); 
      scriptTag.type = "text/javascript"; 
      document.body.appendChild(scriptTag); 
     } 
     else if (a[i].nodeName == "SCRIPT") 
     { 
      eval(a[i].innerHTML); 
     } 
     else 
     { 
      document.body.appendChild(a[i]); 
     } 
    } 

回答

0

我認爲你需要使用document.write來代替。

+1

不能這樣做,因爲它在頁面渲染後執行時會清除頁面。 – MartinHN 2010-04-19 13:37:18

3

分析的jQuery做什麼之後,我看到他們在前面加上一個小的虛擬文本,並再次刪除它:

var div = document.createElement("div"); 
div.innerHTML = "removeMe" + unescape(valueToInsert); 
div.removeChild(div.childNodes[0]); 
document.body.appendChild(div); 

而在FF,IE,Chrome瀏覽器,Opera和Safari完美的作品。