接上篇博客,沿用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)
然后,几个案例: