Java項目的安全開發一般需要注意以下8個方面的規范:
- 輸入驗證;
- 對于用戶輸入項進行數據驗證,除常見的數據格式、數據長度外,還需要對特殊的危險字符進行處理。特殊字符包括 < > “ ‘ % ( ) & + ‘ “等;
- 對于核心業務功能,除在客戶端或瀏覽器進行數據驗證外,還必須在服務器端對數據進行合法性檢驗,規避用戶跳過客戶端校驗,直接將不合規的數據保存到應用中;
- 對于瀏覽器重定向地址的數據,需要進行驗證核實,確認重定向地址是否在可信,并且需要對換行符(r或n)進行移除或者替換。
- 數據輸出;
- 對需要輸出到用戶瀏覽器的任何由用戶創造的內容,應在輸出到瀏覽器之前或持久化存儲之前進行轉義(至少對<>轉義為< >)以防止跨站攻擊腳本(XSS)。對于無法規避的HTML片段提交,需對
script、iframe標簽進行檢查處理,避免應用被掛馬的可能性; - 在程序中應盡量規避SQL的拼接處理,優先推薦使用iBatis/MyBaits框架,其次推薦使用SQL的參數化查詢方法,在無法避免使用SQL拼接時,因對SQL參數值進行編碼處理(至少對單引號進行編碼)。
- 會話管理;
- 不要在 URL、錯誤信息或日志中暴露會話標識符。會話標識符應當只出現在HTTP cookie頭信息中。比如,不要將會話標識符以 GET參數進行傳遞;
- 將cookie設置為HttpOnly屬性,除非在應用程序中明確要求了客戶端腳本程序讀取或者設置 cookie的值;
- 從Cookie或者Session中獲取之前保存的數據進行應用時,須增加必要的數據檢驗;
- 對于敏感的業務操作,通過在每個請求或每個會話中使用強隨機令牌或參數,為高度敏感或關鍵的操作提供標準的會話管理。
- 訪問控制;
- 應用必須具備授權訪問控制功能,能夠限制在最小的范圍內使用系統功能。同時限制只有授權的用戶可以訪問受保護的URL。
- 文件管理;
- 在文件上傳處理中,應限制符合要求格式的文件,盡量避免用戶直接上傳可執行文件或在服務器端限制可執行文件的執行權限;
- 在文件下載時,應規避直接列舉服務器上的文件,同時規避將服務器端的路徑作為參數進行傳遞,避免用戶非法獲取服務器端文件。
- 數據加密;
- 原則上在程序代碼中不能直接寫入用戶和密碼,對于無法規避的情況,應當對使用的用戶名、密碼進行加解密處理,在程序中使用加密后的內容。
- 錯誤處理;
- 不要在錯誤響應將服務器的信息暴露給最終用戶,例如:服務器的IP地址、操作系統的類型和版本、會話標識符、賬號信息等,從而避免增加服務端被黑客攻擊的可能性;
- 在錯誤處理時,因在后臺統一進行日志記錄,避免顯示調試或堆棧跟蹤信息,建議使用通用的錯誤消息并使用定制的錯誤頁面。
- 其它通用規范;
- 審核應用使用的第三方開發框架、第三方代碼或類庫文件,以確定業務的需要,并驗證功能的安全性,避免產生新的漏洞;
- 執行安全更新。如果應用程序采用自動更新,則為您的代碼使用加密簽名,以確保的您的下 載客戶端驗證這些簽名。使用加密的信道傳輸來自主機服務器的代碼。
Java項目的安全開發一般需要注意以下這些方面的規范:
輸入驗證:對于用戶輸入項進行數據驗證,除常見的數據格式、數據長度外,還需要對特殊的危險字符進行處理。對于核心業務功能,除在客戶端或瀏覽器進行數據驗證外,還必須在服務器端對數據進行合法性檢驗,規避用戶跳過客戶端校驗,直接將不合規的數據保存到應用中;對于瀏覽器重定向地址的數據,需要進行驗證核實,確認重定向地址是否在可信,并且需要對換行符(r或n)進行移除或者替換。
數據輸出:對需要輸出到用戶瀏覽器的任何由用戶創造的內容,應在輸出到瀏覽器之前或持久化存儲之前進行轉義(至少對<>轉義為< >)以防止跨站攻擊腳本(XSS)。對于無法規避的HTML片段提交,需對
script、iframe標簽進行檢查處理,避免應用被掛馬的可能性;在程序中應盡量規避SQL的拼接處理,優先推薦使用iBatis/MyBaits框架,其次推薦使用SQL的參數化查詢方法,在無法避免使用SQL拼接時,因對SQL參數值進行編碼處理(至少對單引號進行編碼)。會話管理:不要在 URL、錯誤信息或日志中暴露會話標識符。會話標識符應當只出現在HTTP cookie頭信息中。比如,不要將會話標識符以 GET參數進行傳遞;將cookie設置為HttpOnly屬性,除非在應用程序中明確要求了客戶端腳本程序讀取或者設置 cookie的值;從Cookie或者Session中獲取之前保存的數據進行應用時,須增加必要的數據檢驗;對于敏感的業務操作,通過在每個請求或每個會話中使用強隨機令牌或參數,為高度敏感或關鍵的操作提供標準的會話管理。
訪問控制:應用必須具備授權訪問控制功能,能夠限制在最小的范圍內使用系統功能。同時限制只有授權的用戶可以訪問受保護的URL。
文件管理:在文件上傳處理中,應限制符合要求格式的文件,盡量避免用戶直接上傳可執行文件或在服務器端限制可執行文件的執行權限;在文件下載時,應規避直接列舉服務器上的文件,同時規避將服務器端的路徑作為參數進行傳遞,避免用戶非法獲取服務器端文件。
數據加密:原則上在程序代碼中不能直接寫入用戶和密碼,對于無法規避的情況,應當對使用的用戶名、密碼進行加解密處理,在程序中使用加密后的內容。
錯誤處理:不要在錯誤響應將服務器的信息暴露給最終用戶,例如:服務器的IP地址、操作系統的類型和版本、會話標識符、賬號信息等,從而避免增加服務端被黑客攻擊的可能性;在錯誤處理時,因在后臺統一進行日志記錄,避免顯示調試或堆棧跟蹤信息,建議使用通用的錯誤消息并使用定制的錯誤頁面。
其它通用規范:審核應用使用的第三方開發框架、第三方代碼或類庫文件,以確定業務的需要,并驗證功能的安全性,避免產生新的漏洞;執行安全更新。如果應用程序采用自動更新,則為您的代碼使用加密簽名,以確保的您的下 載客戶端驗證這些簽名。使用加密的信道傳輸來自主機服務器的代碼。
以下為大家介紹的基本規則,可以為構建更安全的Java應用程序奠定良好的基礎。供參考學習!
Java安全規則1:編寫簡單而強大的Java代碼
漏洞喜歡隱藏在復雜代碼中,因此在不犧牲功能的情況下使代碼盡可能簡單。在代碼中公開盡可能少的信息,隱藏實施細節,支持可維護和安全的代碼。下面三個技巧將大大有助于編寫安全的Java代碼:充分利用 Java的訪問修飾符。為類,方法及其屬性聲明訪問級別,可以設為private的所有內容都應該為private。避免過度使用反射和內省。在某些情況下,應該使用這種高級技術,但是在大多數情況下,您應該避免使用它們。使用反射消除了強類型化,可能會給代碼引入漏洞和不穩定性。將類名與字符串進行比較容易出錯,并且很容易導致名稱空間沖突。始終定義盡可能小的API和接口。解耦組件并使它們在盡可能小的區域內交互。即使您的應用程序的某個區域出現漏洞,其他區域也將是安全的。
Java安全規則2:避免使用Java自帶的序列化
序列化接受遠程輸入,并將其轉換為完全賦值的對象。它省去了構造函數和訪問修飾符,并允許未知數據流成為JVM中的運行代碼。Java序列化從根本上來說是不安全的。Oracle就有長期計劃 從Java中刪除自帶的序列化功能,甲骨文公司Java平臺小組的首席架構師Mark Reinhold說,Java漏洞中的三分之一或更多都涉及到序列化的問題。盡可能避免在Java代碼中使用自帶的序列化/反序列化。可以考慮使用JSON或YAML之類的序列化格式,并且永遠不要公開接收并作用于序列化流的不受保護的網絡請求端點。
Java安全規則3:永遠不要公開未加密的憑證或PII
很多的應用,當用戶在瀏覽器中輸入密碼時,密碼將以純文本格式發送到您的服務器。正確的做法是:先通過單向密碼對密碼進行加密,然后再將其持久保存到數據庫中,然后在每次與該值進行比較時再次進行加密保存。密碼規則適用于所有個人身份信息(PII):信用卡,社會保險號等。委托給您應用程序的任何個人信息都應得到最高程度的保護。數據庫中未加密的憑據或PII是一個巨大的安全漏洞,正在等待攻擊者發現。同樣,切勿將原始憑據寫入日志,或以其他方式傳輸到文件或網絡。密碼與密鑰分開保存。
Java安全規則4:使用已知和經過測試的庫
盡可能使用已知的可靠庫和框架。從密碼哈希到REST API授權,都要謹慎的選擇第三方庫。對于web應用程序安全性,Spring Security已經是事實上的標準。它提供了廣泛的選擇和靈活性,以適應任何應用程序體系結構,并且融合了多種安全方法。
Java安全規則5:不要對外部輸入抱有幻想
無論是來自用戶輸入表單,數據存儲區還是遠程API,對于任何外部輸入都不要放松警惕。SQL注入和跨站點腳本(XSS)是由于處理外部輸入錯誤而引起的最常見攻擊。每當您收到輸入時,都應該對其進行檢查和校驗。
Java安全規則6:始終使用PreparedStatement來處理SQL參數
每當您構建一條SQL語句時,都有可能被插入一段可執行的SQL代碼。始終使用java.sql.PreparedStatement類創建SQL是一個好習慣。對于NoSQL存儲(如MongoDB)也存在類似的功能。絕大部分的ORM框架,都支持該功能。
Java安全規則7:不要向用戶展示服務異常信息
生產中的服務異常信息可以為攻擊者提供豐富的信息來源。堆棧跟蹤尤其可以揭示有關您正在使用的技術及其使用方式的信息。避免向最終用戶顯示堆棧跟蹤信息,這非常重要。
Java安全規則8:使安全性發布保持最新
通過定期檢查Oracle主頁以獲取security-alerts確保知道可用的重要補丁程序 。每個季度,Oracle都會為Java的當前LTS(長期支持)版本提供一個自動補丁更新。問題是,只有在您購買Java支持許可證的情況下,該補丁才可用。
Java安全規則9:查找依賴庫漏洞
有許多工具可以自動掃描您的代碼庫和依賴項是否存在漏洞。OWASP(開放式Web應用程序安全性項目)是致力于改善代碼安全性的組織。OWASP的值得信賴的高質量自動代碼掃描工具列表 ,包括多個面向Java的安全檢查工具。
Java安全規則10:監視和記錄用戶活動
如果您沒有積極地監視應用程序運行狀態,那么即使是簡單的暴力攻擊也可能會成功攻陷你的app。使用監視和日志記錄工具來監視應用程序的運行狀況。監視可以提醒您注意到無法被解釋的峰值,而日志記錄可以幫助您了解攻擊后出了什么問題。
Java安全規則11:當心DoS攻擊
每當要執行消耗資源的的操作(例如將壓縮文件解壓縮)時,都應該監視資源使用量的增長。對其進行監視,并防止服務器資源過度使用,以及更多的自動化的應急響應方案。
Java安全規則12:考慮使用Java安全管理器
Java有一個安全管理器,可用于限制正在運行的進程可以訪問的資源。它可以根據磁盤,內存,網絡和JVM訪問來隔離程序。縮小對應用程序的這些資源的過度占用,可以減少攻擊可能造成的危害。
以下為大家介紹的基本規則,可以為構建更安全的Java應用程序奠定良好的基礎。供參考學習!
Java安全規則1:編寫簡單而強大的Java代碼
漏洞喜歡隱藏在復雜代碼中,因此在不犧牲功能的情況下使代碼盡可能簡單。在代碼中公開盡可能少的信息,隱藏實施細節,支持可維護和安全的代碼。下面三個技巧將大大有助于編寫安全的Java代碼:充分利用 Java的訪問修飾符。為類,方法及其屬性聲明訪問級別,可以設為private的所有內容都應該為private。避免過度使用反射和內省。在某些情況下,應該使用這種高級技術,但是在大多數情況下,您應該避免使用它們。使用反射消除了強類型化,可能會給代碼引入漏洞和不穩定性。將類名與字符串進行比較容易出錯,并且很容易導致名稱空間沖突。始終定義盡可能小的API和接口。解耦組件并使它們在盡可能小的區域內交互。即使您的應用程序的某個區域出現漏洞,其他區域也將是安全的。
Java安全規則2:避免使用Java自帶的序列化
序列化接受遠程輸入,并將其轉換為完全賦值的對象。它省去了構造函數和訪問修飾符,并允許未知數據流成為JVM中的運行代碼。Java序列化從根本上來說是不安全的。Oracle就有長期計劃 從Java中刪除自帶的序列化功能,甲骨文公司Java平臺小組的首席架構師Mark Reinhold說,Java漏洞中的三分之一或更多都涉及到序列化的問題。盡可能避免在Java代碼中使用自帶的序列化/反序列化。可以考慮使用JSON或YAML之類的序列化格式,并且永遠不要公開接收并作用于序列化流的不受保護的網絡請求端點。
Java安全規則3:永遠不要公開未加密的憑證或PII
很多的應用,當用戶在瀏覽器中輸入密碼時,密碼將以純文本格式發送到您的服務器。正確的做法是:先通過單向密碼對密碼進行加密,然后再將其持久保存到數據庫中,然后在每次與該值進行比較時再次進行加密保存。密碼規則適用于所有個人身份信息(PII):信用卡,社會保險號等。委托給您應用程序的任何個人信息都應得到最高程度的保護。數據庫中未加密的憑據或PII是一個巨大的安全漏洞,正在等待攻擊者發現。同樣,切勿將原始憑據寫入日志,或以其他方式傳輸到文件或網絡。密碼與密鑰分開保存。
Java安全規則4:使用已知和經過測試的庫
盡可能使用已知的可靠庫和框架。從密碼哈希到REST API授權,都要謹慎的選擇第三方庫。對于web應用程序安全性,Spring Security已經是事實上的標準。它提供了廣泛的選擇和靈活性,以適應任何應用程序體系結構,并且融合了多種安全方法。
Java安全規則5:不要對外部輸入抱有幻想
無論是來自用戶輸入表單,數據存儲區還是遠程API,對于任何外部輸入都不要放松警惕。SQL注入和跨站點腳本(XSS)是由于處理外部輸入錯誤而引起的最常見攻擊。每當您收到輸入時,都應該對其進行檢查和校驗。
Java安全規則6:始終使用PreparedStatement來處理SQL參數
每當您構建一條SQL語句時,都有可能被插入一段可執行的SQL代碼。始終使用java.sql.PreparedStatement類創建SQL是一個好習慣。對于NoSQL存儲(如MongoDB)也存在類似的功能。絕大部分的ORM框架,都支持該功能。
Java安全規則7:不要向用戶展示服務異常信息
生產中的服務異常信息可以為攻擊者提供豐富的信息來源。堆棧跟蹤尤其可以揭示有關您正在使用的技術及其使用方式的信息。避免向最終用戶顯示堆棧跟蹤信息,這非常重要。
Java安全規則8:使安全性發布保持最新
通過定期檢查Oracle主頁以獲取security-alerts確保知道可用的重要補丁程序 。每個季度,Oracle都會為Java的當前LTS(長期支持)版本提供一個自動補丁更新。問題是,只有在您購買Java支持許可證的情況下,該補丁才可用。
Java安全規則9:查找依賴庫漏洞
有許多工具可以自動掃描您的代碼庫和依賴項是否存在漏洞。OWASP(開放式Web應用程序安全性項目)是致力于改善代碼安全性的組織。OWASP的值得信賴的高質量自動代碼掃描工具列表 ,包括多個面向Java的安全檢查工具。
Java安全規則10:監視和記錄用戶活動
如果您沒有積極地監視應用程序運行狀態,那么即使是簡單的暴力攻擊也可能會成功攻陷你的app。使用監視和日志記錄工具來監視應用程序的運行狀況。監視可以提醒您注意到無法被解釋的峰值,而日志記錄可以幫助您了解攻擊后出了什么問題。
Java安全規則11:當心DoS攻擊
每當要執行消耗資源的的操作(例如將壓縮文件解壓縮)時,都應該監視資源使用量的增長。對其進行監視,并防止服務器資源過度使用,以及更多的自動化的應急響應方案。
Java安全規則12:考慮使用Java安全管理器
Java有一個安全管理器,可用于限制正在運行的進程可以訪問的資源。它可以根據磁盤,內存,網絡和JVM訪問來隔離程序。縮小對應用程序的這些資源的過度占用,可以減少攻擊可能造成的危害。