[SQL]SQL注入与SQL执行过程(基于JDBC)

简介: [SQL]SQL注入与SQL执行过程(基于JDBC)

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";

如此,用户名和密码已无效,皆可登录成功。

那到底什么是 S Q L 注入? \color{grey}{那到底什么是SQL注入?}那到底什么是SQL注入?

“SQL注入”是指恶意输入表单数据,利用程序存在先生成SQL语句,后编译的漏洞,使数据库编译器误将表单数据中的字符串识别为数据库关键字,而导致SQL语句“异常”执行,进而表单失效的问题。

上述例子,pass 中带有"or",本是字符串,但数据库编译器将其识别为or关键字。

2、SQL语句执行过程

需要注意一点,以下整个过程都是在数据库中执行。

  • 第一步:s q l 传输 \color{green}{sql传输}sql传输。表单数据提交,sql语句拼接完成,sql语句从程序传输至数据库;
  • 第二步:验证 \color{blue}{验证}验证。验证sql语句是否正确;
  • 第三步:编译 \color{brown}{编译}编译。由数据库编译器对sql语句进行编译(具体编译情况,比如:编译后文件类型是什么?存放在哪里?本人暂不清楚,大家用java编译理解就行);
  • 第四步:执行判断 \color{purple}{执行判断}执行判断。判断内存中是否存在具有相同sql语句的临时表。若存在,获取临时表返回给程序;
  • 第五步:执行 \color{orange}{执行}执行。sql语句首次执行,数据库会将sql语句和相应结果集生成并存入临时表。临时表存储于内存,而数据库存储于磁盘,故前者执行速度快于后者。

“执行判断”中一个需要注意的问题: \color{red}{“执行判断”中一个需要注意的问题:}执行判断中一个需要注意的问题:

访问数据库时,只要重新执行sql语句即可实现刷新(重新访问),可实际上无法实现。因为sql语句执行后,会生成临时表,如果连接未关闭,临时表就仍然存在。在重新执行相同sql语句时,不会访问数据库,即无法实现刷新。

3、如何防止“SQL注入”?

(基于JDBC)当执行executexx()时,sql语句会经历以上五个步骤,由于先拼接sql语句再进行编译,故数据库会误将“or”“and”等字符串识别为关键字,从而导致SQL注入问题。

解决方法: \color{green}{解决方法:}解决方法:将执行对象 Statement 换成 PreparedStatement。

原理: \color{red}{原理:}原理:

  1. PreparedStatement 类属于预编译。在实例化时,即conn.preparedStatement(sql),载入了sql语句,故在程序中完成了 验证编译
  2. Statement 类是将变量拼接进sql语句;而PreparedStatemet 类是为变量提供占位符“?”供变量赋值,这些变量称为预变量 \color{green}{预变量}预变量
    当为“预类型”为 String 的占位符赋值时,无论变量值包含什么,都会将其视为字符串,也解决SQL注入问题。
    -注:当使用 PreparedStatement 类时,由于变量位置由占位符代替,摆脱了变量作用域限制,故可实现sql语句的共享。

本文完结。


相关文章
|
1月前
|
SQL 监控 安全
SQL注入的实现原理以及防止
SQL注入的实现原理以及防止
|
2月前
|
SQL 数据库
20、绕过去除and、or、union select、空格的sql注入
20、绕过去除and、or、union select、空格的sql注入
32 0
|
2月前
|
SQL 数据库
小课堂 -- 绕过去除特殊字符的sql注入
小课堂 -- 绕过去除特殊字符的sql注入
22 0
|
1月前
|
SQL Java 应用服务中间件
Java项目防止SQL注入的四种方案
Java项目防止SQL注入的四种方案
41 0
|
2月前
|
SQL 安全 关系型数据库
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞,品相还不错,可执行任意 SQL 语句。 总之,吃了一惊,一个防 SQL 注入的工具居然也有 SQL 注入漏洞。 请看这段代码
418 1
|
9天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
17 0
|
17天前
|
SQL 安全 PHP
CTF--Web安全--SQL注入之Post-Union注入
CTF--Web安全--SQL注入之Post-Union注入
|
1月前
|
SQL 安全 测试技术
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
15 0
|
1月前
|
SQL 存储 缓存
【SQL】Mysql中一条sql语句的执行过程
【SQL】Mysql中一条sql语句的执行过程
33 0
|
1月前
|
SQL 安全 API