Spring 中處理XSS
阿新 • • 發佈:2019-01-05
有2種方式
一:在BaseController中定義方法
- /**
- * 初始化資料繫結
- * 1. 將所有傳遞進來的String進行HTML編碼,防止XSS攻擊
- *
- */
- @InitBinder
- protectedvoid initBinder(WebDataBinder binder) {
- // String型別轉換,將所有傳遞進來的String進行HTML編碼,防止XSS攻擊
- binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
-
@Override
- publicvoid setAsText(String text) {
- setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
- }
- @Override
- public String getAsText() {
- Object value = getValue();
-
return value != null ? value.toString() :
- }
- });
- }
其他Controller繼續該抽象類即可。 |
二種:定義自己的編輯器
- publicclass StringEscapeEditor extends PropertyEditorSupport {
- public StringEscapeEditor() {
- super();
- }
- publicvoid 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() : "";
- }
- publicstaticvoid main(String[] args) {
- String xx="'><script>alert(document.cookie)</script>";
- System.out.println(StringEscapeUtils.escapeHtml4(xx));
- }
- }
- publicclass MyBindingInitializer implements WebBindingInitializer {
- @Override
- publicvoid 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的。不知道其他人是不是也這樣。