Spring MVC通过拦截器处理sql注入跨站XSS攻击风险
Posted plain-heart
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC通过拦截器处理sql注入跨站XSS攻击风险相关的知识,希望对你有一定的参考价值。
sql注入就是通过url或者post提交数据时候,字符串类型的参数会被别人利用传入sql语句,最终破坏数据库或者达到一些见不得人的目的。
有时候因为业务需要url中会带一些参数,比如 ?type=xxx 一些人就会把type写成sql语句
比如:?type=’ or 1=1– 最终拼接成的sql语句就变成了:select * from table where disabled=0 and type=” or 1=1 – and id=1 如此一来 – 后面的条件就会被屏蔽,结果就成了 1=1 也就是查询这张表所有数据。
这还算是最温柔的,更有甚者,把输入的参数变成update delete drop 不就麻烦大了。
跨站攻击和链接注入差不多,会有一些java、html的代码注入进来。一样的处理。
下面说一下最简单、直接、有效的方式吧:
直接写一个spring的拦截器来处理一下,sql注入的就直接拦截不给访问了,因为一些乱七八糟的参数也是无法正常继续访问的,其他注入清理一下就行了:
package org.jeecgframework.core.interceptors;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SqlInjectInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
Enumeration<String> names = arg0.getParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String[] values = arg0.getParameterValues(name);
for(String value: values){
//sql注入直接拦截
if(judgeSQLInject(value.toLowerCase())){
arg1.setContentType("text/html;charset=UTF-8");
arg1.getWriter().print("参数含有非法攻击字符,已禁止继续访问!");
return false;
}
//跨站xss清理
clearXss(value);
}
}
return true;
}
/**
* 判断参数是否含有攻击串
* @param value
* @return
*/
public boolean judgeSQLInject(String value){
if(value == null || "".equals(value)){
return false;
}
String xssStr = "and|or|select|update|delete|drop|truncate|%20|=|-|--|;|‘|%|#|+|,|//|/| |\\|!=|(|)";
String[] xssArr = xssStr.split("\\|");
for(int i=0;i<xssArr.length;i++){
if(value.indexOf(xssArr[i])>-1){
return true;
}
}
return false;
}
/**
* 处理跨站xss字符转义
*
* @param value
* @return
*/
private String clearXss(String value) {
if (value == null || "".equals(value)) {
return value;
}
value = value.replaceAll("<", "<").replaceAll(">", ">");
value = value.replaceAll("\\(", "(").replace("\\)", ")");
value = value.replaceAll("‘", "‘");
value = value.replaceAll("eval\\((.*)\\)", "");
value = value.replaceAll("[\\\"\\\‘][\\s]*javascript:(.*)[\\\"\\\‘]",
"\"\"");
value = value.replace("script", "");
return value;
}
}
然后spring-mvc.xml配置中加入拦截器:
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="org.jeecgframework.core.interceptors.SqlInjectInterceptor" />
</mvc:interceptor>
至此,测试一波,基本解决问题。
转载请注明出处@Sychel
以上是关于Spring MVC通过拦截器处理sql注入跨站XSS攻击风险的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用