1、路徑遍歷
奇安信安全漏洞掃描掃出來(lái)的結(jié)果,個(gè)人感覺(jué)不是很智能式塌。
接收文件的接口甘穿,不允許調(diào)用創(chuàng)建文件或刪除文件的方法。
接收文件時(shí)可以用MultipartFile接收拆又,然后不再創(chuàng)建臨時(shí)文件儒旬,盡量使用I/O流進(jìn)行處理。
2帖族、xss攻擊
對(duì)傳入的參數(shù)進(jìn)行xss過(guò)濾栈源,對(duì)特殊字符進(jìn)行轉(zhuǎn)義處理。
3竖般、sql注入
輸入具有風(fēng)險(xiǎn)的查詢條件甚垦。${} 和 #{}的主要區(qū)別是#{}會(huì)在參數(shù)前后加入"",如參數(shù)是 keyword,拼接成sql語(yǔ)句是 "keyword"艰亮,而${}會(huì)原封不動(dòng)地把原來(lái)的字段拼接到sql語(yǔ)句上闭翩。
4、訪問(wèn)權(quán)限修飾符控制
敏感的訪問(wèn)權(quán)限修飾符迄埃,不能直接用true疗韵、false等關(guān)鍵字直接開(kāi)啟或關(guān)閉,以防被人惡意掃描到侄非,應(yīng)該用一些具有訪問(wèn)權(quán)限的類間接控制蕉汪。
5、使用DNS名稱作為安全性的依據(jù)
不能使用DNS名稱進(jìn)行安全驗(yàn)證逞怨,一個(gè)IP地址可以對(duì)應(yīng)多個(gè)DNS名稱肤无,甚至可以偽造DNS名稱,通過(guò)DNS名稱判斷訪問(wèn)來(lái)源不準(zhǔn)確骇钦。
6宛渐、不安全的框架綁定
對(duì)傳入接口的參數(shù)應(yīng)該進(jìn)行過(guò)濾,比如下面的代碼眯搭,創(chuàng)建一個(gè)新用戶窥翩,如果多傳一個(gè)admin=true,就變成創(chuàng)建一個(gè)管理員了鳞仙。
應(yīng)該對(duì)傳進(jìn)來(lái)參數(shù)使用VO進(jìn)行封裝寇蚊,避免多傳參數(shù)額外的參數(shù)。
同理棍好,響應(yīng)給前端的字段也應(yīng)該使用DTO封裝仗岸,避免爆暴露所有字段名稱。
反面例子:用戶登錄成功后將用戶所有信息借笙、字段響應(yīng)回去扒怖。
7、密碼管理:不安全的隨機(jī)數(shù)
Random 類并不是一個(gè)線程安全的類业稼,在并發(fā)量大的時(shí)候有可能會(huì)產(chǎn)生死循環(huán)盗痒。后來(lái)jdk修復(fù)了這個(gè)bug,推出了線程安全的SecureRandom類低散,創(chuàng)建隨機(jī)數(shù)應(yīng)該使用安全的 SecureRandom 類俯邓。
8、密碼管理:硬編碼密碼
對(duì)密碼不能直接在代碼中賦值熔号,應(yīng)該從配置文件中獲取經(jīng)過(guò)加密的密碼值稽鞭。并且盡量不使用password等信息敏感字作為字段名。
9引镊、修改密碼時(shí)朦蕴,根據(jù)傳進(jìn)來(lái)的id修改對(duì)應(yīng)用的id
當(dāng)前用戶的id不能直接暴露出去吃嘿,應(yīng)該通過(guò)后端從session或者redis中獲取。對(duì)當(dāng)前用戶的操作都不能通過(guò)傳進(jìn)來(lái)的id進(jìn)行處理梦重。
····
@SysLog(name = "更改密碼")
@PostMapping("/changePass")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "用戶id", required = true),
@ApiImplicitParam(name = "newPass", value = "新密碼", required = true),
@ApiImplicitParam(name = "oldPass", value = "舊密碼", required = true)
})
@ResponseBody
public MResponse changePass(@RequestParam("id") String id,
@RequestParam("oldPass") String oldPass,
@RequestParam("newPass") String newPass) {
····
10兑燥、登錄時(shí),發(fā)短信驗(yàn)證碼接口和校驗(yàn)密碼接口分開(kāi)成兩個(gè)琴拧,致使可以繞過(guò)手機(jī)號(hào)碼
先訪問(wèn)驗(yàn)證密碼接口降瞳,驗(yàn)證成功后返回用戶手機(jī)號(hào)碼,再攜帶獲取的手機(jī)號(hào)碼訪問(wèn)發(fā)送短信有驗(yàn)證碼的接口蚓胸。用戶可以在驗(yàn)證密碼成功后挣饥,另外發(fā)送一個(gè)手機(jī)號(hào)碼訪問(wèn)發(fā)短信驗(yàn)證碼的接口,從而繞過(guò)給賬號(hào)用戶本人發(fā)送短信這個(gè)步驟沛膳。
應(yīng)該在一個(gè)接口里校驗(yàn)密碼成功后立馬發(fā)送短信扔枫。
11、登錄時(shí)锹安,驗(yàn)證短信驗(yàn)證碼和執(zhí)行登錄接口分開(kāi)成兩個(gè)短荐,致使可以繞過(guò)驗(yàn)證短信驗(yàn)證碼
同上面,先訪問(wèn)驗(yàn)證短信驗(yàn)證碼的接口叹哭,訪問(wèn)通過(guò)后忍宋,再訪問(wèn)執(zhí)行登錄的接口。用戶可以繞過(guò)短信驗(yàn)證碼驗(yàn)證风罩,直接訪問(wèn)執(zhí)行登錄的接口糠排。
應(yīng)該在同一個(gè)接口里面完成兩個(gè)步驟,驗(yàn)證短信后立馬執(zhí)行登錄超升。
12入宦、敏感信息暴露,信息泄密
- 用戶登錄成功后室琢,將所有用戶信息返回給前端乾闰,前端將所有用戶信息保存在cookie中。
-
查詢用戶列表研乒,將用戶所有信息全部查詢響應(yīng)回去汹忠。
13淋硝、橫向越權(quán)漏洞
橫向越權(quán):攻擊者嘗試訪問(wèn)與他擁有相同權(quán)限的其他用戶的資源雹熬。
原因:查詢、編輯谣膳、刪除等操作的時(shí)候是需要傳遞響應(yīng)數(shù)據(jù)id的竿报,傳入不是當(dāng)前用戶管理的id,造成橫向越權(quán)继谚。
對(duì)策:對(duì)目標(biāo)數(shù)據(jù)進(jìn)行判斷烈菌,判斷是否為當(dāng)前用戶有權(quán)限操作的數(shù)據(jù)。
14、縱向越權(quán)漏洞
縱向越權(quán):攻擊者嘗試訪問(wèn)不屬于他自己權(quán)限的資源
原因:隱藏菜單芽世,按鈕挚赊,從而限制用戶訪問(wèn)某些接口的權(quán)限,但是用戶可以不使用菜單济瓢、按鈕荠割,而直接在地址欄訪問(wèn)接口,造成縱向越權(quán)旺矾。
對(duì)策:給每個(gè)接口蔑鹦,每個(gè)用戶建立數(shù)據(jù)訪問(wèn)權(quán)限,用戶須擁有訪問(wèn)該接口權(quán)限箕宙,才允許訪問(wèn)嚎朽。
15、跨站請(qǐng)求偽造
攻擊者偽造一條刪除數(shù)據(jù)的鏈接柬帕,引誘正常使用的管理員點(diǎn)擊哟忍。管理員點(diǎn)擊之后直接訪問(wèn)刪除數(shù)據(jù)的鏈接,造成數(shù)據(jù)丟失陷寝。
對(duì)策:判斷鏈接是否是從我們的靜態(tài)頁(yè)面來(lái)訪問(wèn)過(guò)來(lái)魁索,如果不是,則攔截盼铁。
referer的作用:告訴服務(wù)器這次請(qǐng)求是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的粗蔚,如果是瀏覽器直接訪問(wèn),則為空饶火。