有2种方式
[java] view plain copy /** * 初始化数据绑定 * 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继续该抽象类即可。
二种:定义自己的编辑器
[java] view plain copy 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)); } } [java] view plain copy public class MyBindingInitializer implements WebBindingInitializer { @Override public void initBinder(WebDataBinder binder, WebRequest request) { // 注册自定义的属性编辑器。这里可以注册多个属性编辑器 binder.registerCustomEditor(String.class, new StringEscapeEditor()); } }配置文件里注册下
[java] view plain copy <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="webBindingInitializer"> <bean class="com.bypay.forpay.web.common.MyBindingInitializer"/> </property> </bean>
其他注意事项:
[java] view plain copy 在Oracle中,如果SQL中有like查询,若输入条件为:'><script>alert(document.cookie)</script> [java] view plain copy sql的写法: [java] view plain copy 推荐:<if test="dbName == 'oracle'">'%'||#{name}||'%'</if> [java] view plain copy 不推荐:<if test="dbName == 'oracle'">and name like '%${merId}%'</if>这种写法会导致SQL注入问题 另外网上很多的那种XSSfilter,我自己测试只有URL的那种get请求有效,spring mvc参数直接绑定到对象的方式是不会走这个filter,也就无法防止XSS的。不知道其他人是不是也这样。