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

