在项目即将上线的渗透测试报告中检测出了sql注入的问题,关于这个问题的解决方案,最初的思路是写一个全局的过滤器,对所有请求的参数进行过滤拦截,如果存在和sql注入相关的特殊字符则拦截掉,具体细节展开以下讨论!
(当然要提供一个白名单,白名单里的请求不给予过滤)
首先提供以下白名单code.properties
# 鉴权码
# IDAM鉴权(多个以逗号分隔)
authcode=32j42i3
# 防sql注入请求白名单
sqlverify=/ryjh/mappingGroup/updateInfo,\
/author/Logon/loginConfigCheck,\
/author/Logon/login,\
/author/SAuUser/resetPwd,\
/author/SAuUser/addUser,\
/swagger-resources/configuration/ui,\
/swagger-resources,\
/doc.html
第一版的过滤器如下
/**
* @author FanJiangFeng
* @version 1.0.0
* @ClassName SqlFilter.java
* @Description 防止Sql注入过滤器,校验参数
* @createTime 2021年01月05日 17:08:00
*/
@Component
@WebFilter(value = "/")
public class SqlFilter implements Filter {
//Sql注入配置文件白名单绝对路径
@Value("${auth.authCodeUrl}")
private String url;
private boolean verify(String uri) throws IOException {
Properties properties=new Properties();
InputStream inputStream=new FileInputStream(new File(url));
properties.load(inputStream);
Map<String,String> codeMap=(Map)properties;
String whiteDoc=codeMap.get("sqlverify");
String[] strings = whiteDoc.split(",");
boolean over=false;
for(String s:strings){
if(s.equals(uri)){
over=true;
break;
}
}
return over;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)servletRequest;
String contentType = request.getContentType();
String requestURI = request.getRequestURI();
boolean verify = verify(requestURI);
if(verify){
filterChain.doFilter(servletRequest,servletResponse);
return;
}
//application/x-www-form-urlencoded
Map<String, String[]> parameterMap = request.getParameterMap();
for(Map.Entry<String,String[]> entry:parameterMap.entrySet()){
// String strings = entry.getKey();
//校验参数名是否合法
// boolean isTrue = verifySql(strings);
// if(!isTrue){
// return;
// }
//校验参数值是否合法
String[] value = entry.getValue();
for(String s:value){
//校验参数值是否合法
boolean b = verifySql(s);
if(!b){
return;
}
}
}
filterChain.doFilter(servletRequest,servletResponse);
return;
}
@Override
public void destroy() {
}
/**
* 校验参数非法字符
*/
public boolean verifySql(String parameter){
if(parameter.contains("'")){
//' 单引号
return false;
}else if(parameter.contains("\"")){
//" 双引号
return false;
}