spirngmvc解决SQL注入

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拦截器是否生效。

你可能感兴趣的:(spring)