現在做的項目之前沒有考慮到js注入的問題,現在想通過在spring對資料進行綁定時,去除html標籤來在後端防止js注入,首先先研讀它的源碼,我們大部分controller都是擴充MultiActionController這個類,用到的是bind(HttpServletRequest request, Object command)這個方法,它是通過調用createBinder方法建立ServletRequestDataBinder類來進行資料繫結,ServletRequestDataBinder類裡面的getInternalBindingResult方法就是返回綁定的結果,我們可以在這方法裡面加上自己的屬性編輯器(擴充PropertyEditorSupport類)對參數進行處理,於是實現的步驟是:1、寫個擴充PropertyEditorSupport類的字串處理類
2、定義自訂ServletRequestDataBinder,重寫getInternalBindingResult方法,3、擴充MultiActionController,重寫createBinder方法。
1.StringEditor類
public class StringEditor extends PropertyEditorSupport{ @Override public void setAsText(String text) throws IllegalArgumentException { if (text == null || (text = text.trim()).length() == 0) { return; } try { //去除html標籤 String str = text.replaceAll("<[a-zA-Z]+[1-9]?[^><]*>", "") .replaceAll("</[a-zA-Z]+[1-9]?>", ""); setValue(str); } catch (Exception e) { throw new IllegalArgumentException(e); } }}
2.CustomRequestDataBinder類
public class CustomRequestDataBinder extends ServletRequestDataBinder { public CustomRequestDataBinder(Object target) { super(target); } public CustomRequestDataBinder(Object target, String objectName) { super(target, objectName); } @Override protected AbstractPropertyBindingResult getInternalBindingResult() { AbstractPropertyBindingResult bindingResult = super.getInternalBindingResult(); PropertyEditorRegistry registry = bindingResult.getPropertyEditorRegistry(); registry.registerCustomEditor(String.class, new StringEditor()); return bindingResult; }}
3.CustomMultiActionController 類
public class CustomMultiActionController extends MultiActionController{ @Override public ServletRequestDataBinder createBinder(HttpServletRequest request, Object command) throws Exception { CustomRequestDataBinder binder = new CustomRequestDataBinder(command, getCommandName(command)); initBinder(request, binder); return binder; }}
這樣的話只要你的Controller擴充了CustomMultiActionController ,在進行資料繫結時就會把提交的資料中的html標籤去除,如果某些屬性需要有html標籤的話就通過request.getParameter來擷取沒轉換的資料。
這隻是一個簡單的例子,你還可以擴充其它的屬性編輯器,比如時間格式的,在提交時統一把date轉換為某種格式儲存。