SQL注入原理及防御
一、SQL注入原理
1.什么是SQL注入?
因为基本上每一个Web应用底层都需要使用数据库来保存所需的各种数据,与数据库交互的方式就是程序生成并向数据库提交一些SQL语句来完成数据的CRUD操作
那么一旦这些SQL语句被恶意篡改、被控制,攻击者在原有SQL语句上拼接上一些关键字,从而改变该SQL语句的愿意,从而使得SQL语句经数据库操作后变成攻击者想要达到的效果,比如读取到攻击想要知道的信息、修改某些数据。最严重情况下,攻击者可以利用SQL注入读取甚至修改数据库中所有数据——这就是SQL注入
现实中发生过很多案例,如利用SQL注入修改管理员账户、密码,如家的后台系统数据库整个被拖库,导致用户信息泄露
2.SQL注入原理
用一个简单的例子:如以下为某个网站的用户登录场景 假设该网站登录校验的底层SQL语句就是:
select * from user where username='用户输入' and password='用户输入'
那么返回数据count>0就代表存在该用户,否则不存在
若此时我们输入的用户名为:‘or’ 1=1 那么会导致什么结果呢? 此时SQL语句变为:
select * from user where username='' or '1=1' and password='用户输入'
where后面的查询条件就变成了用户等于空,或者1=1,1=1为恒等式,有了1=1,后面语句也就都没有了意义,此时会查询到所有用户数据,则返回的count自然就>0,导致登录成功
二、SQL注入的危害
除了以上例子外,还有如: (1)SQL盲注,可以探知数据库的具体结构,为进一步攻击做准备 (2)泄漏数据,尤其是机密信息、账户信息 (3)取得更高权限、管理员权限,来修改表数据甚至内部结构
三、SQL注入的防御
了解了SQL注入攻击的原理,防御其实是很简单的
参数化查询
参数化查询是对SQL注入的根本性的防御,也称预处理语句: 1.通过指定查询结构,在用户输入的部分预留占位符如"@" 2.然后指定占位符内容(即将用户输入的内容作为参数传进来)
select * from user where username=@UserName and password=@PassWord;
UserName = "用户输入";
PassWord = "用户输入";
这样即使输入’or’ 1=1,也会认为是用户输入的实质内容,不会被当作是SQL语句的一部分
|