dbaplus社群 2024年11月22日
谁写的?这样的SQL太吓人了吧!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

文章探讨了在MySQL数据库中如何防止因误操作导致的全表更新问题。首先介绍了全表更新的危害,然后详细讲解了sql_safe_updates参数的用途和使用方法,以及如何通过MyBatis-Plus的非法SQL拦截插件和IDEA插件进行SQL安全检查。此外,文章还强调了代码审查在预防此类问题中的重要性,并以一个案例引出如何修改存在风险的SQL语句。文章旨在帮助开发者提升数据库操作安全性,避免因误操作导致数据丢失或损坏。

🤔 **全表更新的危害:**在生产环境中,若UPDATE语句缺少WHERE条件,会导致全表数据被更新,后果不堪设想。

⚙️ **sql_safe_updates参数:**MySQL提供sql_safe_updates参数,可在会话或全局级别启用,阻止没有WHERE子句的UPDATE和DELETE语句执行,增强数据安全性。

🛡️ **MyBatis-Plus非法SQL拦截插件:**MyBatis-Plus框架提供了IllegalSQLInnerInterceptor插件,可以拦截全表更新、删除等高风险操作,并检查SQL语句的索引使用情况、授权等,有效降低数据风险。

🔎 **IDEA插件:**一些IDEA插件可以帮助开发者检测有风险的SQL语句,但并非所有情况都能覆盖,需要结合其他手段。

📝 **Code Review:**代码审查是发现潜在问题的有效手段,通过人工检查可以及时发现并解决SQL语句中的潜在风险。

江南一点雨 2024-11-22 07:16 广东

大家平时都是这么写的吗?

昨天笔者在朋友圈发了这样一张图:



很多小伙伴看到了能够快速发现问题,当 company_id 为 null 的时候,会导致全表更新。


但是也有小伙伴不解,自己平时就是这么写的呀,也没什么问题,如果有问题,那么上面的 SQL 该怎么改呢?


笔者来和大家简单聊几句。


一、防止全表更新


如果在生产环境中使用 UPDATE 语句更新表数据,此时如果忘记携带本应该添加的 WHERE 条件,那么后果不堪设想。


那么怎么避免这个问题呢?


二、sql_safe_updates


sql_safe_updates 是 MySQL 数据库中的一个参数,它的作用是增强数据安全性,防止因误操作导致的数据丢失或破坏。


具体来说,当 sql_safe_updates 设置为 ON(启用)时,MySQL 将阻止执行没有明确 WHERE 子句的 UPDATE 或 DELETE 语句。这意味着如果试图运行一个不包含 WHERE 条件来限定更新或删除范围的 DML 语句,MySQL 会抛出一个错误。而当 sql_safe_updates 设置为 OFF(禁用)时,MySQL 不会对此类无条件更新或删除操作进行特殊限制,允许它们按常规方式执行


这个参数可以配置在会话级别或全局级别。


在会话级别,可以通过执行 SET sql_safe_updates = 1; 命令来启用,这只对当前连接有效。


在全局级别,可以通过 SET GLOBAL sql_safe_updates = 1; 命令或在 MySQL 配置文件中设置,这会影响服务器上所有新的会话,但是这个配置不会修改当前会话。


启用 sql_safe_updates 参数可以减少因人为失误引发的重大数据事故,尤其适合开发环境和对数据完整性要求严格的生产环境。


我们可以先执行 SHOW VARIABLES LIKE '%sql_safe_updates%'; 查看当前配置:



然后执行 SET sql_safe_updates = 1; 去更新,更新之后再去查看配置,发现 sql_safe_updates 就已经开启了:



这个时候,假设我们执行如下 SQL:


UPDATE user set username='javaboy';


就会报一个错误:



需要注意的是,启用 sql_safe_updates 参数可能会影响现有应用程序的正常运行,特别是那些依赖于无条件更新或删除操作的程序,因此在生产环境中启用之前,必须确保所有相关的应用程序代码已经过严格审查和适配。


三、SQL 插件


MyBatis-Plus 提供了一个非法 SQL 拦截插件叫做 IllegalSQLInnerInterceptor。这是 MyBatis-Plus 框架中的一个安全控制插件,用于拦截和检查非法 SQL 语句。


这个插件主要提供了四方面的功能:



插件用法也简单,配置一个 Bean 即可:


@Configurationpublic class MybatisPlusConfig {
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加非法SQL拦截器 interceptor.addInnerInterceptor(new IllegalSQLInnerInterceptor()); return interceptor; }}

配置完成后,如果执行了不带 where 条件的 update 或者 delete 语句,就会报如下错误。



但是!!!


如果你的 SQL 后面有个 where 1=1,那么这样的 SQL 是不会被 IllegalSQLInnerInterceptor 插件识别并拦截的。


四、IDEA 插件


利用 IDEA 的一些插件,也可以检测到有风险的 SQL,比如笔者常用的这个:



不过这些插件不一定能检测出来文章一开始所提出的问题。


五、Code Review


日常的 Code Review 也不可少,很多问题都是在 CR 的时候发现的。


六、问题解决


除了上面提到的各种办法之外,对于本文一开始提出的问题,这个有问题的 SQL 还可以做哪些修改呢?


欢迎小伙伴们评论区给出自己的答案~笔者也会在评论区给出我的看法!


作者丨江南一点雨

来源丨公众号:江南一点雨(ID:a_javaboy)

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn


活动推荐


为了和大家一起探索AI相关技术在大数据、数据资产管理、数据库、运维等领域的最佳落地方式,挖掘由此激发的软件发展和技术进步,第九届DAMS中国数据智能管理峰会将于2024年11月29日在上海举办,携手一众产学研界技术领跑单位,带来新思路、重实践、可落地的全日干货盛宴。码上报名↓

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

MySQL 全表更新 SQL安全 MyBatis-Plus Code Review
相关文章