1、一般的系统都默认有admin账号,如果我能获取到admin的密码就可以,登录后搞破坏。
2、第一步:新建一个账号 admin'#123,就会在数据库增加一条记录
特别说明,账号中包含引号在英语中是有效的,比如:NBA的 Shaq O'neal
3、第二部:使用admin'#123账号登录,并修改密码,拼接的SQL为:
update user set passwd='123456' where name=''
我们帮账号放进去,变成:
update user set passwd='123456' where name='admin'#123'
本来的SQL是认为admin'#123是一个整体,但是替换后,单引号闭合,绕过了原本的SQL语义
修改admin账号的密码,就可以使用 admin/123456登录
4、SQL注入的主要因素是改变SQL语义,绕过正常的逻辑检查,那我们继续追问,而这个又因为SQL是描述性语言,我们使用的编程是过程式语言。
SQL只要告诉想要什么就可以,而C++等编程语言需要自己实现做么做
比如这个逻辑,查找重名的员工名称
select name from staff group by name having count(name) > 1;
5、这个很好理解,比方说有个员工集合,找出年龄大于20岁的
SQL一个语句就可以,而编程语言需要遍历集合,判断,然后保存结果
6、事情不是绝对的,随着语言的发展,二者会相互交叉。
高级语言现在都有SQL的倾向,比方说C#,Java等,结合lambda表达式
List<People> data = list.stream().filter(a -> a.getAge().greater(20)).collect(Collectors.toList());
有人也把这个叫做语法糖
而SQL语言也有这种需求,就是逐个记录进行业务逻辑处理,这就是游标