SpringMVC解决SQL注入
参考自 [spring解决SQL注入问题:自定义拦截器][https://blog.csdn.net/lj1548259095/article/details/53405088]
一、简介
一个开发好的系统,如果没有增加防SQL注入,那么别人可能会通过SQL注入去对数据库进行非法操作。所以增加防SQL注入就显的比较关键。
二、解决思路
在配置类中设置SQL注入拦截器,通过判断用户输入的参数中是否包含非法攻击性字符来拦截请求。
三、具体实现
1、创建一个拦截器
package *******;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
/**
* @author Lurious
* @version 1.0
* @date 2020/12/2 9:44
* SQL注入拦截器
*/
@Slf4j
@Component
public class SqlInjectInterceptor implements HandlerInterceptor{
@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("参数含有非法攻击字符,已禁止继续访问!");
log.error("参数含有非法攻击字符,已禁止继续访问!"+value);
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|select|update|delete|drop|truncate|exec|insert|group|AND|chr|mid|master|char|declare|%20|=|-|--|;|'|%|<|>|&|*|#|+|,|//|/| |\\|!=|(|)";
String[] xssArr = xssStr.split("\\|");
// 如果包含特殊字符,则开启拦截
for (String s : xssArr) {
if (value.contains(s)) {
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;
}
}
2、在配置中注册拦截器,让其生效。
@Configuration
@EnableAspectJAutoProxy
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Autowired
private LoginInterceptor loginInterceptor;
@Autowired
private SqlInjectInterceptor sqlInjectInterceptor;
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 单页面应用路由配置
//-------------------------
}
@Bean
public ModelMapper modelMapper(){
return new ModelMapper();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/")
.setCachePeriod(600);
//----------------------------
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
List<String> patterns = Lists.newArrayList();
patterns.add("/**");
// 登陆拦截器
registry.addInterceptor(loginInterceptor).addPathPatterns(patterns);
// 添加sql注入拦截器
registry.addInterceptor(sqlInjectInterceptor).addPathPatterns("/api/**");
super.addInterceptors(registry);
}
}
三、存在的问题
1、测试后如果发现sql没有生效,那么可能是因为整个项目中还有其他类继承了WebMvcConfigurationSupport 。
四、检测
添加完配置之后,可以使用SQLmap工具进行检测,验证SQL拦截器是否生效。