网站地图    收藏   

主页 > 后端 > 网站安全 >

Spring MVC 如何防止XSS、SQL注入攻击 - 网站安全 -

来源:自学PHP网    时间:2015-04-17 13:03 作者: 阅读:

[导读] 在Web项目中,通常需要处理XSS,SQL注入攻击,解决这个问题有两个思路:在数据进入数据库之前对非法字符进行转义,在更新和显示的时候将非法字符还原在显示的时候对非法字符进行转...

在Web项目中,通常需要处理XSS,SQL注入攻击,解决这个问题有两个思路:
 
在数据进入数据库之前对非法字符进行转义,在更新和显示的时候将非法字符还原
在显示的时候对非法字符进行转义
如果项目还处在起步阶段,建议使用第二种,直接使用jstl的<c:out>标签即可解决非法字符的问题。当然,对于Javascript还需要自己处理一下,写一个方法,在解析从服务器端获取的数据时执行以下escapeHTML()即可。
 
附:Javascript方法:
 
String.prototype.escapeHTML = function () {
return this.replace(/&/g, ‘&’).replace(/>/g, ‘>’).replace(/</g, ‘<’).replace(/”/g, ‘"’);
}
 
如果项目已经开发完成了,又不想大批量改动页面的话,可以采用第一种方法,此时需要借助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() : “”;    }
}
 www.2cto.com
在使用StringEscapeUtils时需要注意escapeHtml和escapeJavascript方法会把中文字符转换成Unicode编码,如果通过<c:out>标签或者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…

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论