原文链接地址:SpringMVC设置XSS攻击
XSS攻击防御主要是针对用户输入项的HTML标签进行处理。例如:【>】修改成【>】; 【<】修改成【&】等
SpringMVC中处理的主要逻辑是,在Spring绑定入参的时候,针对参数进行处理。通过Spring提供的@InitBinder进行处理。
这个方法可以写在一个公共的BaseController中,其他Controller需要继承BaseController。
代码示例如下:
1 @Controller 2 3 public class BaseController { 4 5 @InitBinder 6 7 public void initBinder(ServletRequestDataBinder binder) { 8 9 /** 10 11 * 自动转换日期类型的字段格式 12 13 */ 14 15 binder.registerCustomEditor(Date.class, new CustomDateEditor( 16 17 new SimpleDateFormat("yyyy-MM-dd"), true)); 18 19 /** 20 21 * 防止XSS攻击 22 23 */ 24 25 binder.registerCustomEditor(String.class, new StringEscapeEditor(true, false)); 26 27 } 28 29 }
在StringEscapeEditor中,针对String类型的参数,进行特殊符号的替换
1 public class StringEscapeEditor extends PropertyEditorSupport { 2 3 4 5 private boolean escapeHTML;// 编码HTML 6 7 8 9 private boolean escapeJavaScript;// 编码javascript 10 11 12 13 public StringEscapeEditor() { 14 15 super(); 16 17 } 18 19 20 21 public StringEscapeEditor(boolean escapeHTML, boolean escapeJavaScript) { 22 23 super(); 24 25 this.escapeHTML = escapeHTML; 26 27 this.escapeJavaScript = escapeJavaScript; 28 29 } 30 31 32 33 @Override 34 35 public String getAsText() { 36 37 38 39 Object value = getValue(); 40 41 return value != null ? value.toString() : ""; 42 43 } 44 45 46 47 @Override 48 49 public void setAsText(String text) throws IllegalArgumentException { 50 51 52 53 if (text == null) { 54 55 setValue(null); 56 57 } else { 58 59 String value = text; 60 61 if (escapeHTML) { 62 63 value = HtmlUtils.htmlEscape(value); 64 65 } 66 67 if (escapeJavaScript) { 68 69 value = JavaScriptUtils.javaScriptEscape(value); 70 71 } 72 73 setValue(value); 74 75 } 76 77 } 78 79 80 81 }