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. 腾讯云TcaplusDB获新加坡MTCS最高等级安全认证

    近日,经过国际权威认证机构DNV GL的全面评估审核,TcaplusDB获得了新加坡多层云安全(以下简称"MTCS")T3级最高等级认证,这标志着TcaplusDB全面满足了新加坡 ...

  2. The 2019 Asia Nanchang First Round Online Programming Contest C. Hello 2019(动态dp)

    题意:要找到一个字符串里面存在子序列9102 而不存在8102 输出最小修改次数 思路:对于单次询问 我们可以直接区间dpOn求出最小修改次数 但是对于多次询问 我在大部分题解看到的解释一般是用线段树 ...

  3. Codeforces Testing Round #16 C.Skier

    题意: 一个人在雪地上滑雪,每次可以向上下左右四个方向移动一个单位,如果这条路径没有被访问过,则需要5秒的时间,如果被访问过,则需要1秒(注意:判断的是两点之间的距离,不是单纯的点).给你他的行动轨迹 ...

  4. C#线程Thread类

    在System.Threading 命名空间下,包含了用于创建和控制线程的Thread 类.对线程的常用操作有:启动线程.终止线程.合并线程和让线程休眠等. 1 启动线程 在使用线程前,首先要创建一个 ...

  5. 使用SignTool对软件安装包进行数字签名(二)--进行数字签名

    四.使用signcode.exe为安装程序.库或cab包签名 1.运行signcode.exe. 2.点击"下一步",选择需要签名的文件(安装程序.库或cab包). 3.点击&qu ...

  6. filter_var 函数()绕过执行命令

    escape 过滤器来过滤link,而实际上这里的 escape 过滤器,是用PHP内置函数 htmlspecialchars 来实现的 htmlspecialchars 函数定义如下: htmlsp ...

  7. LVS之DR模式部署

    一.LVS-DR数据包流向分析 为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线为1-2-3-41.Client 向目标 VIP 发出请求,Director(负载均衡器)接 ...

  8. popstate 事件 & history API

    popstate 事件 & history API URL change 当用户浏览会话历史记录时,活动历史记录条目发生更改时,将触发 Window 界面的 popstate 事件. 它将当前 ...

  9. GitHub Actions in Action

    GitHub Actions in Action https://lab.github.com/githubtraining/github-actions:-hello-world https://g ...

  10. js ^ operator

    js ^ operator 位运算 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwis ...