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的子句中,但是可以出现在子句的子句中。

 

sql注入和union all关联查询的学习总结的更多相关文章

  1. 【SQL】在SQL Server中多表关联查询问题

    好久没有写SQL语句的多表连接查询,总在用框架进行持久化操作.今天写了一个多表关联查询,想根据两个字段唯一确定一条数据 失败的案例如下: SELECT cyb.id,ad.name FROM [Gen ...

  2. SQL注入之MySQL常用的查询语句

    MySQL是一种使用很广的数据库,大部分网站都是用MySQL,所以熟悉对MySQL数据库的注入很重要. 首先来说下MySQL注入的相关知识点 在MySQL5.0版本之后,MySQL默认在数据库存放一个 ...

  3. mysql数据库-初始化sql建库建表-关联查询投影问题

    下面是一个简易商城的几张表的创建方式 drop database if exists shop ; create database shop CHARACTER SET 'utf8' COLLATE ...

  4. SQL注入之Union注入攻击

    union联合查询算是最简单的一种注入了,但是却是经常遇到. 什么是UNION注入 UNION操作符用于合并两个或多个SELECT语句的结果集,而且UNION内部的SELECT语句必须拥有相同数量的列 ...

  5. sql注入之union注入

    联合查询注入利用的前提: 必须要有回显 联合查询过程: 判断是否存在注入点 判断是什么类型注入(字符型or数字型) 判断闭合方式 查询列数个数(order by) 5, 获得数据库名 获得表名 获得字 ...

  6. sql注入绕过union select过滤

    # # # #WAF Bypassing Strings: /*!%55NiOn*/ /*!%53eLEct*/ ,,)-- - +union+distinct+select+ +union+dist ...

  7. Hibernate使用sql语句实现多表关联查询

    /** * <查找list> * * @return 返回页面需要显示的数据 */ @SuppressWarnings("unchecked") public List ...

  8. 模糊查询的like '%$name$%'的sql注入避免

    Ibatis like 查询防止SQL注入的方法 Ibatis like 查询防止SQL注入的方法 mysql: select * from tbl_school where school_name ...

  9. SQL注入与参数化查询

    SQL注入的本质 SQL注入的实质就是通过SQL拼接字符串追加命令,导致SQL的语义发生了变化.为什么发生了改变呢? 因为没有重用以前的执行计划,而是对注入后的SQL语句重新编译,然后重新执行了语法解 ...

随机推荐

  1. 浅聊ARP

    今天借用思科公司的Cisco Packet Tracer Student这款软件浅聊ARP 什么是ARP? ARP即地址解析协议(Address Resolution Protocol),是根据Ip地 ...

  2. 1. Centos 7重置root密码

    1.开机启动系统,不断按"↑"和"↓",在如下引导界面按"e",编辑引导项 2.按"↓"找到下图显示的代码 删除代码最后 ...

  3. Neo4j 导入 Nebula Graph 的实践总结

    摘要: 主要介绍如何通过官方 ETL 工具 Exchange 将业务线上数据从 Neo4j 直接导入到 Nebula Graph 以及在导入过程中遇到的问题和优化方法. 本文首发于 Nebula 论坛 ...

  4. 学习一下 SpringCloud (四)-- 服务降级、熔断 Hystrix、Sentinel

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

  5. HTML复习day01

    1. 常见的浏览器内核 1 IE Trident 2 firefox Gecko 3 Safari webkit (安卓 苹果 大部分国产) 4 chrome Chromlum/blink 2. we ...

  6. A - A Gifts Fixing

    t组询问,每次给出数列长度n 以及两个长度为n的数列{ai​}和{bi​}. 有三种操作:ai​−1, bi​−1以及ai​,bi​同时− 1 -1−1. 问最少多少步以后可以让两个数列变成常数数列. ...

  7. 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)

    题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...

  8. Educational Codeforces Round 95 (Rated for Div. 2) A. Buying Torches (数学)

    题意:刚开始你有一个木棍,造一个火炬需要一个木根和一个煤块,现在你可以用一个木棍换取\(x\)个木棍,或者\(y\)根木棍换一个煤块,消耗一次操作,问最少需要操作多少次才能造出\(k\)把火炬. 题解 ...

  9. kubernetes实战-配置中心(四)分环境使用apollo配置中心

    要进行分环境,需要将现有实验环境进行拆分 portal服务,可以各个环境共用,但是apollo-adminservice和apollo-configservice必须要分开. 1.zk环境拆分为tes ...

  10. dll的注册与反注册

    regsvr32.exe是32位系统下使用的DLL注册和反注册工具,使用它必须通过命令行的方式使用,格式是:regsvr32 [/i[:cmdline]] DLL文件名命令可以在"开始→运行 ...