有2种方式
一:在BaseController中定义方法
/**
* 初始化数据绑定
* 1. 将所有传递进来的String进行HTML编码,防止XSS攻击
*
*/
@InitBinder
protected void initBinder(WebDataBinder binder) {
// String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击
binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) {
setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
}
@Override
public String getAsText() {
Object value = getValue();
return value != null ? value.toString() : "";
}
});
}
其他Controller继续该抽象类即可。 |
二种:定义自己的编辑器
public class StringEscapeEditor extends PropertyEditorSupport {
public StringEscapeEditor() {
super();
}
public void setAsText(String text) {
if (text == null) {
setValue(null);
} else {
String value = text;
value = StringEscapeUtils.escapeHtml4(value);
// value = StringEscapeUtils.escapeJavaScript(value);
// value = StringEscapeUtils.escapeSql(value);
setValue(value);
}
}
public String getAsText() {
Object value = getValue();
return value != null ? value.toString() : "";
}
public static void main(String[] args) {
String xx="'><script>alert(document.cookie)</script>";
System.out.println(StringEscapeUtils.escapeHtml4(xx));
}
}
public class MyBindingInitializer implements WebBindingInitializer {
@Override
public void initBinder(WebDataBinder binder, WebRequest request) {
// 注册自定义的属性编辑器。这里可以注册多个属性编辑器
binder.registerCustomEditor(String.class, new StringEscapeEditor());
}
}
配置文件里注册下
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="com.bypay.forpay.web.common.MyBindingInitializer"/>
</property>
</bean>
其他注意事项:
在Oracle中,如果SQL中有like查询,若输入条件为:'><script>alert(document.cookie)</script>
sql的写法:
推荐:<if test="dbName == 'oracle'">'%'||#{name}||'%'</if>
不推荐:<if test="dbName == 'oracle'">and name like '%${merId}%'</if>这种写法会导致SQL注入问题
另外网上很多的那种XSSfilter,我自己测试只有URL的那种get请求有效,spring mvc参数直接绑定到对象的方式是不会走这个filter,也就无法防止XSS的。不知道其他人是不是也这样。