JavaWeb 項目安全問題及其解決方案

1.弱口令漏洞javascript

解決方案:最好使用至少6位的數字、字母及特殊字符組合做爲密碼。數據庫不要存儲明文密碼,應存儲MD5加密後的密文,因爲目前普通的MD5加密已經能夠被破解,最好能夠多重MD5加密,或者多種加密方式疊加組合。html

2.未使用用戶名及密碼登陸後臺可直接輸入後臺URL登陸系統。java

解決方案:經過配置filter來過濾掉無效用戶的鏈接請求。web

3JSP頁面拋出的異常可能暴露程序信息。有經驗的入侵者,能夠從JSP程序的異常中獲取不少信息,好比程序的部分架構、程序的物理路徑、SQL注入爆出來的信息等。sql

解決方案:自定義一個Exception,將異常信息包裝起來不要拋到頁面上。shell

4.合法用戶註銷後,在未關閉瀏覽器的狀況下,點擊瀏覽器後退按鈕,可從本地頁面緩存中讀取數據,繞過了服務端filter過濾。

解決方案:配置filter對存放敏感信息的頁面限制頁面緩存。如:數據庫

httpResponse.setHeader("Cache-Control","no-cache"); express

httpResponse.setHeader("Cache-Control","no-store");apache

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

解決方案:最好刪除,如須要使用它來管理維護,可更改其默認路徑,口令及密碼。

九、 日誌,建議增長服務的訪問日誌,記錄來訪者的 IP ,傳遞參數,對後臺操做用戶創建日誌,記錄其操做內容。完善的日誌記錄能夠幫助你發現潛在的危險,找到已經發生的問題。

-------------------------------------------------------------------------------------------------------------------------------

參數過濾

package com.founder.web.util.filter;

 

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class XssFilter implements Filter {  

  

 private String[] characterParams = null;

 private boolean OK=true;

  

    /* (non-Javadoc) 

     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 

     */  

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,ServletException {  

          HttpServletRequest servletrequest = (HttpServletRequest) request;

         

        HttpServletResponse servletresponse = (HttpServletResponse) response; 

        servletrequest.setCharacterEncoding("utf-8");

        boolean status = false;  

        Enumeration  params = servletrequest.getParameterNames();

         String param="";

         String paramValue = "";

         servletresponse.setContentType("text/html");

         servletresponse.setCharacterEncoding("utf-8");

         String str=""; 

         while (params.hasMoreElements()) {

          param = (String) params.nextElement();

          String[] values = request.getParameterValues(param);

          paramValue = "";

          if(OK){//過濾字符串爲0個時 不對字符過濾

          for (int i = 0; i < values.length; i++){

          paramValue=paramValue+values[i];//比這樣寫好   paramValue = values[i];

          }

          //去除特殊字符

          //  paramValue=trimIllegalCharacter(paramValue);

          //轉換成小寫

          paramValue=paramValue.toLowerCase();

          //characterParams=new String[]{"expression","script","mouseover","mouseon","mouseout","click","dblclick","blur","focus","change","eval"};

          System.out.print("paramValue="+paramValue);

          characterParams=new String[]{"mouseo","click","blur","focus","change","eval","expression","alert("};

          for(int i=0;i<characterParams.length;i++){

           if (paramValue.indexOf(characterParams[i]) >= 0) {

           str=characterParams[i];

            status = true;

            break; 

           }

          if(status)break;

          }

          String badStr ="";

          if(param.equals("newstype")){

       badStr= "'|and|exec|<|>|&|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|" 

+"char|declare|sitename|net user|xp_cmdshell|like'|and|exec|execute|insert|create|drop|" +

"table|from|grant|use|group_concat|column_name|" +                            "information_schema.columns|table_schema|union|where|select|delete|update|count|*|" 

      

"chr|mid|master|truncate|char|declare|--|like|%|+|#";

          }else{

       badStr= "'|and|exec|<|>|&|execute|insert|select|delete|update|drop|*|%|chr|mid|master|truncate|" +          

"char|declare|sitename|net user|xp_cmdshell|like'|and|exec|execute|insert|create|drop|" +      

"table|from|grant|use|group_concat|column_name|" +

"information_schema.columns|table_schema|union|where|select|delete|update|count|*|" +              

                      "chr|mid|master|truncate|char|declare|--|like|%|#";       

          }

             String[] badStrs = badStr.split("\\|");

                  for (int i = 0; i < badStrs.length; i++) {

                      if (paramValue.indexOf(badStrs[i]) >= 0) {

                        status = true;

                        str=badStrs[i];

            break; 

                      }

                      if(status)break;

                  }

          }

         }

         //包含這三個的額頁面不過濾 登陸相關

         boolean status_url = true;   

         StringBuffer url=  servletrequest.getRequestURL();

         String file[] = url.toString().split("/");    if(file[file.length-1].contains("login")||file[file.length-1].contains("setcookie")||file[file.length-1].contains("redirect")||file[file.length-1].contains("client")){

        status_url=false;

        }

         //購買流程相關不過濾

         if(file[file.length-1].contains("templateFlow") ||

      file[file.length-1].contains("return.jsp") ||

      file[file.length-1].contains("cashiergw") ||

      file[file.length-1].contains("cashierReturnMiddlePage") ){

         status_url=false;

         }

         if (status&&status_url){

         System.out.println("請求路徑=="+ servletrequest.getRequestURL());

         PrintWriter out = servletresponse.getWriter();

         

         String outstr="<script language='javascript'>alert('對不起!您輸入內容含有非法字符:\\"+str+"');window.history.go(-1);</script>";

         out.print(outstr);

        }else{

       filterChain.doFilter(request, response);      

         }  

    }

@Override

public void destroy() {

}

@Override

public void init(FilterConfig arg0) throws ServletException {

}    

2cookies 安全設置

HttpOnly 主要是爲了限制web頁面程序的瀏覽器端script程序讀取cookie

在web.xml 中配置

<session-config>

<cookie-config>

  <http-only>true</http-only>

</cookie-config>

    <session-timeout>1200</session-timeout>

  </session-config>

 

在tomcat 中的server.xml 中配置

<Context path="" docBase=""  useHttpOnly="true" />

 

三、http方法  訪問方式設置

 WebDAV (Web-based Distributed Authoring and Versioning)是基於 HTTP 1.1 的一個通訊協議。它爲 HTTP 1.1 添加了一些擴展(就是在 GET、POST、HEAD 等幾個 HTTP 標準方法之外添加了一些新的方法)

,使得應用程序能夠直接將文件寫到 Web Server 上,而且在寫文件時候能夠對文件加鎖,寫完後對文件解鎖,還能夠支持對文件所作的版本控制。這個協議的出現極大地增長了 Web 做爲一種創做媒體對於咱們的價值。基於 WebDAV 能夠實現一個功能強大的內容管理系統或者配置管理系統。 

    如今主流的WEB服務器通常都支持WebDAV,使用WebDAV的方便性,呵呵,就不用多說了吧,用過VS.NET開發ASP.NET應用的朋友就應該 知道,新建/修改WEB項目,其實就是經過WebDAV+FrontPage擴展作到的,下面我就較詳細的介紹一下,WebDAV在tomcat中的配 置。   

如何禁止DELETE、PUT、OPTIONS、TRACE、HEAD等協議訪問應用程序應用程序呢? 解決方法 

第一步:修改應用程序的web.xml文件的協議

 <?xml version="1.0" encoding="UTF-8"?>  

    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"   

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"       

    version="2.4">   

第二步:在應用程序的web.xml中添加以下的代碼便可  

 <security-constraint>      

<web-resource-collection>    

     <url-pattern>/*</url-pattern>     

     <http-method>PUT</http-method>

     <http-method>DELETE</http-method>  

     <http-method>HEAD</http-method> 

     <http-method>OPTIONS</http-method> 

     <http-method>TRACE</http-method> 

<http-method>MOVE</http-method>

<http-method>COPY</http-method> 

<http-method>PROPFIND</http-method> 

<http-method>SEARCH</http-method> 

<http-method>MKCOL</http-method>    

<http-method>LOCK</http-method> 

<http-method>UNLOCK</http-method> 

<http-method>PROPPATCH</http-method>  

 </web-resource-collection>  

  <auth-constraint>   </auth-constraint> 

   </security-constraint>  

  <login-config>   

   <auth-method>BASIC</auth-method> 

  </login-config>

 

 

1.弱口令漏洞

解決方案:最好使用至少6位的數字、字母及特殊字符組合做爲密碼。數據庫不要存儲明文密碼,應存儲MD5加密後的密文,因爲目前普通的MD5加密已經能夠被破解,最好能夠多重MD5加密,或者多種加密方式疊加組合。

2.未使用用戶名及密碼登陸後臺可直接輸入後臺URL登陸系統。

解決方案:經過配置filter來過濾掉無效用戶的鏈接請求。

3JSP頁面拋出的異常可能暴露程序信息。有經驗的入侵者,能夠從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

解決方案:最好刪除,如須要使用它來管理維護,可更改其默認路徑,口令及密碼。

九、 日誌,建議增長服務的訪問日誌,記錄來訪者的 IP ,傳遞參數,對後臺操做用戶創建日誌,記錄其操做內容。完善的日誌記錄能夠幫助你發現潛在的危險,找到已經發生的問題。

相關文章
相關標籤/搜索