admin管理员组

文章数量:1794759

Springboot集成防sql注入设置

Springboot集成防sql注入设置

防sql注入为系统开发最基础的安全开发要求,在此分享基于过滤器和功能可开关的防sql注入写法,仅供学习交流使用。

SqlFilterConfigUtils 为sql注入防护开关工具类,可以灵活开启和关闭sql防注入功能

import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * @Auther: GMY * @Date: 2022/09/15/14:24 * @Description: sql注入防护开关工具类 */ @Component public class SqlFilterConfigUtils { /** * sql注入防护开关配置 */ public static Boolean openSqlProtect; /** * sql注入防护开关配置,默认为开启 */ public static Boolean getOpenSqlProtect() { return openSqlProtect == null ? true : openSqlProtect; } @Value("${open.sql.protect}") public void setOpenSqlProtect(Boolean openSqlProtect) { SqlFilterConfigUtils.openSqlProtect = openSqlProtect; } }

SqlFilter  为sql防注入过滤器,用来拦截过滤用户请求,检测是否有sql注入攻击

import org.springframework.context.annotation.Configuration; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; import java.util.Enumeration; /** * @Auther: GMY * @Date: 2022/09/15/14:13 * @Description: sql防注入过滤器 */ @WebFilter(urlPatterns = "/*",filterName = "sqlFilter") @Configuration public class SqlFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } /** * @param servletRequest * @param servletResponse * @param filterChain * @return void * @author GMY * @date 2022/9/15 14:17 * @description sql注入过滤 */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ServletRequest request = servletRequest; ServletResponse response = servletResponse; // 如果sql防注入关闭,则不执行后续校验操作 if(!SqlFilterConfigUtils.getOpenSqlProtect()) { filterChain.doFilter(request,response); } else { // 获得所有请求参数名 Enumeration<String> names = request.getParameterNames(); String sql = ""; while (names.hasMoreElements()){ // 得到参数名 String name = names.nextElement().toString(); // 得到参数对应值 String[] values = request.getParameterValues(name); for (int i = 0; i < values.length; i++) { sql += values[i]; } } if (sqlValidate(sql)) { throw new IOException("您发送请求中的参数中含有非法字符"); } else { filterChain.doFilter(request,response); } } } /** * @param str * @return boolean * @author GMY * @date 2022/9/15 14:16 * @description 匹配效验 */ protected static boolean sqlValidate(String str){ // 统一转为小写 String s = str.toLowerCase(); // 过滤掉的sql关键字,特殊字符前面需要加\\\\进行转义 String badStr = "select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|table|"+ "char|declare|sitename|xp_cmdshell|like|from|grant|use|group_concat|column_name|" + "information_schema.columns|table_schema|union|where|order|by|" + "'\\\\*|\\\\;|\\\\-|\\\\--|\\\\+|\\\\,|\\\\//|\\\\/|\\\\%|\\\\#"; //使用正则表达式进行匹配 boolean matches = s.matches(badStr); return matches; } @Override public void destroy() { } }

以上代码仅供学习交流使用,代码中涉及到真实项目信的内容我都做了相应修改

本文标签: SpringBootSQL