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. cassandra权威指南读书笔记--读写数据

    写cassandra除了轻量级事务,不支持别的事务.cassandra是追加写,写的速度非常快.cassandra还有hint日志,这个数据库总是可写的,而且单个列的写操作是原子的.hint并不是一定 ...

  2. docker(5)docker运行web应用

    前言 前面我们运行的容器并没有一些什么特别的用处. 接下来让我们尝试使用 docker 构建一个 web 应用程序. 我们将在docker容器中运行一个 Python Flask 应用来运行一个web ...

  3. [CF套题] CF-1201

    CF-1201 传送门 # = * A 500 B 1000 C 1500 D 2000 E1 2000 E2 1000 1 (2217) 1672 482 00:09 400 01:40 790 0 ...

  4. P3195 [HNOI2008] 玩具装箱(斜率优化DP)

    题目链接 设\(d[i]\)为将前 \(i\) 个玩具装入箱中所需得最小费用 容易得到动态转移方程: \[d[i] = min(d[j] + (s[i]-s[j]+i-j-1-L)^2), (j< ...

  5. 1152 Google Recruitment

    题干前半略. Input Specification: Each input file contains one test case. Each case first gives in a line ...

  6. 2019牛客多校 Round1

    Solved:4 Rank:143 A Equivalent Prefixes 题意:求一个最大的r满足在A,B两个数组中1,r里所有的子区间RMQ相等 题解:单调队列秒 #include <b ...

  7. python+requests爬取百度文库ppt

    实验网站:https://wenku.baidu.com/view/c7752014f18583d04964594d.html 在下面这种类型文件中的请求头的url打开后会得到一个页面 你会得到如下图 ...

  8. SPOJ 227 Ordering the Soldiers

    As you are probably well aware, in Byteland it is always the military officer's main worry to order ...

  9. 什么样的 SQL 不走索引

    参考: MySQL 索引优化全攻略 索引建立的规则 1.能创建唯一索引就创建唯一索引 2.为经常需要排序.分组和联合操作的字段建立索引 3.为常作为查询条件的字段建立索引 如果某个字段经常用来做查询条 ...

  10. 图片转tfrecords

    import numpy as np import tensorflow as tf import time import os import cv2 from sklearn.utils impor ...