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的子句中,但是可以出现在子句的子句中。
sql注入和union all关联查询的学习总结的更多相关文章
- 【SQL】在SQL Server中多表关联查询问题
好久没有写SQL语句的多表连接查询,总在用框架进行持久化操作.今天写了一个多表关联查询,想根据两个字段唯一确定一条数据 失败的案例如下: SELECT cyb.id,ad.name FROM [Gen ...
- SQL注入之MySQL常用的查询语句
MySQL是一种使用很广的数据库,大部分网站都是用MySQL,所以熟悉对MySQL数据库的注入很重要. 首先来说下MySQL注入的相关知识点 在MySQL5.0版本之后,MySQL默认在数据库存放一个 ...
- mysql数据库-初始化sql建库建表-关联查询投影问题
下面是一个简易商城的几张表的创建方式 drop database if exists shop ; create database shop CHARACTER SET 'utf8' COLLATE ...
- SQL注入之Union注入攻击
union联合查询算是最简单的一种注入了,但是却是经常遇到. 什么是UNION注入 UNION操作符用于合并两个或多个SELECT语句的结果集,而且UNION内部的SELECT语句必须拥有相同数量的列 ...
- sql注入之union注入
联合查询注入利用的前提: 必须要有回显 联合查询过程: 判断是否存在注入点 判断是什么类型注入(字符型or数字型) 判断闭合方式 查询列数个数(order by) 5, 获得数据库名 获得表名 获得字 ...
- sql注入绕过union select过滤
# # # #WAF Bypassing Strings: /*!%55NiOn*/ /*!%53eLEct*/ ,,)-- - +union+distinct+select+ +union+dist ...
- Hibernate使用sql语句实现多表关联查询
/** * <查找list> * * @return 返回页面需要显示的数据 */ @SuppressWarnings("unchecked") public List ...
- 模糊查询的like '%$name$%'的sql注入避免
Ibatis like 查询防止SQL注入的方法 Ibatis like 查询防止SQL注入的方法 mysql: select * from tbl_school where school_name ...
- SQL注入与参数化查询
SQL注入的本质 SQL注入的实质就是通过SQL拼接字符串追加命令,导致SQL的语义发生了变化.为什么发生了改变呢? 因为没有重用以前的执行计划,而是对注入后的SQL语句重新编译,然后重新执行了语法解 ...
随机推荐
- cassandra权威指南读书笔记--读写数据
写cassandra除了轻量级事务,不支持别的事务.cassandra是追加写,写的速度非常快.cassandra还有hint日志,这个数据库总是可写的,而且单个列的写操作是原子的.hint并不是一定 ...
- docker(5)docker运行web应用
前言 前面我们运行的容器并没有一些什么特别的用处. 接下来让我们尝试使用 docker 构建一个 web 应用程序. 我们将在docker容器中运行一个 Python Flask 应用来运行一个web ...
- [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 ...
- P3195 [HNOI2008] 玩具装箱(斜率优化DP)
题目链接 设\(d[i]\)为将前 \(i\) 个玩具装入箱中所需得最小费用 容易得到动态转移方程: \[d[i] = min(d[j] + (s[i]-s[j]+i-j-1-L)^2), (j< ...
- 1152 Google Recruitment
题干前半略. Input Specification: Each input file contains one test case. Each case first gives in a line ...
- 2019牛客多校 Round1
Solved:4 Rank:143 A Equivalent Prefixes 题意:求一个最大的r满足在A,B两个数组中1,r里所有的子区间RMQ相等 题解:单调队列秒 #include <b ...
- python+requests爬取百度文库ppt
实验网站:https://wenku.baidu.com/view/c7752014f18583d04964594d.html 在下面这种类型文件中的请求头的url打开后会得到一个页面 你会得到如下图 ...
- SPOJ 227 Ordering the Soldiers
As you are probably well aware, in Byteland it is always the military officer's main worry to order ...
- 什么样的 SQL 不走索引
参考: MySQL 索引优化全攻略 索引建立的规则 1.能创建唯一索引就创建唯一索引 2.为经常需要排序.分组和联合操作的字段建立索引 3.为常作为查询条件的字段建立索引 如果某个字段经常用来做查询条 ...
- 图片转tfrecords
import numpy as np import tensorflow as tf import time import os import cv2 from sklearn.utils impor ...