XSS
xss表示Cross Site Scripting(跨站腳本攻擊),它與SQL注入攻擊類似,SQL注入攻擊中以SQL語句作為用戶輸入,從而達到查詢/修改/刪除數據的目的,而在xss攻擊中,通過插入惡意腳本,實現對用戶游覽器的控制。Xss腳本攻擊類型分為:非持久型xss攻擊、持久型xss攻擊。
1.非持久型xss攻擊是一次性的,僅對當次的頁面訪問產生影響。非持久型xss攻擊要求用戶訪問一個被攻擊者篡改后的鏈接,用戶訪問該鏈接時,被植入的攻擊腳本被用戶游覽器執行,從而達到攻擊目的。
2.持久型xss攻擊會把攻擊者的數據存儲在服務器端,攻擊行為將伴隨着攻擊數據一直存在。
防止Xss攻擊:過濾表單提交的數據,將可疑的內容去掉。
1.繼承HttpServletRequestWrapper類,使用裝飾模式重寫HttpServletRequest的獲取參數方法
package com.soufun.wap.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.lang.StringEscapeUtils;
public class XSSRequestWrapper extends HttpServletRequestWrapper {
public XSSRequestWrapper(HttpServletRequest servletRequest) {
super(servletRequest);
}
@Override
public String[] getParameterValues(String parameter) {
String[] values = super.getParameterValues(parameter);
if ("pageChildren".equals(parameter)) {
return values;
}
if (values == null) {
return null;
}
int count = values.length;
String[] encodedValues = new String[count];
for (int i = 0; i < count; i++) {
encodedValues[i] = stripXSS(values[i]);
}
return encodedValues;
}
@Override
public String getParameter(String parameter) {
String value = super.getParameter(parameter);
return stripXSS(value);
}
private String stripXSS(String value) {
if (null != value) {
value = value.replaceAll("<", "<").replaceAll(">", ">");
value = value.replaceAll("\\(", "(").replaceAll("\\)", ")");
value = value.replaceAll("'", "'");
value = value.replaceAll("eval\\((.*)\\)", "");
value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
value = value.replaceAll("script", "");
value = StringEscapeUtils.escapeSql(value);
}
return value;
}
}
2.創建攔截器
package com.soufun.wap.filter;
import java.io.IOException;
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 com.soufun.wap.servlet.XSSRequestWrapper;
public class SqlXssFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
chain.doFilter(new XSSRequestWrapper(req), response);
}
public void destroy() {
}
}
3.配置攔截器
<filter> <filter-name>sqlXssFilter</filter-name> <filter-class>com.soufun.wap.filter.SqlXssFilter</filter-class> </filter> <filter-mapping> <filter-name>sqlXssFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
SQL注入
所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
防止sql注入的方法主要有:
1.使用存儲過程
2.校驗輸入的字符串
3.參數化sql
在設計與數據庫鏈接並訪問數據時,在需要填入數值或數據的地方,使用參數 (Parameter) 來給值,用@或?來表示參數。
