2012-07-02 76 views
5

目前我使用jQuery解決方案的此方法來清理可能的XSS攻擊中的字符串。Javascript消毒:插入可能的XSS html字符串的最安全的方法

sanitize:function(str) { 
    // return htmlentities(str,'ENT_QUOTES'); 
    return $('<div></div>').text(str).html().replace(/"/gi,'&quot;').replace(/'/gi,'&apos;'); 
} 

但我有一種感覺,它不夠安全。我想念什麼?

我試圖從phpjsヶ輛項目位置: http://phpjs.org/functions/htmlentities:425/

但它還挺竊聽並返回一些額外的特殊符號。也許這是一箇舊版本?

例如:

htmlentities('test"','ENT_QUOTES'); 

產地:

test&amp;quot; 

但應該是:

test&quot; 

你是如何通過JavaScript處理呢?

+0

你怎麼打算使用「消毒」字符串? – penartur

+0

作爲文本插入到html文件中。作爲HREF =「消毒」或SRC =「消毒」,或

sanitized
Somebody

+0

從哪裏插入被觸發?你想使用Javascript動態地將字符串插入到已經打開的頁面中,或者使用PHP插入到服務器生成的HTML文檔中? – penartur

回答

3

如果您的字符串應該是純文本而沒有HTML格式,只需使用.createTextNode(text) /分配給現有文本節點的.data屬性。無論你放什麼,總會被解釋爲文本,不需要額外的轉義。

+0

怎麼樣「或」和其他符號我可能不知道? – Somebody

+0

我寫了「無論」,它是「無所謂」的確,你會被操縱的DOM結構字段僅可以保持文本。這些操作永遠不會引起HTML解析器的任何自動魔法調用像著名'innerHTML'會做(這,順便說一句,仍然被認爲是一個該功能的最糟糕的設計缺陷)。 –

1

你應該引用其他字符太: ' 「 < > ( ) ; 他們都可以用於XSS attacsk

3

是動態使用JavaScript字符串來自不可信。源碼

然後你不需要手動清理它,用jQuery你可以寫

​var str = '<div>abc"def"ghi</div>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​'; 

​$​('test').text(str); 
$('test').attr('alt', str); 

瀏覽器將爲您分隔代碼中的數據。

例子:http://jsfiddle.net/HNQvd/

+0

雖然'alt'是安全的,但您仍然可能會遇到問題,可以將其解釋爲非文本屬性。最顯然'onclick'和其他處理程序,但也'src'。 –

+0

一切都可能被認爲是有害的。如果OP將改變任意屬性(使用用戶提供的名稱),那麼他們有更大的問題,而不僅僅是消毒值。 – penartur

+0

人。我的帖子中有一個工作解決方案。我只是想讓你的人,如果它在

HERE
內部使用有一些漏洞,就更新它。就這樣。 :) – Somebody