2011-04-07 144 views
4

在每個人都告訴我不應該進行客戶端清理(我確實打算在客戶端執行它,但它也可以在SSJS中工作)之前,讓我澄清了我想要做的事情。基於JavaScript的X/HTML和CSS消毒

我想要的東西,類似於Google CajaHTMLPurifier,但對於JavaScript:基於白名單的安全方法,處理HTML和CSS(當然還沒有插入到DOM中,這將不安全,但首先獲得字符串形式),然後有選擇地過濾出不安全的標籤或屬性,忽略它們或將它們選擇性地包含爲轉義文本,或者以其他方式將它們報告給應用程序進行進一步處理,理想情況下在上下文中。如果它可以將任何JavaScript減少到一個安全的子集,就像在Google Caja中一樣,但是我知道這將會提出很多問題。我的用例訪問通過JSONP(維基處理前的Mediawiki維基數據,從而允許原始但不可信的XML/HTML輸入)獲得的不可信的XML/XHTML數據,並允許用戶對該數據進行查詢和轉換( XQuery,jQuery,XSLT等),利用HTML5允許脫機使用,IndexedDB存儲等,然後可以允許在用戶查看輸入源的同一頁面上預覽結果並構建或導入他們的查詢。

用戶可以生成他們想要的任何輸出,所以我不會對他們正在做的事情進行淨化 - 如果他們想在頁面中注入JavaScript,那麼所有的權力。但我希望保護那些想要有信心的用戶,他們可以添加能夠安全地從不受信任的輸入中複製目標元素的代碼,同時不允許他們複製不安全的輸入。

這應該是可行的,但我想知道是否有任何庫已經這樣做。

如果我卡住自己實現這一點(儘管我對這兩種情況都很好奇),我想證明是否使用innerHTML或DOM創建/附加BEFORE插入到文檔中是安全的辦法。例如,如果我第一次運行DOMParser或者使用瀏覽器HTML解析通過使用innerHTML將原始HTML附加到非插入的div,可以意外觸發事件嗎?我相信它應該是安全的,但不確定在插入之前DOM操作事件是否會以某種方式發生,這可能會被利用。

當然,構建好的DOM需要在該點之後進行消毒,但是我只想驗證我可以安全地構建DOM對象本身以便於遍歷,然後擔心會過濾掉不需要的元素,屬性和屬性值。

謝謝!

回答

1

ESAPI的目的是提供一個簡單的界面,以清晰,一致且易於使用的方式提供開發人員可能需要的所有安全功能。 ESAPI體系結構非常簡單,只是一組封裝大多數應用程序所需的關鍵安全操作的類。

OWASP ESAPI的JavaScript版本:http://code.google.com/p/owasp-esapi-js

輸入驗證極難有效地完成,HTML是容易的代碼和所有的時間數據最差的mashup,因爲有這麼多的可能的地方,放碼等許多不同的有效編碼。 HTML特別困難,因爲它不僅是分層的,而且還包含許多不同的解析器(XML,HTML,JavaScript,VBScript,CSS,URL等)。儘管輸入驗證非常重要,應始終執行,但它不是針對注入攻擊的完整解決方案。最好使用轉義作爲你的主要防禦。我以前沒有使用過HTML Purifier,但看起來不錯,他們肯定花了很多時間和思想。爲什麼不先使用他們的解決方案服務器端,然後再應用你想要的其他規則。我已經看到一些黑客只用[ ] ()的組合來編寫代碼。這裏有100多個示例XSS (Cross Site Scripting) Cheat SheetThe Open Web Application Security Project (OWASP)。有些事情要注意DOM based XSS Prevention Cheat Sheet

HTML淨化器捕獲這種混合編碼破解

<A HREF="h 
tt p://6&#9;6.000146.0x7.147/">XSS</A> 

而且隨着unicoded XSS這個DIV的背景圖像利用

<DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029"> 

的你在做什麼打擊了一下:所有70個可能的組合HTML和JavaScript中的字符「<」

< 
%3C 
&lt 
&lt; 
&LT 
&LT; 
&#60 
&#060 
&#0060 
&#00060 
&#000060 
&#0000060 
&#60; 
&#060; 
&#0060; 
&#00060; 
&#000060; 
&#0000060; 
&#x3c 
&#x03c 
&#x003c 
&#x0003c 
&#x00003c 
&#x000003c 
&#x3c; 
&#x03c; 
&#x003c; 
&#x0003c; 
&#x00003c; 
&#x000003c; 
&#X3c 
&#X03c 
&#X003c 
&#X0003c 
&#X00003c 
&#X000003c 
&#X3c; 
&#X03c; 
&#X003c; 
&#X0003c; 
&#X00003c; 
&#X000003c; 
&#x3C 
&#x03C 
&#x003C 
&#x0003C 
&#x00003C 
&#x000003C 
&#x3C; 
&#x03C; 
&#x003C; 
&#x0003C; 
&#x00003C; 
&#x000003C; 
&#X3C 
&#X03C 
&#X003C 
&#X0003C 
&#X00003C 
&#X000003C 
&#X3C; 
&#X03C; 
&#X003C; 
&#X0003C; 
&#X00003C; 
&#X000003C; 
\x3c 
\x3C 
\u003c 
\u003C 
+0

謝謝...此刻太忙了仔細觀察並驗證它是否仍然可以讓我將安全的HTML放入頁面,而不是轉義 - 因爲我的目的是允許重新整理查詢結果的HTML預覽,但似乎可能有所幫助。如果不是這樣,我真的認爲JavaScript需要這樣一個庫。我不想做任何不必要的往返行程,因爲這是針對離線應用的。謝謝! – 2011-04-14 18:35:32