2011-11-29 102 views
8

我正在測試我自己的代碼的xss攻擊。下面的示例是一個簡單的框,用戶可以輸入任何他想要的內容。按下「測試!」後按鈕,JS會顯示輸入的字符串分爲兩個divs.This是我作出更好的解釋我的問題的例子:html()vs innerHTML jquery/javascript和XSS攻擊

<html> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script type="text/javascript"> 
    function testIt(){ 
     var input = document.getElementById('input-test').value; 
     var testHtml = document.getElementById('test-html'); 
     var testInnerHTML = document.getElementById('test-innerHTML'); 
     $(testHtml).html(input); 
     testInnerHTML.innerHTML = input; 
    } 
</script> 
<head>this is a test</head> 
<body> 
    <input id="input-test" type="text" name="foo" /> 
    <input type="button" onClick="testIt();" value="test!"/> 
    <div id="test-html"> 
    </div> 
    <div id="test-innerHTML"> 
    </div> 
</body> 

,如果你試圖將它複製到一個.html文件並運行它,它會正常工作,但是如果您嘗試輸入<script>alert('xss')</script>,則只會引發一個警告框:`test-html'div(帶有html()函數)內的警告框。

我真的不明白,爲什麼發生這種情況,而且,檢查與螢火蟲的代碼給了我這樣的結果(注後腳本)

<body> 
this is a test 
<input id="input-test" type="text" name="foo"> 
<input type="button" value="test!" onclick="testIt();"> 
<div id="test-html"> </div> 
<div id="test-innerHTML"> 
    <script> 
    alert('xss') 
    </script> 
</div> 
</body> 

,你可以看到test-html格是空的, test-innerhtml div包含腳本。有人能告訴我爲什麼嗎?是因爲html()對腳本注入或類似的東西更安全嗎?

在此先感謝,最好的問候。

+2

你不必擔心安全的用戶類型,因爲他們試圖插入的任何腳本都將只有af在那個時候對他們產生了影響。你需要擔心的是當輸入的文本被提交到你的web服務器時會發生什麼 - 如果你將它存儲在數據庫中,你需要確保你不會盲目地將輸入的文本連接到SQL的末尾查詢。如果您以後返回以前輸入的文本,則需要確保輸入的值已被轉義,以便例如「

0

是jQuery文檔不會渲染腳本標籤

,但它是不是更安全 ,因爲你可以使用許多其它XSS有效載荷,如<a href>風格,表達等。

+0

它*更安全,它不是*完全*安全的,不應該依賴它。 – Mario

+0

是的我猜這是真的,但安全不是這個詞,讓我們只是認爲它是不容易的,然後innerHTML。 – Ben

+0

實際上,** jQuery所做的更容易被利用**,因爲當jQuery發現'