.markdown-body pre,.markdown-body pre>code.hljs{color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}

MyBatis-Plus 提供了 apply 方法,用于在查询条件中直接拼接自定义的 SQL 片段。然而,直接拼接 SQL 片段可能会导致 SQL 注入 风险。为了避免 SQL 注入,需要谨慎处理用户输入,并使用参数化查询或 MyBatis-Plus 提供的安全方法。


1. apply 方法的作用

apply 方法用于在查询条件中拼接自定义的 SQL 片段。例如:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", "2023-10-01");


这里的 {0} 是占位符,MyBatis-Plus 会自动将其替换为参数值。


2. SQL 注入风险

如果直接将用户输入拼接到 SQL 片段中,可能会导致 SQL 注入。例如:

String userInput = "2023-10-01'; DROP TABLE user; --";
queryWrapper.apply("date_format(create_time, '%Y-%m-%d') = '" + userInput + "'");


生成的 SQL 可能会变成:

date_format(create_time, '%Y-%m-%d') = '2023-10-01'; DROP TABLE user; --'


这将导致严重的 SQL 注入问题。


3. 防止 SQL 注入的方法
方法 1:使用占位符和参数化查询

MyBatis-Plus 的 apply 方法支持占位符(如 {0}{1}),并会自动对参数进行转义,从而防止 SQL 注入。

String safeDate = "2023-10-01";
queryWrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", safeDate);


生成的 SQL 是安全的:

date_format(create_time, '%Y-%m-%d') = '2023-10-01'


方法 2:使用 SqlInjectionUtils 检查输入

MyBatis-Plus 提供了 SqlInjectionUtils 工具类,可以用于检查输入是否包含 SQL 注入风险。

import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils;

String userInput = "2023-10-01'; DROP TABLE user; --";
if (SqlInjectionUtils.check(userInput)) {
    throw new IllegalArgumentException("输入包含非法字符");
}
queryWrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", userInput);


方法 3:避免直接拼接 SQL

尽量避免直接拼接 SQL 片段,而是使用 MyBatis-Plus 提供的安全方法。例如,使用 eqlike 等方法:

queryWrapper.eq("date_format(create_time, '%Y-%m-%d')", "2023-10-01");



4. 最佳实践
  1. 始终使用占位符

    • 使用 {0}{1} 等占位符,而不是直接拼接字符串。
  2. 验证用户输入

    • 对用户输入进行严格的验证和过滤,确保其符合预期格式。
  3. 使用安全的 API

    • 尽量使用 MyBatis-Plus 提供的安全方法(如 eqlike 等),而不是直接拼接 SQL。
  4. 定期检查代码

    • 定期检查代码中是否存在直接拼接 SQL 的情况,及时修复潜在的安全问题。

5. 示例代码
安全使用 apply 方法:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
String safeDate = "2023-10-01";
queryWrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", safeDate);
List<User> userList = userMapper.selectList(queryWrapper);


不安全使用 apply 方法(不推荐):
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
String unsafeDate = "2023-10-01'; DROP TABLE user; --";
queryWrapper.apply("date_format(create_time, '%Y-%m-%d') = '" + unsafeDate + "'");
List<User> userList = userMapper.selectList(queryWrapper);



6. 总结
  • apply 方法可以安全使用,但必须通过占位符和参数化查询来避免 SQL 注入。
  • 避免直接拼接 SQL,始终对用户输入进行验证和过滤。
  • 使用 MyBatis-Plus 提供的工具类(如 SqlInjectionUtils)来检查输入的安全性。
  • 遵循最佳实践,确保代码的安全性和可维护性。

题外话

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的网安视频教程,之前都是内部资源,专业方面绝对可以秒杀国内99%的机构和个人教学!全网独一份,你不可能在网上找到这么专业的教程。

内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,200多G的资源,不用担心学不全。
在这里插入图片描述
因篇幅有限,仅展示部分资料,需要见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐