簡體   English   中英

在Java Web應用程序中防止SQL注入攻擊和XSS的方法

[英]Ways to prevent SQL Injection Attack & XSS in Java Web Application

我正在編寫一個java類,它將由servlet過濾器調用,並檢查基於Struts的java Web應用程序的注入攻擊嘗試和XSS。 InjectionAttackChecker類使用regex和java.util.regex.Pattern類來根據regex中指定的模式驗證輸入。

話雖如此,我有以下問題:

  1. 應該阻止所有特殊字符和字符模式(例如<>, , - ,<=,==,> =)以防止注入攻擊。
  2. 是否存在我可以使用的現有正則表達式模式?
  3. 我必須在某些特定情況下允許一些特殊字符模式,一些示例值(允許)是(使用'pipe'|字符作為不同值的分隔符)* Atlanta | #654,BLDG 8#501 | 單純皰疹:慢性潰瘍(> 1個月持續時間)或支氣管炎,肺炎或食道炎 FUNC&COMP(date_cmp),“NDI&MALKP&HARS_IN(icd10,yes)”。 我應該采取什么策略,以便可以防止注入攻擊和XSS,但仍然允許這些字符模式。

我希望我已經清楚地提到了這個問題。 但如果我沒有,我道歉只是我的第二個問題。 如果需要澄清,請告訴我。

基於您的問題,我假設您正在嘗試過濾不良值。 我個人認為這種方法可以非常快速地變得非常復雜,並建議將編碼值作為替代方法。 以下是關於該主題的IBM文章,其中列出了兩種方法的優缺點, http://www.ibm.com/developerworks/tivoli/library/s-csscript/

要避免SQL注入攻擊,只需使用預准備語句而不是創建SQL字符串。

如果您嘗試清理輸入中的所有數據,那么您將面臨非常困難的時間。 有大量涉及字符編碼的技巧,這樣可以讓人們繞過你的過濾器。 這個令人印象深刻的列表只是SQL注入可以完成的一些無數事情。 您還必須防止HTML注入,JS注入以及其他可能的注入。 唯一確定的方法是對應用程序中使用的數據進行編碼。 對您寫入網站的所有輸出進行編碼,編碼所有SQL參數。 請特別注意后者,因為正常編碼不適用於非字符串SQL參數,如該鏈接中所述。 使用參數化查詢是完全安全的。 另請注意,理論上您可以在用戶輸入數據時對數據進行編碼並將其編碼存儲在數據庫中,但只有在您始終以使用該類型編碼的方式使用數據時(僅限HTML)編碼,如果它只會與HTML一起使用;如果它在SQL中使用,你就不會受到保護)。 這就是為什么經驗法則永遠不會將編碼數據存儲在數據庫中並始終在使用時編碼的部分原因。

驗證和綁定所有數據是必須的。 執行客戶端和服務器端驗證,因為10%的人在瀏覽器中關閉JavaScript。

傑夫阿特伍德有一個很好的博客關於這個主題,讓你了解它的復雜性。

這是一篇非常廣泛的文章

我不認為你在這里會有聖杯。 我還建議嘗試以某種標准方式對接收到的文本進行編碼/解碼(uuencode,base64)

不過濾或阻止值。

  1. 你應該確保在組合文本時你做正確的類型轉換:)即:如果你有一個字符串是HTML類型的字符串和一個TEXT類型的字符串你應該將TEXT轉換為HTML而不是盲目連接它們。 haskell中,您可以使用類型系統方便地執行此操作。

好的html模板語言默認會被轉義。 如果您正在生成XML / HTML,那么有時候使用DOM工具比使用模板語言更好。 如果你使用DOM工具,那么它會消除很多這些問題。 不幸的是,與模板相比,DOM工具通常是垃圾:)

  1. 如果你從用戶那里獲取HTML類型的字符串,你應該用庫清理它以刪除所有不好的標簽/屬性。 那里有很多好的白名單html過濾器。
  2. 你應該總是使用參數化查詢。 總是! 如果必須動態構建查詢,則使用參數動態構建它們。 不要將非SQL類型的字符串與SQL類型的字符串組合在一起。

看一下AntiSamy項目[www.owasp.org] 我認為這正是你想要的; 您可以設置過濾器來阻止某些標記。 他們還提供策略模板,slashdot策略將是一個良好的開端,然后添加您需要的標簽。

此外,www.osasp.org網站上有關於保護您的申請的豐富知識。

還應該執行用戶'nemo'關於使用預准備語句和編碼的說法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM