[SQL]SQL注入与SQL执行过程(基于JDBC)
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://www.cnblogs.com/cnb-yuchen/p/17955065
出自【进步*于辰的博客】
参考笔记一,P52.2/3。
1、SQL注入
大家看这条SQL语句:
String sql = "select * from users where username = '"
+ name + + "' and password = '" + pass + "'";
这是一条由字符串拼接而成的登录SQL语句。当用户名、密码都匹配时,才能查询出用户信息,进而登录成功。
用户名和密码由表单输入,假设一种情况:
name = "yc"
pass = "123' or 1 = 1"
那拼接出的SQL语句就是:
String sql = "select * from users where username = 'yc'
and password = '123' or 1 = 1";
如此,用户名和密码已无效,皆可登录成功。
那到底什么是SQL注入?
“SQL注入”是指恶意输入表单数据,利用程序存在先生成SQL语句,后编译的漏洞,使数据库编译器误将表单数据中的字符串识别为数据库关键字,而导致SQL语句“异常”执行,进而表单失效的问题。
上述例子,pass 中带有"or",本是字符串,但数据库编译器将其识别为or关键字。
2、SQL语句执行过程
需要注意一点,以下整个过程都是在数据库中执行。
- 第一步:sql传输。表单数据提交,sql语句拼接完成,sql语句从程序传输至数据库;
- 第二步:验证。验证sql语句是否正确;
- 第三步:编译。由数据库编译器对sql语句进行编译(具体编译情况,比如:编译后文件类型是什么?存放在哪里?本人暂不清楚,大家用java编译理解就行);
- 第四步:执行判断。判断内存中是否存在具有相同sql语句的临时表。若存在,获取临时表返回给程序;
- 第五步:执行。sql语句首次执行,数据库会将sql语句和相应结果集生成并存入临时表。临时表存储于内存,而数据库存储于磁盘,故前者执行速度快于后者。
“执行判断”中一个需要注意的问题:
访问数据库时,只要重新执行sql语句即可实现刷新(重新访问),可实际上无法实现。因为sql语句执行后,会生成临时表,如果连接未关闭,临时表就仍然存在。在重新执行相同sql语句时,不会访问数据库,即无法实现刷新。
3、如何防止“SQL注入”?
(基于JDBC)当执行executexx()时,sql语句会经历以上五个步骤,由于先拼接sql语句再进行编译,故数据库会误将“or”、“and”等字符串识别为关键字,从而导致SQL注入问题。
解决方法:将执行对象 Statement 换成 PreparedStatement。
原理:
- PreparedStatement 类属于预编译。在实例化时,即
conn.preparedStatement(sql),载入了sql语句,故在程序中完成了 验证 和 编译; - Statement 类是将变量拼接进sql语句;而PreparedStatemet 类是为变量提供占位符“
?”供变量赋值,这些变量称为“预变量”。
当为“预类型”为 String 的占位符赋值时,无论变量值包含什么,都会将其视为字符串,也解决SQL注入问题。
-注:当使用 PreparedStatement 类时,由于变量位置由占位符代替,摆脱了变量作用域限制,故可实现sql语句的共享。
本文完结。
[SQL]SQL注入与SQL执行过程(基于JDBC)的更多相关文章
- (后端)sql手工注入语句&SQL手工注入大全(转)
转自脚本之家: 看看下面的1.判断是否有注入;and 1=1;and 1=2 2.初步判断是否是mssql;and user>0 3.判断数据库系统;and (select count(*) f ...
- 最新SQL手工注入语句&SQL注入大全
看看下面的1.判断是否有注入;and 1=1;and 1=2 2.初步判断是否是mssql;and user>0 3.判断数据库系统;and (select count(*) from syso ...
- SQL server 注入 和 SQL server 扩展(10.29 第二十九天)
Step1:检测注入点 Step2: select * from sysobjects (sysobjects 系统对象表,保存当前数据库的对象) select * from users wher ...
- MySQL 中一条 sql 的执行过程
一条 SQL 的执行过程 前言 查询 查询缓存 分析器 优化器 执行器 数据更新 日志模块 redo log (重做日志) binlog (归档日志) undo log (回滚日志) 两阶段提交 为什 ...
- 一文读懂一条 SQL 查询语句是如何执行的
2001 年 MySQL 发布 3.23 版本,自此便开始获得广泛应用,随着不断地升级迭代,至今 MySQL 已经走过了 20 个年头. 为了充分发挥 MySQL 的性能并顺利地使用,就必须正确理解其 ...
- Sql server注入一些tips
sql server环境测试: 几个特性: 1.sql server兼容性可以说是最差的. 举例: select x from y where id=1 字符串查询 select x from y w ...
- MyBatis 源码分析 - SQL 的执行过程
* 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析 ...
- Oracle SQL语句执行过程
前言 QQ群讨论的时候有人遇到这样的问题:where子句中无法访问Oracle自定义的字段别名.这篇 博客就是就这一问题做一个探讨,并发散下思维,谈谈SQL语句的执行顺序问题. 问题呈现 直接给出SQ ...
- 【MySQL】使用 Optimizer Trace 观察SQL执行过程
Optimizer Trace 是MySQL 5.6.3里新加的一个特性,可以把MySQL Optimizer的决策和执行过程输出成文本.输出使用JSON格式,便于程序分析和人类阅读. 使用方法 1) ...
- mysql中SQL执行过程详解与用于预处理语句的SQL语法
mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...
随机推荐
- JS leetcode 寻找旋转排序数组中的最小值 题解分析,你不得不了解的二分法
壹 ❀ 引 堕落了一天,那么接着来刷leetcode,今天做的一题不算复杂,题目来自leetcode153. 寻找旋转排序数组中的最小值,题目描述如下: 假设按照升序排序的数组在预先未知的某个点上进行 ...
- NC20811 蓝魔法师
题目链接 题目 题目描述 "你,你认错人了.我真的,真的不是食人魔."--蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不同当且仅当存在一 ...
- SSIS数据同步系统
缘起: 若干年前,刚到一家3C类的电商公司做DBA,到公司没几天,公司的CEO和研发总监,说现在要做个事情: 把IDC的数据库的数据,要同步一份到仓库,因单量大,仓库经常爆仓,仓库网络不好时,可以直接 ...
- JetBrains全系列软件激活教程激活码以及JetBrains系列软件汉化包
最新激活方式 如果安装过无限试用.修改过 hosts 请先卸载干净旧版本再安装,否需无法激活! 以 WebStorm 为例 JetBrains官网 https://www.jetbrains.com/ ...
- E4X已经被废弃,各浏览器基本上不再支持它;
E4X是一种在ECMAScript标准的基础上加入的动态XML支持的程序语言扩展. 到2019年,目前主流浏览器已经不太支持它了,一些版本的Firefox浏览器或许还可以使用,但它已经在主流浏览器的主 ...
- day06---基础优化之防火墙,yum源,字符集,vim补充,echo命令
1.系统版本号 cat /etc/redhat-release hostnamectl uname -r 2.系统 时间硬件时间 date hwclock clock hwclock systohc ...
- Android Compose开发
目录 好处 入门 Composable 布局 其他组件 列表 verticalScroll 延迟列表 内容内边距 性能 修饰符 偏移量 requiredSize 滚动 添加间距Spacer Butto ...
- 腾讯云视频转码回调 http code 405
异常信息 405 Method Not Allowed 异常场景 通过腾讯云SDK上传视频,视频转码完成回调我的接口失败,我这边一直没有log.找到腾讯云工作人员,告诉我这边返回405错误和不支持ge ...
- 【Azure Function】开启Azure Function输出详细Debug日志 ( --verbose)
When func.exe is run from VS, it suggests "For detailed output, run func with --verbose flag.&q ...
- 一文上手图数据备份恢复工具 NebulaGraph BR
作者:NebulaGraph 工程师 Kenshin NebulaGraph BR 开源已经有一段时间了,为了给社区用户提供一个更稳.更快.更易用的备份恢复工具,去年对其进行了比较大的重构.Nebul ...