• E
    2020-07-27
    老师你好,请问在floor(rand(0)*2)的内容中,为什么去掉最后group by x就不报错了?

    作者回复: select count(*),floor(rand(0)*2)x from users group by x; 先该语句会产生一张虚拟表count(*)-x,该虚拟表的主键是group by后指定的x,在初始时该虚拟表为空;在执行group by的过程中,一条一条的遍历user表,获得x字段的值,该x字段的值是通过floor(rand(0)*2)计算得来;得到了x的值后,根据x的值将其插入count(*)-x表中,如果x字段的值在虚拟表count(*)-x中已经存在,就将count(*)的值增加1,如果x字段的值在虚拟表count(*)-x在虚拟表中不存在,就会将新的记录插入到该虚拟表中,在插入过程中又会执行一次floor(rand(0)*2)的计算,因为floor(rand(0)*2)是随机生成0、1数字,这也就有一定的几率导致在插入过程中生成的x的值与遍历原表过程中得到的x的值不一致,而因为只有0和1两种情况,一旦在插入过程中生成的x的值与遍历原表过程中得到的x值不一致,就会与虚拟表中已有记录的x值重复。又因为x是该虚拟表的主键,在该虚拟表中是不可以重复的,也就出现上面的报错 总的来说floor(rand(0)*2)在该语句中会执行两次,一次是在遍历原表中的数据的时候,会计算一次x的值;一次是当虚拟表中没有该x的值,准备将新的记录插入虚拟表中的时候。一旦这两次的计算结果不一致,就会导致插入过程的报错。

    共 3 条评论
    4
  • 千天
    2020-07-30
    老师,exp()注入中讲的结合后端脚本进行解析的方式,后面会有讲解么

    作者回复: 主流的报错方式就是前三种,如果同学有兴趣可以自行研究哦~

    
    
  • E
    2020-07-30
    是不是意味着如果不带上最后的group by x,其实就不会生成虚拟表?

    作者回复: 不是不会生成,而是不会报错,要理解其中每个语句的原理哦

    
    
  • Geek_3d9847
    2023-02-02 来自湖南
    这个rand() floor 和group by联合起来报错的这个对mysql的版本有要求吗?我试了几次数据表超过三行了都是没有报错的
    
    
  • Geek_3d9847
    2023-02-02 来自湖南
    我的group by那个没有报错是为啥 出来的结果是这样的 1 | root@localhost0 | | 2 | root@localhost1
    
    
  • WoodyYip鲜森
    2022-06-21
    一点五倍速下播放,老师敲键盘的声音太好听了,行云流水
    
    
  • Mrw
    2021-02-10
    老师,是不是exp()注入在mysql5.6以上的版本被修复了,还能利用么(给个搜索思路),我找到的利用方法都是5.6一下的版本。
    
    