天天看點

Java WEB安全問題及解決方案

1.弱密碼漏洞,最好使用至少6位的數字、字母及特殊字元組合作為密碼。資料庫不要存儲明文密碼,應存儲MD5加密後的密文,由于目前普通的MD5加密已經可以被破解,最好可以多重MD5加密。

2.未使用使用者名及密碼登入背景可直接輸入背景URL登入系統。

解決方案:通過配置filter來過濾掉無效使用者的連接配接請求。

3.JSP頁面抛出的異常可能暴露程式資訊。有經驗的入侵者,可以從JSP程式的異常中擷取很多資訊,比如程式的部分架構、程式的實體路徑、SQL注入爆出來的資訊等。

解決方案:自定義一個Exception,将異常資訊包裝起來不要抛到頁面上。

4.合法使用者“登出”後,在未關閉浏覽器的情況下,點選浏覽器“後退”按鈕,可從本地頁面緩存中讀取資料,繞過了服務端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注入漏洞,解決方案:在資料庫通路層中不要使用“+”來拼接SQL語句!如:

String sql= “SELECT * FROM USERS WHERE 1=1”; if(null != user.getUserName() && !””.equals(user.getUserName())){ sql += “ and UNAME = ‘”+user.getUserName()+”’”; } 而應使用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接口将一個參數綁定到name參數上:

List result = session.createQuery(queryString)                   .setString("name", user.getUserName())                   .list(); 6.檔案上傳漏洞。前台僅使用JS對檔案字尾做了過濾,這隻能針對普通的使用者,而惡意攻擊者完全可以修改表單去掉JS校驗。 解決方案:前台JS過濾加伺服器端程式過濾。具體過濾掉哪些檔案類型視具體情況而定。

7.可執行腳本漏洞。對使用者送出的資料未轉義,一些使用者送出的含有JavaScript腳本的資訊被直接輸出到頁面中進而被浏覽器執行。

解決方案:使用org.apache.commons.lang.StringEscapeUtils對使用者送出的資料進行轉義。如:

@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容器預設配置漏洞。如TOMCAT背景管理漏洞,預設使用者名及密碼登入後可直接上傳war檔案擷取webshell。

解決方案:最好删除,如需要使用它來管理維護,可更改其預設路徑,密碼及密碼。

9.絕對絕對絕對要采用預處理的方式來進行sql操作,如果實在需要做sql語句的拼接,那麼請做輸入資訊的過濾。selet,update,delete,insert,and,%,',_,這些都屏蔽了吧。

10.一般的sql注入都是從網站的前台網頁尋找漏洞,建議針對前台操作和背景操作分别建立資料庫操作使用者。前台的使用者隻賦予實際需要的基本權限。背景使用者可權限可以寬松些但也隻能針對目前庫。切不可用root級别的使用者作資料庫連接配接。否則資料丢了,你都沒地方哭去。

11.使用者登入表的密碼一定要加密,如果可以也可将使用者名一并加密。這是以防萬一的最後手段,當對方看你的使用者登入表的時候起碼看到也不知道是什麼。

12.jsp檔案集中放到指定的檔案夾下,如果你使用struts那麼你可以将struts使用的檔案放在WEB-INF目錄下的某個檔案夾中,因為該WEB-INF檔案夾網站浏覽使用者是看不到的。

13.檔案上傳一定要做類型檢查,一些jsp,php,asp等程式檔案堅決不能讓其上傳。如果你用的是linux 下apache+tomcat 做的jk連接配接,你可以将檔案直接上傳到apache目錄,或者用ln作軟連接配接,萬一對方上傳了jsp檔案你沒判斷出來,那麼也是傳到了apache目錄下,你在jk指向中将jsp檔案指定到tomcat中某一檔案夾,對方在浏覽器中是無法通路上傳的jsp檔案的。

14日志,建議增加服務的通路日志,記錄來訪者的IP,傳遞參數,對背景操作使用者建立日志,記錄其操作内容。完善的日志記錄可以幫助你發現潛在的危險,找到已經發生的問題。

http://blog.csdn.net/fightplane/article/details/5645035 http://www.ineeke.com/archives/1335/ http://chenjinglys.blog.163.com/blog/static/16657571620121125114016746/