SQL注入解决方案思考

方案1:使用mysql的预编译机制

这种方案相当普遍,简单来说就是使用#{}进行参数传递。这是我们日常应该写的SQL方式。

方案2:检查参数,可以使用切面的方式

很不幸,前边的人已经写的代码没有使用#{}方式,这种情况下我们需要进行整改。如果采用方案1的方式,那么我们就需要对所有的SQL进行整改。此时我们可以采用方案2的方式,进行最小方式的改动。

1.首先写一个注解类,用于方法上

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SqlInjectionCheck {

}

2.写一个切面用于校验使用了注解的方法

@Aspect
@Component
public class SqlInjectionCheckAop {

    private static List list;

    static {
        list.add("select");
        list.add("delete");
        // 此处可以继续添加可能导致SQL注入的关键字,也可以加空格,大写
    }

    @Pointcut("@annotation(com.yangsh.meal.sys.annotation.SqlInjectionCheck)")
    public void sqlIntejectionCheck(){

    }

    @Around("sqlIntejectionCheck()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        // 获取参数
        Object[] args = proceedingJoinPoint.getArgs();
        for (Object o : args){
            if(o instanceof String){
                checkSqlParam((String)o);
                continue;
            }
            // 此处可添加其他type参数,例如Map、JSONObject
        }
        Object proceed = proceedingJoinPoint.proceed();
        return proceed;
    }


    private void checkSqlParam(String o) throws Exception{
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            if(o.contains(s)){
                throw new Exception("存在可能导致SQL注入的词汇");

            }
        }
    }


}

3.直接在需要的mapper方法上添加注解即可

SQL注入解决方案思考_第1张图片

具体细节,如有使用者,可以继续完善。仅作为分享。

你可能感兴趣的:(MySql,常见错误,SQL注入,Aop,annotation)