首页 > 代码库 > Spring MVC 如何防止XSS、SQL注入攻击

Spring MVC 如何防止XSS、SQL注入攻击

 

 

在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 = http://www.mamicode.com/text;

if (escapeHTML) {   value = http://www.mamicode.com/StringEscapeUtils.escapeHtml(value); }

if (escapeJavaScript) {      value = http://www.mamicode.com/StringEscapeUtils.escapeJavaScript(value);  }

if (escapeSQL) {      value = http://www.mamicode.com/StringEscapeUtils.escapeSql(value);  }      setValue(value);     }

}

 

@Override

public String getAsText() {     Object value = http://www.mamicode.com/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));

 

-        indexRead arguments from command-line "http://www.shoudashou.com"

-        indexRead arguments from command-line "http://www.4lunwen.cn"

-        indexRead arguments from command-line "http://www.zx1234.cn"

-        indexRead arguments from command-line "http://www.penbar.cn"

-        indexRead arguments from command-line "http://www.whathappy.cn"

-        indexRead arguments from command-line "http://www.lunjin.net"

-        indexRead arguments from command-line "http://www.ssstyle.cn"

-        indexRead arguments from command-line "http://www.91fish.cn"

-        indexRead arguments from command-line "http://www.fanselang.com"

}

 

这个办法能够直接放到abstract Controller类中,这姿态每个Controller实例都能够具有该办法。至此第二种办法完结,可是在复原的办法暂时还没有。O(∩_∩)O…