转 https://blog.csdn.net/weixin_41922289/article/details/88267790

利用spring AOP 实现 sql注入检测

什么是sql注入?

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 [1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击

sql注入导致原因?
SQL注入的产生原因通常表现在以下几方面:
①不当的类型处理;
②不安全的数据库配置;
③不合理的查询集处理;
④不当的错误处理;
⑤转义字符处理不合适;
⑥多个提交处理不当。

简单例子

利用spring的aop做了一个简单的检测sql注入的例子

    @Aspect@Componentpublic class LogAspect {/*** 切面类*/private Logger logger = LoggerFactory.getLogger(getClass());// 存在SQL注入风险private static final String IS_SQL_INJECTION = "输入参数存在SQL注入风险";private static final String UNVALIDATED_INPUT = "输入参数含有非法字符";private static final String ERORR_INPUT = "输入的参数非法";//切入点@Pointcut("execution(public * com.kevin.library.controller.*.*(..))")public void webLog() {}//前置通知@Before("webLog()")public void before(JoinPoint joinPoint)throws Throwable {// 接收到请求,记录请求内容ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容logger.info("URL : " + request.getRequestURL().toString());logger.info("HTTP_METHOD : " + request.getMethod());logger.info("IP : " + request.getRemoteAddr());logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));}//后置通知@AfterReturning(returning = "ret", pointcut = "webLog()")public void afterReturning(Object ret) throws Throwable {// 处理完请求,返回内容logger.info("方法的返回值 : " + ret);}//后置异常通知@AfterThrowing("webLog()")public void returnThrowing(JoinPoint joinPoint) {logger.info("方法异常时执行");}//最终通知@After("webLog()")public void after(JoinPoint joinPoint) {logger.info("方法最终执行");}//环绕通知@Around("webLog()")public Object arround(ProceedingJoinPoint pjp) {logger.info("方法环绕start.....");try {Object[] args =pjp.getArgs();// 参数String str = String.valueOf(args);if (!IllegalStrFilterUtil.sqlStrFilter(str)) {logger.info(IS_SQL_INJECTION);new RuntimeException(ERORR_INPUT);}if (!IllegalStrFilterUtil.isIllegalStr(str)) {logger.info(UNVALIDATED_INPUT);new RuntimeException(ERORR_INPUT);}Object o =  pjp.proceed();logger.info("方法环绕proceed,结果是 :" + o);return o;} catch (Throwable e) {e.printStackTrace();return null;}}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

检测工具类

    public class IllegalStrFilterUtil {private static Logger logger = LoggerFactory.getLogger(IllegalStrFilterUtil.class);private static final String REGX = "!|!|@|◎|#|#|(\\$)|¥|%|%|(\\^)|……|(\\&)|※|(\\*)|×|(\\()|(|(\\))|)|_|——|(\\+)|+|(\\|)|§ ";/*** 对常见的sql注入攻击进行拦截** @param input* @return*  true 表示参数不存在SQL注入风险*  false 表示参数存在SQL注入风险*/public static Boolean sqlStrFilter(String input) {if (input == null || input.trim().length() == 0) {return false;}input = input.toUpperCase();if (input.indexOf("DELETE") >= 0 || input.indexOf("ASCII") >= 0 || input.indexOf("UPDATE") >= 0 || input.indexOf("SELECT") >= 0|| input.indexOf("'") >= 0 || input.indexOf("SUBSTR(") >= 0 || input.indexOf("COUNT(") >= 0 || input.indexOf(" OR ") >= 0|| input.indexOf(" AND ") >= 0 || input.indexOf("DROP") >= 0 || input.indexOf("EXECUTE") >= 0 || input.indexOf("EXEC") >= 0|| input.indexOf("TRUNCATE") >= 0 || input.indexOf("INTO") >= 0 || input.indexOf("DECLARE") >= 0 || input.indexOf("MASTER") >= 0) {logger.error("该参数怎么SQL注入风险:sInput=" + input);return false;}logger.info("通过sql检测");return true;}/*** 对非法字符进行检测** @param input* @return*  true 表示参数不包含非法字符*  false 表示参数包含非法字符*/public static Boolean isIllegalStr(String input) {if (input == null || input.trim().length() == 0) {return false;}input = input.trim();Pattern compile = Pattern.compile(REGX, Pattern.CASE_INSENSITIVE);Matcher matcher = compile.matcher(input);logger.info("通过字符串检测");return matcher.find();}}

利用spring AOP 实现 sql注入检测相关推荐

  1. 基于AST抽象语法树的SQL注入检测 (2) -- 每周小结(01-02~01-08) - .Little Hann

    本周继续学习AST的SQL语法检测原理的学习,文章的接下来部分准备分为2部分进行学习: 1. SQL注入语法防御规则 2. druid中SQL注入防御模块sql-wall 1. 相关学习资料 http ...

  2. 利用Spring AOP 更新memcached 缓存策略的实现(一)

    本人参考文档:http://blog.csdn.net/ajun_studio/article/details/7343781 memcached批量删除解决方案:http://tech.ddvip. ...

  3. SQL注入检测模块开源项目DRUID-SQL-WALL学习小结

    作为sql注入原理.sql注入检测.防御系列学习的第三篇.本文主要关注了抽象语法树ast在sql注入检测上的应用开发.以及开源项目druid-sql-wall的学习,希望能给研究这一领域的朋友带来一点 ...

  4. 利用spring aop统一处理异常和打日志

    利用spring aop统一处理异常和打日志 spring aop的概念,很早就写博客介绍了,现在在工作中真正使用. 我们很容易写出的代码 我们很容易写出带有很多try catch 和 logger. ...

  5. C#SQL注入检测——特别是对于旧版.NET代码

    目录 使用Decorator模式提供添加SQL注入检测的位置 SQL注入检测代码 究竟如何检测到SQL注入? SQLExtensions类中包含的格式化方法 自定义.NET异常类 用于检测SQL注入的 ...

  6. 使用Python打造基本WEB漏洞扫描器(一) 网站爬虫+SQL注入检测

    一.实验介绍 扫描器需要实现功能的思维导图: 1.1 实验内容 编写一个简单的多线程爬虫,用于对网站地址进行爬取,编写一个简单的sql注入工具,用于对网站地址进行sql注入的检测. 1.2 实验知识点 ...

  7. javassist技术研究Sql注入检测

    AOP为Aspect Oriented Programming的缩写 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术. 日志记录,性能统计,安全控制,事务处理 Java ...

  8. 利用Spring AOP与JAVA注解为系统增加日志功能

    Spring AOP一直是Spring的一个比较有特色的功能,利用它可以在现有的代码的任何地方,嵌入我们所想的逻辑功能,并且不需要改变我们现有的代码结构. 鉴于此,现在的系统已经完成了所有的功能的开发 ...

  9. 简单好用!利用Spring AOP技术10分钟实现一个读写分离方案

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 作者 ...

  10. 利用spring AOP注解实现日志管理

    最近刚接手一个项目,在项目的开始阶段,我们的架构师分配了个任务给我,让我利用spring的切面技术做一个日志管理的案例.要求很简单,就是需要记录:谁在什么时候对谁做了什么操作,同时在日志的描述中还要有 ...

最新文章

  1. DB2 9 利用启示(733 测验)认证指南,第 7 部分: Java 编程(5)
  2. 从C语言的角度重构数据结构系列(九)-数据结构哈希表分糖果
  3. c语言局部变量存在什么区_C语言程序设计变量运用指南 C语言局部变量的存储方式和生存期...
  4. Orleans学习总结(二)--创建工程
  5. leetcode1033. 移动石子直到连续
  6. 阿里云对象存储OSS与文件存储NAS的区别
  7. 分享一篇SCCM软件更新的故障排除
  8. 教你win7显卡驱动如何安装,win7电脑显卡驱动的安装方法
  9. java 生成Excel开门篇
  10. mongodb创建local库用户_MongoDB 在系统数据库local上无法创建用户的解决方法
  11. Linux系统carplay模块,CarPlay for Android: R12d 插件源码移植到Linux
  12. 【云锁·nginx自编译web防护教程】
  13. 如何用Flutter实现跨平台移动开发
  14. 51单片机教程:二相四线步进电机驱动
  15. 开源免费3D CAD软件:FreeCAD
  16. PHP将图片和文字合成到一张背景图上
  17. 【okhttp3.OkHttpClient】ClassNotFoundException: okhttp3.OkHttpClient
  18. 哪些情况可以判定需要进行仪器校准?
  19. 嵌入式linux 从u盘启动,嵌入式 linux中dd命令[用于制作U盘启动盘的神奇的命令]
  20. 读取.nc文件数据及可视化

热门文章

  1. cad插入块_CAD制图初学入门:CAD软件中属性定义的相关应用
  2. 管家婆单机版_安稳之托 祝福管家婆软件25周年
  3. 工作报告模板下载_免费工作报告图片设计素材_第2页_包图网
  4. 搭建自己的KMS服务器
  5. 校园网下桥接无法上网原理分析如何破解
  6. 20190404 Informatic 学习一
  7. 机器学习-UCI数据库
  8. 计算机竞赛奖学金申请书,最新奖学金申请书(精选6篇)
  9. Word弹窗提示“拼写或语法错误太多,无法继续显示”的处理办法
  10. 在VSCode中使用CUDA