JavaWeb 安全问题及解决方案
1.弱口令漏洞,最好使用至少6位的數(shù)字、字母及特殊字符組合作為密碼。數(shù)據(jù)庫不要存儲明文密碼,應(yīng)存儲MD5加密后的密文,由于目前普通的MD5加密已經(jīng)可以被破解,最好可以多重MD5加密。
?
2.未使用用戶名及密碼登錄后臺可直接輸入后臺URL登錄系統(tǒng)。
?
解決方案:通過配置filter來過濾掉無效用戶的連接請求。
?
3.JSP頁面拋出的異常可能暴露程序信息。有經(jīng)驗的入侵者,可以從JSP程序的異常中獲取很多信息,比如程序的部分架構(gòu)、程序的物理路徑、SQL注入爆出來的信息等。
?
解決方案:自定義一個Exception,將異常信息包裝起來不要拋到頁面上。
?
4.合法用戶“注銷”后,在未關(guān)閉瀏覽器的情況下,點擊瀏覽器“后退”按鈕,可從本地頁面緩存中讀取數(shù)據(jù),繞過了服務(wù)端filter過濾。
解決方案:配置filter對存放敏感信息的頁面限制頁面緩存。如:
?
httpResponse.setHeader("Cache-Control","no-cache");?
httpResponse.setHeader("Cache-Control","no-store");
httpResponse.setDateHeader("Expires",?0);
httpResponse.setHeader("Pragma","no-cache");
?
5.SQL注入漏洞,解決方案:在數(shù)據(jù)庫訪問層中不要使用“+”來拼接SQL語句!如:
?
String?sql=?“SELECT?*?FROM?USERS?WHERE?1=1”;
if(null?!=?user.getUserName()?&&?!””.equals(user.getUserName())){
sql?+=?“?and?UNAME?=?‘”+user.getUserName()+”’”;
}
而應(yīng)使用PreparedStatement。如:
?
PreparedStatement?pstmt?=?con.prepareStatement("SELECT?*?FROM?USERS?WHERE?UNAME=?");
pstmt.setString(1,?“Neeke”);
如果項目中使用了Hibernate框架,則推薦使用named?parameter。如:
?
String?queryString?=?"from?Users?where?uname?like?:name";
冒號后面是一個named?parameter,我們可以使用Query接口將一個參數(shù)綁定到name參數(shù)上:
?
List?result?=?session.createQuery(queryString)
??????????????????.setString("name",?user.getUserName())
??????????????????.list();
6.文件上傳漏洞。前臺僅使用JS對文件后綴做了過濾,這只能針對普通的用戶,而惡意攻擊者完全可以修改表單去掉JS校驗。
解決方案:前臺JS過濾加服務(wù)器端程序過濾。具體過濾掉哪些文件類型視具體情況而定。
?
7.可執(zhí)行腳本漏洞。對用戶提交的數(shù)據(jù)未轉(zhuǎn)義,一些用戶提交的含有JavaScript腳本的信息被直接輸出到頁面中從而被瀏覽器執(zhí)行。
?
解決方案:使用org.apache.commons.lang.StringEscapeUtils對用戶提交的數(shù)據(jù)進(jìn)行轉(zhuǎn)義。如:
?
@RequestMapping(params="method=addTopic",method=RequestMethod.POST)
public?ModelAndView?addTopic(HttpServletRequest?request,?HttpServletResponse?response,?BbsTopic?topic)
{
BaseAdmin?user?=?(BaseAdmin)?request.getSession().getAttribute(Constant.SESSION_USER);
topic.setBaseAdmin(user);
topic.setTopicDate(new?Timestamp(System.currentTimeMillis()));
topic.setTopicContent(StringEscapeUtils.escapeHtml(topic.getTopicContent()));
topic.setTopicTitle(StringEscapeUtils.escapeHtml(topic.getTopicTitle()));
this.bbsTopicService.save(topic);
return?new?ModelAndView(new?RedirectView("bbs.do?method=topicList&bfid="+?topic.getBfid()));
}
?
8.Java?WEB容器默認(rèn)配置漏洞。如TOMCAT后臺管理漏洞,默認(rèn)用戶名及密碼登錄后可直接上傳war文件獲取webshell。
?
解決方案:最好刪除,如需要使用它來管理維護(hù),可更改其默認(rèn)路徑,口令及密碼。
?
?
9.絕對絕對絕對要采用預(yù)處理的方式來進(jìn)行sql操作,如果實在需要做sql語句的拼接,那么請做輸入信息的過濾。selet,update,delete,insert,and,%,',_,這些都屏蔽了吧。
?
10.一般的sql注入都是從網(wǎng)站的前臺網(wǎng)頁尋找漏洞,建議針對前臺操作和后臺操作分別建立數(shù)據(jù)庫操作用戶。前臺的用戶只賦予實際需要的基本權(quán)限。后臺用戶可權(quán)限可以寬松些但也只能針對當(dāng)前庫。切不可用root級別的用戶作數(shù)據(jù)庫連接。否則數(shù)據(jù)丟了,你都沒地方哭去。
?
11.用戶登錄表的密碼一定要加密,如果可以也可將用戶名一并加密。這是以防萬一的最后手段,當(dāng)對方看你的用戶登錄表的時候起碼看到也不知道是什么。
?
12.jsp文件集中放到指定的文件夾下,如果你使用struts那么你可以將struts使用的文件放在WEB-INF目錄下的某個文件夾中,因為該WEB-INF文件夾網(wǎng)站瀏覽用戶是看不到的。
?
13.文件上傳一定要做類型檢查,一些jsp,php,asp等程序文件堅決不能讓其上傳。如果你用的是linux?下apache+tomcat?做的jk連接,你可以將文件直接上傳到apache目錄,或者用ln作軟連接,萬一對方上傳了jsp文件你沒判斷出來,那么也是傳到了apache目錄下,你在jk指向中將jsp文件指定到tomcat中某一文件夾,對方在瀏覽器中是無法訪問上傳的jsp文件的。
?
14日志,建議增加服務(wù)的訪問日志,記錄來訪者的IP,傳遞參數(shù),對后臺操作用戶建立日志,記錄其操作內(nèi)容。完善的日志記錄可以幫助你發(fā)現(xiàn)潛在的危險,找到已經(jīng)發(fā)生的問題。
轉(zhuǎn)自:http://my.oschina.net/colorleaf/blog/199014
總結(jié)
以上是生活随笔為你收集整理的JavaWeb 安全问题及解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RequestDispatcher.fo
- 下一篇: Java中异常概述