漏洞喜歡隱藏在復(fù)雜性中,因此在不犧牲功能的情況下使代碼盡可能簡(jiǎn)單。使用成熟的設(shè)計(jì)原則(例如DRY)(不要重復(fù)),將幫助您編寫更易于查看問題的代碼。
始終在代碼中公開盡可能少的信息。隱藏實(shí)施細(xì)節(jié)支持可維護(hù)和安全的代碼。這三個(gè)技巧將大大有助于編寫安全的Java代碼:
- 充分利用Java的訪問修飾符。知道如何為類,方法及其屬性聲明不同的訪問級(jí)別將大大保護(hù)代碼。可以設(shè)為私有的所有內(nèi)容都應(yīng)該為私有的。
- 避免反射。在某些情況下,應(yīng)該使用這種高級(jí)技術(shù),但是在大多數(shù)情況下,您應(yīng)該避免使用它們。使用反射消除了強(qiáng)類型,而強(qiáng)類型可能會(huì)給您的代碼帶來弱點(diǎn)和不穩(wěn)定性。將類名與字符串進(jìn)行比較很容易出錯(cuò),并且很容易導(dǎo)致名稱空間沖突。
- 始終定義盡可能小的API和界面。解耦組件并使它們?cè)诒M可能小的區(qū)域內(nèi)交互。即使應(yīng)用程序的某個(gè)區(qū)域感染了漏洞,其他區(qū)域也將是安全的。
Java安全性規(guī)則2:避免序列化
這是另一個(gè)編碼技巧,但重要的是要成為一個(gè)規(guī)則。 序列化接受遠(yuǎn)程輸入,并將其轉(zhuǎn)換為完全賦值的對(duì)象。 它省去了構(gòu)造函數(shù)和訪問修飾符,并允許未知數(shù)據(jù)流成為JVM中的運(yùn)行代碼。 結(jié)果,Java序列化在本質(zhì)上是不安全的。
盡可能避免在Java代碼中進(jìn)行序列化/反序列化。 相反,請(qǐng)考慮使用JSON或YAML之類的序列化格式。 永遠(yuǎn)不要公開接收并作用于序列化流的不受保護(hù)的網(wǎng)絡(luò)端點(diǎn)。
Java安全規(guī)則#3:永遠(yuǎn)不要公開未加密的憑證
很難相信,但是這種可避免的錯(cuò)誤會(huì)導(dǎo)致年復(fù)一年的痛苦。
當(dāng)用戶在瀏覽器中輸入密碼時(shí),密碼將以純文本格式發(fā)送到服務(wù)器。那應(yīng)該是它最后一次出現(xiàn)。我們必須先通過單向密碼對(duì)密碼進(jìn)行加密,然后再將其持久保存到數(shù)據(jù)庫中,然后在每次與該值進(jìn)行比較時(shí)再次進(jìn)行加密。
密碼規(guī)則適用于所有個(gè)人身份信息:信用卡,社會(huì)保險(xiǎn)號(hào)等。委托給應(yīng)用程序的任何個(gè)人信息都應(yīng)得到最高程度的保護(hù)。
數(shù)據(jù)庫中未加密的憑據(jù)是一個(gè)巨大的安全漏洞,正在等待攻擊者發(fā)現(xiàn)。同樣,切勿將原始憑據(jù)寫入日志,或以其他方式傳輸?shù)轿募蚓W(wǎng)絡(luò)。要為我們的密碼系統(tǒng)創(chuàng)建一個(gè)加鹽的哈希并務(wù)必進(jìn)行研究并使用推薦的哈希算法。
跳至規(guī)則4:始終使用庫進(jìn)行加密;不要自己動(dòng)手。
Java安全規(guī)則4:使用已知和經(jīng)過測(cè)試的庫
盡可能使用已知的可靠庫和框架。從密碼哈希到REST API授權(quán),這適用于整個(gè)范圍。
幸運(yùn)的是,Java及其生態(tài)系統(tǒng)對(duì)此提供了很好的支持。對(duì)于應(yīng)用程序安全性,Spring Security是事實(shí)上的標(biāo)準(zhǔn)。它提供了廣泛的選擇范圍和靈活性,以適應(yīng)任何應(yīng)用程序體系結(jié)構(gòu),并且融合了多種安全方法。
解決安全性的第一個(gè)本能應(yīng)該是進(jìn)行研究,研究最佳實(shí)踐。例如,如果要使用JSON Web令牌來管理身份驗(yàn)證和授權(quán),查看封裝JWT的Java庫,然后學(xué)習(xí)如何將其集成到Spring Security中。
Java安全性規(guī)則5:對(duì)外部輸入抱有偏執(zhí)
無論是來自用戶輸入表單,數(shù)據(jù)存儲(chǔ)區(qū)還是遠(yuǎn)程API,都不要信任外部輸入。
SQL注入和跨站點(diǎn)腳本(XSS)只是最常見的攻擊,可能是由于錯(cuò)誤處理外部輸入而導(dǎo)致的。一個(gè)不為人所知的例子(其中很多例子)是“billion laughs attack(一種 denial-of-service(DoS)攻擊,它主要作用于XML文檔解析器。它也被稱為指數(shù)實(shí)體擴(kuò)展攻擊,是一種名副其實(shí)的XML炸彈。該攻擊通過創(chuàng)建一系列遞歸的XML定義,在內(nèi)存中產(chǎn)生上十億的特定字符串,從而導(dǎo)致DoS攻擊。原理為:構(gòu)造惡意的XML實(shí)體文件以耗盡服務(wù)器可用內(nèi)存,因?yàn)樵S多XML解析器在解析XML文檔時(shí)傾向于將它的整個(gè)結(jié)構(gòu)保留在內(nèi)存中,上億的特定字符串占用內(nèi)存達(dá)到GB級(jí),使得解析器解析非常慢,并使得可用資源耗盡,從而造成拒絕服務(wù)攻擊。)”,通過這種攻擊,XML實(shí)體擴(kuò)展會(huì)導(dǎo)致拒絕服務(wù)攻擊。
每當(dāng)收到輸入時(shí),都應(yīng)進(jìn)行完整性檢查和消毒。對(duì)于可能呈現(xiàn)給另一個(gè)工具或系統(tǒng)進(jìn)行處理的任何事物尤其如此。例如,如果某些事情可能會(huì)成為OS命令行的參數(shù),必須小心!
一個(gè)特殊的眾所周知的實(shí)例是SQL注入,它將在下一條規(guī)則中介紹。
Java安全規(guī)則#6:始終使用準(zhǔn)備好的語句來處理SQL參數(shù)
每當(dāng)構(gòu)建一條SQL語句時(shí),都有可能插值一段可執(zhí)行代碼。
知道了這一點(diǎn),最好始終使用java.sql.PreparedStatement類來創(chuàng)建SQL。對(duì)于NoSQL存儲(chǔ)(如MongoDB)也存在類似的功能。如果您使用的是ORM層,則實(shí)現(xiàn)將在后臺(tái)使用PreparedStatements。
Java安全規(guī)則#7:不要通過錯(cuò)誤消息來揭示實(shí)現(xiàn)
生產(chǎn)中的錯(cuò)誤消息可以為攻擊者提供豐富的信息來源。堆棧跟蹤尤其可以揭示有關(guān)您正在使用的技術(shù)及其使用方式的信息。避免向最終用戶顯示堆棧跟蹤。
登錄失敗警報(bào)也屬于此類別。通常接受的錯(cuò)誤消息應(yīng)為“登錄失敗”與“未找到該用戶”或“密碼錯(cuò)誤”。為潛在的惡意用戶提供盡可能少的幫助。
理想情況下,錯(cuò)誤消息不應(yīng)顯示您應(yīng)用程序的基礎(chǔ)技術(shù)堆棧。保持該信息盡可能不透明。
Java安全性規(guī)則#8:使安全性發(fā)布保持最新
我們需要經(jīng)常檢查安全更新并將其應(yīng)用到JRE和JDK。
定期檢查Oracle主頁上的安全警報(bào),以確保知道可用的重要補(bǔ)丁程序。每個(gè)季度,Oracle都會(huì)為Java的當(dāng)前LTS(長期支持)版本提供一個(gè)自動(dòng)補(bǔ)丁更新。問題是,只有在購買Java支持許可證的情況下,該補(bǔ)丁才可用。
小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)初中級(jí)Java工程師,想要提升技能,往往是自己摸索成長,但自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年最新Java開發(fā)全套學(xué)習(xí)資料》送給大家,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
由于文件比較大,這里只是將部分目錄截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻
如果你覺得這些內(nèi)容對(duì)你有幫助,可以添加下面V無償領(lǐng)?。。▊渥ava)
最后
現(xiàn)在正是金三銀四的春招高潮,前陣子小編一直在搭建自己的網(wǎng)站,并整理了全套的**【一線互聯(lián)網(wǎng)大廠Java核心面試題庫+解析】:包括Java基礎(chǔ)、異常、集合、并發(fā)編程、JVM、Spring全家桶、MyBatis、Redis、數(shù)據(jù)庫、中間件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**
件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**
[外鏈圖片轉(zhuǎn)存中…(img-eu8vTeiO-1710420916915)]文章來源:http://www.zghlxwxcb.cn/news/detail-851081.html
本文已被CODING開源項(xiàng)目:【一線大廠Java面試題解析+核心總結(jié)學(xué)習(xí)筆記+最新講解視頻+實(shí)戰(zhàn)項(xiàng)目源碼】收錄文章來源地址http://www.zghlxwxcb.cn/news/detail-851081.html
到了這里,關(guān)于開發(fā)安全Java應(yīng)用程序的13條規(guī)則((Mark)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!