zoukankan      html  css  js  c++  java
  • sql注入和union all关联查询的学习总结

    1、后台从页面取值进行sql查询时最好不要直接拼,如下代码:

     String sql = "SELECT wo.* " +
                    " from push_command pu " +
                    " left join work_order wo on pu.wo_id=wo.wo_id" +
                    " left join firewall_device fi on pu.device_ip = fi.ip where pu.command like '%" + filter + "%' and pu.command IS NOT NULL";

    用从页面传递过来的filter作为条件进行查询,然后后台直接拼接,这样会导致sql恶意注入,从而影响查询结果。如过将filter传值  %' or 1=1 or pu.command like '% 拼接的sql如下:

    SELECT wo.*  from push_command pu  left join work_order wo on pu.wo_id=wo.wo_id left join firewall_device fi on pu.device_ip = fi.ip where pu.command like '%%' or 1=1 or pu.command like '%%' and pu.command IS NOT NULL

    这样得到的结果将是数据库所有的数据,重点看标红的地方1=1 是永远成立的。当然防止sql注入的方式还有很多种,页面添加验证,使用PreparedStatement等方法。


    2、最近遇到遇到一个需求,未推送的工单按照工单创建时间倒叙,已推送工单按照推送时间倒叙,先展示未推送的然后展示已推送的,划重点啊,两个查询排序条件不一样,查询条件不一样,最后结果排序还要先展示未推送的,这时候就用到关联结果集的union了。

    首先说一下,union 单独使用的时候会将数据进行去重处理。union all则是将两个结果集全部关联,不进行去重处理。然后下边就是需要注意得了。

    
    
    select * from work_order where state != '4' ORDER BY CREATE_TIME desc 
    union all
    select * from work_order where state = '4' ORDER BY PUSH_TIME desc
    直接这么用,会报错的,因为union在没有括号的情况下只能使用一个order by。这个语句有2种修改方法。如下: 

    1)可以将前面一个order by去掉,改成如下:
    select * from work_order where state != '4' 
    union all
    select * from work_order where state = '4' ORDER BY PUSH_TIME desc
    该sql的意思就是先union,然后对整个结果集进行order by,但是这样就达不到咱们的要求了,因为咱们两个查询语句的排序条件是不一样的,所以继续看下边吧。 

    2)可以通过两个查询分别加括号的方式,改成如下:
    (
    select * from (select * from work_order where state != '4' ORDER BY CREATE_TIME desc)

    uinon all
    (select * from work_order where state = '4' ORDER BY PUSH_TIME desc)
    这种方式的目的是为了让两个结果集先分别order by,然后再对两个结果集进行union。但是你会发现这种方式虽然不报错了,但是两个order by并没有效果,所以应该改成如下:

    select * from (select * from (select * from work_order where state != '4' ORDER BY CREATE_TIME desc) t1

    union all
    select * from (select * from work_order where state = '4' ORDER BY PUSH_TIME desc) t2) t3
    也就是说,order by不能直接出现在union的子句中,但是可以出现在子句的子句中。

     

  • 相关阅读:
    周总结(第十一周)
    周总结(第十周)
    周总结(第九周)
    周总结(第八周)
    周总结(第七周)
    周总结(第六周)
    周总结(第5周)
    周总结(第四周)
    周记
    补周记
  • 原文地址:https://www.cnblogs.com/qcq0703/p/13613215.html
Copyright © 2011-2022 走看看