【真实案例】mysql的or语句导致水平越权

理论

sql 语句中 and 和or的优先级比较

例:
select from test where condition1 or condition2 and condition3;
其执行效果与下面的sql等价:
select from test where condition1 or (condition2 and condition3);

故可以得出结论:and级别高于or

多个and 和 or 混用也是这个道理,相当于把 and 看成乘号(*), 把or看成加号(+),这样sql的执行顺序就一目了然了。

最后还是建议大家严格按照业务逻辑写sql,必要的时候毫不吝啬使用括号,就像上面的情况,如果逻辑是:condition1 且 condition2 或者 condition3,

那么请写成:select * from test where (condition1 and condition2) or condition3这样既不会出错,也方便以后查看代码。

线上case

查询应用列表,预期语义:查询某个用户下,且应用名为90009或者应用id=90009的应用信息

SELECT
    * 
FROM
    tb_app
WHERE
    1 = 1 
    AND user_id = 4002 
    AND cooperation_content <> 4 
    AND NAME = '90009' OR app_id =  90009
    AND stauts =1 
    AND type = 2

但实际上sql语句会被解析成为:

SELECT
    * 
FROM
    tb_app
WHERE
    (1 = 1 
    AND user_id = 4002 
    AND cooperation_content <> 4 
    AND NAME = '90009') 
    OR 
    (app_id =  90009
    AND stauts =1 
    AND type = 2)

这种语句,由此引发水平越权。

最优的解决方案:使用or语句时,应使用小括号来明确语义。

SELECT
    * 
FROM
    tb_app
WHERE
    1 = 1 
    AND user_id = 4002 
    AND cooperation_content <> 4 
    AND (NAME = '90009' OR app_id =  90009)
    AND stauts =1 
    AND type = 2
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、数据库介绍篇 1.1什么是数据库 数据库:保存数据的仓库。它体现我们电脑中,就是一个文件系统。然后把数据都保存...
    投石机阅读 876评论 0 0
  • SQL语句的分类 DDL(数据定义语言) 这些语句定义了不同的数据段, 数据库,表,列,索引等数据库对象。常用的语...
    Minazz阅读 819评论 0 0
  • MySQL基础操作 创建数据库 创建数据库,该命令的作用: 如果数据库不存在则创建,存在则不创建。 创建RUNOO...
    少年_323a阅读 850评论 0 0
  • # The Ruby Style Guide > Hey jude, don't make it bad. > T...
    司徒雷斯阅读 370评论 0 2
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,118评论 0 19

友情链接更多精彩内容