2012-10-09 82 views
3

有一個用於清理數據的Node.js項目,並且有一個用於處理消毒以防止XSS的JavaScript的OWASP庫。我的應用程序不需要任何動態HTML(由用戶提交,bbtags或者其他任何不需要的),所以爲什麼不這樣做呢?爲什麼不這樣做呢?爲什麼不這樣做呢?爲什麼不這樣做呢?爲什麼不這樣做?這樣的:Javascript XSS預防

  1. 禁用「<」和「>」字,不能代替或什麼,只是禁用它們,如果用戶提交這些,給他們一個警告,這些被禁用(客戶端和服務器 - 側驗證)
  2. & =>&amp;
  3. " =>&quot;
  4. ' =>&#x27;
  5. / =>/
  6. 編碼提交的URL(GET參數等)
  7. 基於自我的申請XSS覆蓋
  8. DOM使用HTML5 pushState的和後端是完全與前端分開。

這將是足以保護自己,正如我所說,我的應用程序不需要用戶提交的任何HTML,所以我沒有在所有需要的<>標籤。

感謝所有的反饋,這是我用現在:

var pattern = /<(.*)>/; 

function hasHtmlTags(string) { 
    return pattern.test(string); 
}; 

if (hasHtmlTags(userData)) { 
    // Do something? 
} else { 
    // Create entity. 
} 

因此用戶仍然可以使用他們的表情:<和這樣的,而且功能只被觸發如果<和>組合被發現。所以沒有昂貴的正則表達式等,只是禁用<和>組合,我們應該沒問題。

+0

我明白了,但用戶不使用它是見於Ger.Offen,如果他們這樣做,他們是不是必需的。所以我想,爲什麼不放過這些矯枉過正和禁用它們。 – onlineracoon

+0

它應該是足夠的,[只要你指定你的字符編碼](https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#UTF-7_encoding)。 – user2428118

回答

4

這是一個普遍的編碼程序:

var lt = /</g, 
    gt = />/g, 
    ap = /'/g, 
    ic = /"/g; 
value = value.toString().replace(lt, "&lt;").replace(gt, "&gt;").replace(ap, "&#39;").replace(ic, "&#34;"); 

如果用戶沒有提交任何東西到你的服務器,你甚至不需要以上。如果用戶提交併且您正在使用用戶輸入,那麼上面應該是安全的。只要'<'和'>'全球消毒,括號也是你的好去處。

+0

用戶確實向服務器提交了東西,只是沒有'<' and '>'字符。如果將它們消毒成爲解決方案,那麼爲什麼會有一整套OWASP備忘單? https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting))_Prevention_Cheat_Sheet – onlineracoon

+0

@onlineracoon - 請參閱[本節](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#Why_Can .27t_I_Just_HTML_Entity_Encode_Untrusted_Data.3F)備忘錄 – Quentin

+2

owasp備忘錄涵蓋了XSS的所有可能場景。如果您不是在標籤的定義(不是內容)內或在腳本標籤內輸出數據,那麼您可以省略一大堆。 –

1

爲什麼不在發送數據到客戶端之前使用encodeURIComponent

var string="<script>...</script>"; 
string=encodeURIComponent(string); // %3Cscript%3E...%3C/script%3 
+1

[escape is deprecated](https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Functions?redirectlocale=zh-CN&redirectslug=Core_JavaScript_1.5_Guide%2FFunctions#escape_and_unescape_functions) – Quentin

+0

'+ 1' to把事情弄直。如果答案不是錯誤的**,沒有理由downvote。如果有更好的答案,他們將被提高。 – RASG

+1

答案是錯的。如果有人輸入'',他們不希望它被渲染爲'%3Cscript%3E ...%3C/script%3'。它將特殊字符壓入線噪聲。您可以通過丟棄絕對的所有輸入來阻止XSS,但這並不能解決問題。 – Quentin

0

考慮https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

這裏是他們的建議的實現:

function escapeOutput(toOutput){ 
    return toOutput.replace('&','&amp;').replace('<','&lt;').replace('>','&gt;').replace('"','&quot;').replace("'",'&#x27').replace('/','&#x2F'); 
} 

還要確保您使用此功能只在必要時,或者你可能打破一些東西。

但我建議你看一看已經取得庫sanatizing輸出:

https://github.com/ecto/bleach