XSS
xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制。Xss脚本攻击类型分为:非持久型xss攻击、持久型xss攻击。
1.非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。
2.持久型xss攻击会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。
防止Xss攻击:过滤表单提交的数据,将可疑的内容去掉。
1.继承HttpServletRequestWrapper类,使用装饰模式重写HttpServletRequest的获取参数方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
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.创建拦截器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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.配置拦截器
1
2
3
4
5
6
7
8
|
<
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) 来给值,用@或?来表示参数。