在Web項目中,通常需要處理XSS,SQL注入攻擊,解決這個問題有兩個思路:
在資料進入資料庫之前對非法字元進行轉義,在更新和顯示的時候将非法字元還原
在顯示的時候對非法字元進行轉義
如果項目還處在起步階段,建議使用第二種,直接使用jstl的标簽即可解決非法字元的問題。當然,對于Javascript還需要自己處理一下,寫一個方法,在解析從伺服器端擷取的資料時執行以下escapeHTML()即可。
附:Javascript方法:
String.prototype.escapeHTML = function () {
return this.replace(/&/g, ‘&’).replace(/>/g, ‘>’).replace(/
}
如果項目已經開發完成了,又不想大批量改動頁面的話,可以采用第一種方法,此時需要借助Spring MVC的@InitBinder以及org.apache.commons.lang.PropertyEditorSupport、org.apache.commons.lang.StringEscapeUtils
public class StringEscapeEditor extends PropertyEditorSupport {
private boolean escapeHTML;
private boolean escapeJavaScript;
private boolean escapeSQL;
public StringEscapeEditor() { super(); }
public StringEscapeEditor(boolean escapeHTML, boolean escapeJavaScript, boolean escapeSQL) {
super();
this.escapeHTML = escapeHTML;
this.escapeJavaScript = escapeJavaScript;
this.escapeSQL = escapeSQL;
}
@Override
public void setAsText(String text) {
if (text == null) {
setValue(null);
} else {
String value = text;
if (escapeHTML) { value = StringEscapeUtils.escapeHtml(value); }
if (escapeJavaScript) { value = StringEscapeUtils.escapeJavaScript(value); }
if (escapeSQL) { value = StringEscapeUtils.escapeSql(value); } setValue(value); }
}
@Override
public String getAsText() { Object value = getValue(); return value != null ? value.toString() : “”; }
}
在使用StringEscapeUtils時需要注意escapeHtml和escapeJavascript方法會把中文字元轉換成Unicode編碼,如果通過标簽或者EL表達式展示時,能夠正确還原,但是如果使用類似于Ext這樣的前端元件來展示這部分内容時,不能正常還原,這也是我為什麼放棄了第一種方法,直接使用第二種方法的原因。
在上面我們做了一個EscapeEditor,下面還要将這個Editor和Spring的Controller綁定,使伺服器端接收到資料之後能夠自動轉移特殊字元。
下面我們在@Controller中注冊@InitBinder
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new StringEscapeEditor(false, false, false));
}
這個方法可以直接放到abstract Controller類中,這樣子每個Controller執行個體都能夠擁有該方法。至此第二種方法完成,但是在還原的方法暫時還沒有。O(∩_∩)O…