常見(jiàn)JavaWeb安全問(wèn)題和解決方案
1.SQL注入:程序向后臺(tái)數(shù)據(jù)庫(kù)傳遞SQL時(shí),用戶提交的數(shù)據(jù)直接拼接到SQL語(yǔ)句中并執(zhí)行,從而導(dǎo)入SQL注入攻擊。
字符型注入:黑色部分為拼接的問(wèn)題參數(shù)
select * from t_user where name='test' or '1' = '1';
數(shù)字型注入:黑色部分為拼接的問(wèn)題參數(shù)(對(duì)于強(qiáng)類型語(yǔ)言,字符串轉(zhuǎn)int類型會(huì)拋異常。所以這種注入方式一般出現(xiàn)在php等弱類型語(yǔ)言上)
select * from t_user where id=1;drop table t_userinfo;
搜索型注入:對(duì)表名進(jìn)行猜測(cè)
select * from t_user where userName like ‘%test%' and 1=2 union select 1,2 from t_admin';
修復(fù)方法:
a、在mybatis中使用#把參數(shù)當(dāng)做一個(gè)字符串,不能使用$符號(hào)
b、在JDBC中使用預(yù)編譯的方式對(duì)參數(shù)進(jìn)行綁定,詳細(xì)如下:
String userName = request.getParameter("userName"); String sql = "select * from t_user where userName = ?"; JdbcConnection conn = new JdbcConnection(); PreparedStatement pstmt = conn.preparedStatement(sql); pstmt.setString(1,userName);
2、XSS跨站腳本攻擊(惡意將腳本代碼植入到供其他用戶使用的頁(yè)面中)
反射型:經(jīng)過(guò)后端,不經(jīng)過(guò)數(shù)據(jù)庫(kù)
存儲(chǔ)型:經(jīng)過(guò)后端經(jīng)過(guò)數(shù)據(jù)庫(kù)
DOM型:基于文檔對(duì)象模型DOM,通過(guò)控制url參數(shù)觸發(fā)
修復(fù)方法:
a、后臺(tái)設(shè)置XSSFilter,繼承RequestServletWrapper類,對(duì)前端請(qǐng)求中的可控參數(shù)進(jìn)行過(guò)濾
b、服務(wù)端設(shè)置Http-only安全屬性,使瀏覽器控制cookie不被泄露
c、對(duì)引入到DOM中的參數(shù)使用htmlEncodeByRegExp編碼,在對(duì)應(yīng)的展示框中用htmlDecodeByRegExp進(jìn)行解碼(比較常用)
var HtmlUtil = { /*1.用正則表達(dá)式實(shí)現(xiàn)html轉(zhuǎn)碼*/ htmlEncodeByRegExp:function (str){ var s = ""; if(str.length == 0) return ""; s = str.replace(/&/g,"&"); s = s.replace(/</g,"<"); s = s.replace(/>/g,">"); s = s.replace(/ /g," "); s = s.replace(/\'/g,"'"); s = s.replace(/\"/g,"""); return s; }, /*2.用正則表達(dá)式實(shí)現(xiàn)html解碼*/ htmlDecodeByRegExp:function (str){ var s = ""; if(str.length == 0) return ""; s = str.replace(/&/g,"&"); s = s.replace(/</g,"<"); s = s.replace(/>/g,">"); s = s.replace(/ /g," "); s = s.replace(/'/g,"\'"); s = s.replace(/"/g,"\""); return s; } };
3、敏感信息泄露
程序造成的泄露:
1、服務(wù)端返回冗余敏感數(shù)據(jù):用戶只申請(qǐng)了單個(gè)賬戶的信息,卻返回了多個(gè)用戶的信息
2、將敏感信息直接寫在前端頁(yè)面的注釋中
3、寫在配置文件的密碼未進(jìn)行編碼處理
4、請(qǐng)求參數(shù)敏感信息未脫敏處理(可以將數(shù)據(jù)在前端用RSA加密,后臺(tái)在進(jìn)行解密)
5、前端展示的敏感信息,沒(méi)有在后臺(tái)進(jìn)行脫敏處理(后臺(tái)對(duì)數(shù)據(jù)進(jìn)行處理,可以將中間部分使用*號(hào)代替)
6、越權(quán)
4、越權(quán):攻擊者能夠執(zhí)行本身沒(méi)有資格執(zhí)行的權(quán)限
水平越權(quán):權(quán)限類型不變,權(quán)限Id變化(同等角色下的用戶,不但能夠訪問(wèn)自己私有的數(shù)據(jù),還能訪問(wèn)其他人私有的數(shù)據(jù))
垂直越權(quán):權(quán)限ID不變,權(quán)限類型變化(即低權(quán)限的角色通過(guò)一些途徑,獲得高權(quán)限的能力)
交叉越權(quán):上面兩者的交集
修復(fù)方法:
1、根據(jù)請(qǐng)求攜帶的用戶信息進(jìn)行鑒權(quán)操作,對(duì)當(dāng)前請(qǐng)求攜帶的用戶信息進(jìn)行用戶角色和數(shù)據(jù)權(quán)限匹配。每一個(gè)重要操作的功能、分步操作的每個(gè)階段都進(jìn)行權(quán)限判斷。權(quán)限不足就中斷操作。
5、文件下載:
任意文件下載:下載服務(wù)器的任意文件,web業(yè)務(wù)的代碼,服務(wù)器和系統(tǒng)的具體配置信息,也可以下載數(shù)據(jù)庫(kù)的配置信息,以及對(duì)內(nèi)網(wǎng)的信息探測(cè)等等
文件越權(quán)下載:
修復(fù)方法:
1、針對(duì)任意文件下載的修復(fù),增加當(dāng)前請(qǐng)求下載的文件上一級(jí)的絕對(duì)路徑同配置文件中允許下載的路徑直接的比較(file.getCanonicalFile().getParent()獲取上一級(jí)的絕對(duì)路徑)
if(!file.getCanonicalFile().getParent().equals(new File(Constants.TMP_PATH).getCanonicalPath())){ return ; }
2、文件越權(quán)下載:允許下載之前對(duì)請(qǐng)求所帶的用戶信息進(jìn)行判斷,擁有足夠的權(quán)限菜允許下載。
6、文件上傳:網(wǎng)絡(luò)攻擊者上傳了一個(gè)可執(zhí)行的文件到服務(wù)器并執(zhí)行。這里上傳的文件可以是木馬,病毒,惡意腳本或者WebShell等。
修復(fù)方法:
1、客戶端、服務(wù)端白名單驗(yàn)證(不建議用黑名單),客戶端的校驗(yàn)不夠安全,很容易被繞過(guò)。
String fileName = file.getOriginalFilename();
String extName = fileName.subString(fileName.lastIndexof(".")+1);
獲取上傳文件的后綴名,并同白名單上的后綴名進(jìn)行比較,包含在白名單上則允許通過(guò),不包含則直接中斷請(qǐng)求。
2、MiME類型檢測(cè):文件上傳時(shí)瀏覽器會(huì)在Header中添加MIMETYPE識(shí)別文件類型,服務(wù)端要對(duì)此進(jìn)行檢測(cè)。
String mime = file.getContentType();//獲取文件的ContentType類型值
同白名單上的contentType類型名進(jìn)行比較,包含在白名單上則允許通過(guò),不包含則直接中斷請(qǐng)求。
3、文件內(nèi)容檢測(cè):用不同的方法將不同的文件內(nèi)容流的進(jìn)行讀取。
BufferedImage image = ImageIO.read(file.getInputStream());
7、CSRF:跨站請(qǐng)求偽造,完成CSRF攻擊,需要完成兩個(gè)步驟:1、登錄受信任的網(wǎng)站A,并在本地生成cookie;2、在不登出A的情況下,訪問(wèn)危險(xiǎn)網(wǎng)站B
CSRF本質(zhì)原因:Web的隱式身份驗(yàn)證機(jī)制。Web的身份驗(yàn)證機(jī)制雖然可以保證請(qǐng)求來(lái)自用戶的瀏覽器,但是無(wú)法保證該請(qǐng)求時(shí)用戶批準(zhǔn)發(fā)送的。
修復(fù)方法:
CSRF Token校驗(yàn):在頁(yè)面中添加一個(gè)hidden用于存放token字段,請(qǐng)求發(fā)送時(shí)攜帶token到服務(wù)端,服務(wù)端校驗(yàn)token值是否準(zhǔn)確。不準(zhǔn)確直接中斷操作
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- linux(center OS7)安裝JDK、tomcat、mysql 搭建java web項(xiàng)目運(yùn)行環(huán)境
- 詳解CentOS安裝tomcat并且部署Java Web項(xiàng)目
- centos上安裝配置java WEB環(huán)境
- JSP學(xué)習(xí)之Java Web中的安全控制實(shí)例詳解
- 使用純Java實(shí)現(xiàn)一個(gè)WebSSH項(xiàng)目的示例代碼
- Java實(shí)現(xiàn)基于NIO的多線程Web服務(wù)器實(shí)例
- Java web三件套listener、filter、servelt原理解析
- Java web xml文件讀取解析方式
相關(guān)文章
利用Java實(shí)現(xiàn)在PDF中添加工具提示
這篇文章主要介紹了如何通過(guò)Java在PDF中添加工具提示,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的可以學(xué)習(xí)一下2022-01-01swagger2隱藏在API文檔顯示某些參數(shù)的操作
這篇文章主要介紹了swagger2隱藏在API文檔顯示某些參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java兩整數(shù)相除向上取整的方式詳解(Math.ceil())
在調(diào)外部接口獲取列表數(shù)據(jù)時(shí),需要判斷是否已經(jīng)取完了所有的值,因此需要用到向上取整,下面這篇文章主要給大家介紹了關(guān)于Java兩整數(shù)相除向上取整的相關(guān)資料,需要的朋友可以參考下2022-06-06mybatis之調(diào)用帶輸出參數(shù)的存儲(chǔ)過(guò)程(Oracle)
這篇文章主要介紹了mybatis調(diào)用帶輸出參數(shù)的存儲(chǔ)過(guò)程(Oracle),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Spring Boot實(shí)戰(zhàn)之發(fā)送郵件示例代碼
本篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之發(fā)送郵件示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-03-03Spring中的攔截器HandlerInterceptor詳細(xì)解析
這篇文章主要介紹了Spring中的攔截器HandlerInterceptor詳細(xì)解析,HandlerInterceptor 是 Spring 框架提供的一個(gè)攔截器接口,用于在請(qǐng)求處理過(guò)程中攔截和處理請(qǐng)求,需要的朋友可以參考下2024-01-01java開(kāi)發(fā)之spring webflow實(shí)現(xiàn)上傳單個(gè)文件及多個(gè)文件功能實(shí)例
這篇文章主要介紹了java開(kāi)發(fā)之spring webflow實(shí)現(xiàn)上傳單個(gè)文件及多個(gè)文件功能,結(jié)合具體實(shí)例形式分析了spring webflow文件上傳具體操作技巧,需要的朋友可以參考下2017-11-11