[程序员]这是一张只有程序员才能看懂的图片


[程序员]这是一张只有程序员才能看懂的图片
文章图片
[程序员]这是一张只有程序员才能看懂的图片
文章图片
[程序员]这是一张只有程序员才能看懂的图片
文章图片
[程序员]这是一张只有程序员才能看懂的图片
文章图片
[程序员]这是一张只有程序员才能看懂的图片
今天是刘小爱自学Java的第67天 。
感谢你的观看 , 谢谢你 。
【[程序员]这是一张只有程序员才能看懂的图片】话不多说 , 开始今天的学习:
在某技术论坛上曾流传过一张图片 。
这张图片只有程序员能看懂 。
其他人看到都是一脸懵逼 , 而程序员看到则是会心一笑 。
图片如下:
这其中就牵扯到数据库里的一个知识点:sql注入
以一个登录案例来说明这个知识点 。
一、登录案例我们用的很多软件 , 都有一个用户名和密码 , 用户的很多数据都是被存在该软件服务器里面的 。
用户登录时需要保证用户名和密码正确才能登录成功 。
好 , 现在我们来模拟这一场景 。
用sql语句创建一个用户信息表 , 然后添加数据 , 这也算是对前几天知识点的一个复习:
当然现实里的用户信息肯定不是我们自己在数据库中创建的 。 这边仅仅只是为了演示方便 。
现在要模拟用户登录的案例 , 业务逻辑如下:

  • 用户名是唯一的 。
  • 用户登录要保证用户名和密码都要正确 , 缺一不可 。
  • 查询数据库中同时满足该用户名和密码的数据数量 。
  • 如果数量为1 , 登录成功并提醒用户 。
  • 否则登录失败并提示用户检查用户名和密码 。
现在编写代码:
①获取连接、创建执行语句对象
利用我们昨天封装的jdbc工具类 , 直接获取连接 。
同时创建执行语句对象 。
②编写sql语句并执行
sql语句在Java中是以一个字符串的形式而编写的 。
所以要将其意义完成转换 。
同时因为name和pwd是两个变量 , 要将其拼接起来 。
在Java中写sql语句的时候 , 可以先在数据库中编写好并执行看看有没有问题 。
若是没有问题 , 再将其拼接成对应的Java字符串 。
③处理结果
我们查询的是满足条件的数据数量 , 也就是count(*)
调用getInt(count(*))方法可以得到满足条件的数据数量 , 根据业务逻辑:如果为1 , 登录成功;否则登录失败 。
二、登录测试以及SQL注入好 , 代码编写完成 , 我们做个测试 。
①用户名密码表中存在
所以登录成功 。
②密码1234是不正确的
所以登录失败 。
那么 , 现在问题来了 。
看③中密码1234是不正确的 , 为何登录成功了呢?
猫腻就出现在用户名上 , 这个用户名叫“liuxiaoai'--” 。
将用户名密码带入Java字符串中 , 再转换成sql语句 。
“--”在sql中是注释 , 将后面的语句给注释掉了 。
等于是只要保证前面的用户名正确 , 后面密码是啥都无所谓 , 不写都行 。
所以回到一开始的图片 , 那张车牌号做了类似的事情:


推荐阅读