SQL注入解决方案思考
2023-12-24 10:57:01
方案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<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注入的词汇");
}
}
}
}
3.直接在需要的mapper方法上添加注解即可
具体细节,如有使用者,可以继续完善。仅作为分享。
文章来源:https://blog.csdn.net/qq_37375667/article/details/135165795
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!