1.弱口令漏洞javascript
解決方案:最好使用至少6位的數字、字母及特殊字符組合做爲密碼。數據庫不要存儲明文密碼,應存儲MD5加密後的密文,因爲目前普通的MD5加密已經能夠被破解,最好能夠多重MD5加密,或者多種加密方式疊加組合。html
2.未使用用戶名及密碼登陸後臺可直接輸入後臺URL登陸系統。java
解決方案:經過配置filter來過濾掉無效用戶的鏈接請求。web
3.JSP頁面拋出的異常可能暴露程序信息。有經驗的入侵者,能夠從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 ,傳遞參數,對後臺操做用戶創建日誌,記錄其操做內容。完善的日誌記錄能夠幫助你發現潛在的危險,找到已經發生的問題。
-------------------------------------------------------------------------------------------------------------------------------
1 參數過濾
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 {
}
}
2、cookies 安全設置
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來過濾掉無效用戶的鏈接請求。
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。
解決方案:最好刪除,如須要使用它來管理維護,可更改其默認路徑,口令及密碼。
九、 日誌,建議增長服務的訪問日誌,記錄來訪者的 IP ,傳遞參數,對後臺操做用戶創建日誌,記錄其操做內容。完善的日誌記錄能夠幫助你發現潛在的危險,找到已經發生的問題。