接上篇博客,沿用JDBC分析按部门查询员工功能这篇博客中的案例代码;


一:什么是SQL注入攻击

(1)情况阐述

即在这个例子中,是通过拼凑变量和字符串的方式得到最终的SQL语句的;而这种处理方式是有很大隐患的。

(2)演示准备

如:QueryCommand类作两处更改:

(3)启动程序,SQL注入攻击演示

(4)分析

分析如下:当输入【’ or 1=1 or 1=‘】的时候,拼凑的SQL语句为:

"select  * from employee where dname='"' or 1=1 or 1='"'"

经过java程序处理完引号嵌套后的实际为:

即where的判断条件为:dname="" or 1=1 or 1="";因为1=1肯定为true,又因为筛选条件间是or的关系,所以,1=1让其他所有筛选条件都失效了,这个where的判断条件永远为true;

像这种,输入了特殊格式的字符,从而嵌入到原有SQL中,破坏原有SQL筛选条件的数据攻击方式,就是SQL注入攻击。

SQL注入攻击是网站或应用程序中非常常见的情况, 出现的根本原因在输入的数据中,并没有对像单引号这样的特殊字符作处理,所以在进行字符串拼接后,这个单引号就会作为SQL的一部分出现,并且MySQL会对其进行解析,导致出现了注入攻击的问题。SQL注入不会破坏程序的运行,但是会造成数据的泄露!!!


附:字符串拼接时:引号嵌套的分析

声明1:WHERE子句中,判断字符串的时候就需要加引号的; 如下面案例:

声明2:Java中引号嵌套的原则;

(1)单引号内只能嵌套双引号;

(2)双引号内只能嵌套单引号;

(3)如果想在双引号内再嵌套双引号,里面的双引号必须要转义(”);

即,引号嵌套的时候,保持双中套单,单中套双就可以了。

分析:上面的SQL语句:

或者可以这样看:(2021-12-5)

然后,几个案例: