这种方案相当普遍,简单来说就是使用#{}进行参数传递。这是我们日常应该写的SQL方式。
很不幸,前边的人已经写的代码没有使用#{}方式,这种情况下我们需要进行整改。如果采用方案1的方式,那么我们就需要对所有的SQL进行整改。此时我们可以采用方案2的方式,进行最小方式的改动。
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SqlInjectionCheck {
}
@Aspect
@Component
public class SqlInjectionCheckAop {
private static List<String> 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注入的词汇");
}
}
}
}
具体细节,如有使用者,可以继续完善。仅作为分享。