有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的。不知道其他人是不是也这样。