日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java编码安全规范

發(fā)布時(shí)間:2023/12/10 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java编码安全规范 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡述:入職菊廠第一周,沒什么任務(wù),正全力準(zhǔn)備java安全編碼考試,跟阿里規(guī)范類似,不過要多很多安全攻防的內(nèi)容和一些之前沒注意的知識(shí)點(diǎn),所以記錄分享自己學(xué)到的經(jīng)驗(yàn)

命名規(guī)范

類似阿里規(guī)范,省略一萬字...

編碼規(guī)范

整數(shù)溢出

對(duì)于整數(shù)溢出問題,可以通過先決條件檢測、使用Math類的安全方法.向上類型轉(zhuǎn)換或者使用Biglnteger等方法進(jìn)行規(guī)避。

除數(shù)不為0

對(duì)除數(shù)進(jìn)行非0判斷,然后再進(jìn)行除法或取余運(yùn)算。

浮點(diǎn)比較

考慮浮點(diǎn)數(shù)的精度問題,可在一定的誤差范圍內(nèi)判定兩個(gè)浮點(diǎn)數(shù)值相等。這個(gè)誤差應(yīng)根據(jù)實(shí)際需要進(jìn)行定義

精度計(jì)算

涉及精確的數(shù)值計(jì)算〔貨幣、金融等),建議使用int , long .BigDecimal 等;在構(gòu)造BigDecimal 時(shí),使用浮點(diǎn)數(shù)容易導(dǎo)致精度損失,應(yīng)該使用字符串格式的數(shù)值構(gòu)造BigDecimal

字符串換行和分割

用做換行〈回車"\r"、換行"\n")、文件路徑分隔《"\"、"/")的字符.在不同探作系統(tǒng)下是有區(qū)別的。使用Systerm.lineSeparalor()獲攻運(yùn)行時(shí)環(huán)境的換行符。文件騖徑分割符可以使java.io.File中的separator和pathseparator靜態(tài)屬性。

字符和字節(jié)轉(zhuǎn)換

當(dāng)跨平臺(tái)實(shí)現(xiàn)字符與寧節(jié)之間的轉(zhuǎn)換,可能會(huì)導(dǎo)致亂碼。所以字符與字節(jié)之間轉(zhuǎn)換時(shí)要明確指定編碼方式

包裝類型數(shù)值運(yùn)算

包裝類型進(jìn)行加減乘除,涉及拆箱,可能導(dǎo)致空指針

斷言

對(duì)不可信源進(jìn)行報(bào)錯(cuò),對(duì)可信源進(jìn)行斷言

斷言是否生效依賴運(yùn)行時(shí)屬性的狀態(tài),存在被禁用的場景

信息安全

異常泄露

程序拋出的異常中,可能會(huì)包含一些敏感信息,將這些異常直接記錄到日志或反饋給用戶,會(huì)導(dǎo)致敏感信息泄露風(fēng)險(xiǎn)。

應(yīng)該把原生異常打印記錄日志,而向用戶拋出自定義異常信息。

日志攻擊

直接將外部數(shù)據(jù)記錄到日志中,可能存在以下風(fēng)險(xiǎn):

·日志注入:惡意用戶可利用回車.換行等字符注入一條與系統(tǒng)日志規(guī)格類似的偽日志;

·敏感信息泄露:當(dāng)用戶輸入敏感信息時(shí),直接記錄到日志中可能會(huì)導(dǎo)致敏感信息泄露;

·垃圾日志或日志覆蓋:當(dāng)用戶輸入的是很長的字符串,直接記錄到日志中可能會(huì)導(dǎo)致產(chǎn)生大量垃圾日志;

·當(dāng)日志被循環(huán)覆蓋時(shí),這樣還可能會(huì)導(dǎo)致有效日志被惡意覆蓋。

防御手段:

·換行回車replace其他字符

·敏感信息加密后在打印日志

·截?cái)噍^長字符串

安全管理器

所有的敏感操作必須經(jīng)過安全管理器的檢查,防止被不可信的代碼調(diào)用

非法路徑參數(shù)

文件路徑來自外部數(shù)據(jù)時(shí),必須對(duì)其合法性進(jìn)行校驗(yàn),否則可能會(huì)產(chǎn)生路徑遍歷(Path Traversal〉漏洞。

對(duì)文件路徑的規(guī)范化處理必須使用getcanonicalPath0,禁止 用getAbsalutePatho〔該方法無法保證在所有的平臺(tái)上對(duì)文件路徑進(jìn)行正碎的規(guī)范化處理}

非法解壓

使用java.util.zip.ZiplnputStream解壓zip文件時(shí),可能會(huì)有兩類安全風(fēng)險(xiǎn):

·將文件解壓到目標(biāo)目錄之外

壓縮包中的文件名中如果包含..,可能導(dǎo)致文件被解壓到日標(biāo)日錄之外,造成任意文件注入、文件惡

意篡改等風(fēng)險(xiǎn)。因此,壓縮包中的文件在解壓前,要先對(duì)解壓的目標(biāo)路徑進(jìn)行校驗(yàn)。如果解壓目標(biāo)路徑不在預(yù)期目錄之內(nèi),要么拒絕將其解壓出來,要么將其解壓到一個(gè)安全的位置

·解壓的文件消耗過多的系統(tǒng)資源

zip壓縮算法可能有很大的壓縮比,可以把超大文件壓縮成很小的zip文件〈例如可以將上G的文件壓縮為幾K大小,這樣的文件解壓可能會(huì)導(dǎo)致zip炸彈(zip bomb)攻擊。所以zip文件解壓時(shí),需對(duì)解壓

的實(shí)際文件大小進(jìn)行檢查,若解壓之后的文件大小超過一定的限制,必須拒絕解壓。具體的大小限制根據(jù)實(shí)際情況來確定。除此之外,解壓時(shí),還需要對(duì)解壓出來的文件數(shù)量進(jìn)行限制,防止zip壓縮包中是數(shù)量巨大的小文件說明:在統(tǒng)計(jì)解壓文件的大小時(shí),不應(yīng)該使用entry.getsize來統(tǒng)計(jì)文件大小, <entry.getSize:是從zip文件中的固定字股中瀆取單個(gè)文件壓縮前的大小,文件壓縮前的大小可被惡意篡改。>

非法序列化

當(dāng)序列化結(jié)果中含有敏感信息時(shí),序列化結(jié)果在磁盤上存儲(chǔ)、跨信任域傳遞等操作都存在敏感信息泄露風(fēng)險(xiǎn)

  • 如果敏感信息必須序列化,需要先對(duì)越感信息迄行加密或?qū)π蛄谢Y(jié)果進(jìn)行加密,跨信任邊界傳遞含敏感信良的序列化結(jié)果時(shí)要先簽名后加密。
  • 使用transient關(guān)鍵詞修飾含敏感信息的屬性,避免這些屬性進(jìn)行序列化

非法反序列化

當(dāng)反序列化操作的數(shù)善是外部數(shù)據(jù)時(shí),惡意用戶可利用反序列化操作構(gòu)造指定的對(duì)象、執(zhí)行惡意代碼、向應(yīng)用程序中注入有害數(shù)據(jù)等。

  • 對(duì)className進(jìn)行白名單校驗(yàn)。如果反序列化的類不在白名單之中,直接拋出異常.
  • 如果產(chǎn)品已經(jīng)使用Java的安全管理器,建議使用Java安全管理器機(jī)制進(jìn)行防護(hù)

安全隨機(jī)數(shù)

不安全的隨機(jī)數(shù)可能被部分或全部預(yù)測到,導(dǎo)致系統(tǒng)存在安全隱患,安全場景下使用的隨機(jī)數(shù)必須是密碼學(xué)意義上的安全隨機(jī)數(shù)。

常見安全場景包括但不限于以下場景:

  • 用于密碼算法用途,如生成Ⅳ、鹽值、密鑰等;
  • 會(huì)話標(biāo)識(shí)〈sesslonld)的生成;
  • 挑戰(zhàn)算法中的隨機(jī)數(shù)生成;·驗(yàn)證碼的陸機(jī)數(shù)生成;

安全隨機(jī)數(shù)產(chǎn)生方式:

  • Linux操作系統(tǒng)的/devrandom沒備接口(存在阻塞問題}.
  • windows探作系統(tǒng)的CryptGenRandomn)接口
  • Java中的SecureRandom是一種密碼學(xué)安全的偽機(jī)數(shù)產(chǎn)生,對(duì)于使用非真隨機(jī)數(shù)產(chǎn)生器產(chǎn)生隨機(jī)數(shù)時(shí),要使用少量真隨機(jī)數(shù)作為種子

網(wǎng)絡(luò)通信

必須使用SSLSocket代替Socket來進(jìn)行安全數(shù)據(jù)交互。在數(shù)據(jù)非敏感,或數(shù)搖已加密的情況下,可以使用Socket進(jìn)行傳輸,效率更高。

sql注入

SQL注入產(chǎn)生的根本原因是使用外部數(shù)據(jù)直接拼接SQL語句

防護(hù)手段:

·使用參數(shù)化查淘:最有效的防護(hù)手段,但對(duì)sQL語句中的表名、字段名等不適用;

·對(duì)外部數(shù)據(jù)進(jìn)行白名單校驗(yàn):適用于拼接SQL語句中的表名、字段名;

·對(duì)外部數(shù)據(jù)中的與SQL注入相關(guān)的特殊字符進(jìn)行轉(zhuǎn)義:適用于必須通過字符串拼接構(gòu)造SQL語句的場景,轉(zhuǎn)義僅對(duì)由引號(hào)限制的字段有效

命令注入

Runtime.exec()方法或java.lang.ProcessBuildier類被用來啟動(dòng)一個(gè)新的進(jìn)程,在新進(jìn)程中執(zhí)行

命令。命令執(zhí)行通常會(huì)有兩種方式

·直接執(zhí)行具體命令:例如Runtime.getRuntimel).exec "ping127.0.0.1"");

·通過shell方式執(zhí)行命令: vindaws下使用cmd.exe、linux下通過sh方式執(zhí)行命令,或通過腳本文件( *.bati*.sh)執(zhí)行命令古接使用外部數(shù)據(jù)構(gòu)造命令行,會(huì)存在以下鳳險(xiǎn):

shell方式執(zhí)行命令時(shí),需要命令行解釋器對(duì)命令字符串進(jìn)行拆分,該方式可執(zhí)行多條命令,存在命令注入風(fēng)險(xiǎn);

·直接執(zhí)行具體的命令時(shí),可以通過空格、雙引號(hào)或以-頑開頭的字符串向命令行中注入?yún)?shù),存在參數(shù)注入風(fēng)險(xiǎn).

防御手段;

·避免直接執(zhí)行命令,用其他類庫函數(shù)代替·對(duì)外部數(shù)據(jù)進(jìn)行白名單([O-9A-Za-z@]+〕校驗(yàn)

·對(duì)外部數(shù)據(jù)進(jìn)行轉(zhuǎn)義(如果輸入校驗(yàn)不能禁止有風(fēng)險(xiǎn)的特殊寧符,需先外部輸入進(jìn)行轉(zhuǎn)義處理,轉(zhuǎn)義后的字段拼接命令行可有效防止命令注入的產(chǎn)生)

XML注入

使用未經(jīng)校驗(yàn)的數(shù)據(jù)來構(gòu)造XML會(huì)導(dǎo)致XML注入漏洞

防御手段:

·白名單校驗(yàn)\w

·使用安全的xml庫(dom4j)

·轉(zhuǎn)義

XXE攻擊(XML External Entity外部實(shí)體攻擊)

XML實(shí)體包括內(nèi)部實(shí)體和外部實(shí)體。外部實(shí)體格式: <!ENTITY實(shí)體名SYSTEM URI"">或者

<!ENTITY實(shí)體名PUBLIC"public_ID""URI""> . Java中引入外部實(shí)體的協(xié)議包括http. https、ftp. file. jar. netdoc. mailto等。XXE漏洞發(fā)生在應(yīng)用程序解析來自外郁的XML數(shù)據(jù)或文件時(shí)沒有禁止外部實(shí)體的加裁,造成任意文件讀取、內(nèi)網(wǎng)端口掃描、內(nèi)網(wǎng)網(wǎng)站攻擊,DoS攻擊等危害

防御手段:

  • 禁止DTDs
  • 白名單校驗(yàn)

XEE攻擊(XML Entity Expansion內(nèi)部實(shí)體拓展攻擊)

XMIL內(nèi)部實(shí)體格式:<!ENTITY實(shí)體名""實(shí)體的值"">。內(nèi)部實(shí)體攻擊比較常見的是XML EntityExpansion攻擊,它主要試圖通過消耗目標(biāo)程序的服務(wù)器內(nèi)存資源導(dǎo)致DoS攻擊。例如,解析下面的XML時(shí),因?yàn)閮?nèi)部實(shí)體lo9是一個(gè)非常大的字符串,所以解析<lolz>節(jié)點(diǎn)時(shí),會(huì)占用大量服務(wù)器內(nèi)存資源,導(dǎo)致拒絕服務(wù)攻擊。

防御手段;

禁止DTDs

限制實(shí)體數(shù)量

并發(fā)多線程

data race數(shù)據(jù)競爭

兩個(gè)線程對(duì)一個(gè)非volatile的共享變量進(jìn)行訪問操作,其中至少一個(gè)是寫操作,且兩個(gè)操作之間沒有happends-before關(guān)系,就是datarace

通過建立happends-before消除data race.建立happends-betore需要遠(yuǎn)取合適的同步機(jī)制:

  • 消息隊(duì)列iexecutor. future)
  • synchronize或volatile

happend-before原則

  • 單線程按原代碼順序執(zhí)行- unlock發(fā)生于lock之前
  • volatile變量特性:對(duì)此變瞼過的寫操作發(fā)生于讀操怍之前isynchronized沒有happends-before}
  • 線程啟動(dòng)特性; start先于此線程任何一個(gè)動(dòng)作
  • 線程中斷特性:interrupt先于中斷事件檢測的代碼發(fā)生
  • 線程終止特性:線程的所有操作都先于終止檢測的代碼發(fā)生
  • 對(duì)象絡(luò)結(jié)特性:一個(gè)對(duì)象的初始化完成都先于其finalize發(fā)生開始

實(shí)例鎖無法同步靜態(tài)共享變量

鎖對(duì)象并不是static,但共亨變量是static時(shí),鎖代碼同步效果失效。

  • 把鎖對(duì)象也聲明為static即可。

錯(cuò)用共享對(duì)象鎖

如果鎖對(duì)象是同一個(gè)引用內(nèi)存,容易出現(xiàn)不同的共享變量依賴相同的鎖。

eg:private final String lock = "lock"// 或者 = Boolean.TRUE

總結(jié)

以上是生活随笔為你收集整理的Java编码安全规范的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。