信息安全之SQL注入攻击

目录

一、简介

二、案例

1.案例1(SQL恶意填入)

2.案例2(危险字符注入) 

 三、预防

1.过滤特殊字符

2.严格使用参数绑定

3.合理使用框架防注入机制


一、简介

SQL注入是注入式攻击中的常见类型。SQL注入式攻击是未将代码与数据进行严格的隔离,导致在读取数据库数据的时候,错误地把数据作为代码的一部分执行,导致攻击者可以通过sql灵活多变的语法,构造精心巧妙的语句,达到欺骗服务器执行恶意的SQL命令,或者通过系统报错,返回对自己有用的信息。

SQL注入自诞生以来以其巨大的杀伤力闻名。

二、案例

1.案例1(SQL恶意填入)

典型的SQL注入的例子是当对SQL语句进行字符串拼接操作时,直接使用未加转义的用户输入内容作为变量,例如

strSQL = "select * from users where (name = ' " + username + " ') and (pw = ' "+ password +" ')" ;

在上面的例子中,用户输入用户名和密码没有问题,可以执行正常的查询语句。但是如果直接用";"隔开,在password里插入其他SQL语句,则会带来意想不到的结果,比如drop、delete等。

再比如恶意填入永远匹配的判断or 1=1时,将导致原本的SQL字符串被填为

strSQL = "select * from users where(name = ' " + username + " ') and (pw = ' "+ password +" ') or 1=1" ;

也就是实际上运行的SQL命令会变成下面这样的,因此达到无账号密码,亦可登录网站

select * from users

2.案例2(危险字符注入) 

曾经在某业务中,用户在修改签名时,非常偶然的输入 "# -- !#"(@  这样内容用来表达心情,单击保存后出发数据库更新),由于该业务未对危险字符串 "# -- " 进行转义,导致where后边的信息被注释掉,执行语句变成了

update table set memo=" "# -- !#(@ " where user_id = 12345;

该SQL语句的执行导致全库的memo字段都被更新

 三、预防

一定要建立对注入攻击的风险意识,正确使用参数化绑定SQL变量,这样才能有效地避免SQL注入。实际上,其他的注入方式也是类似的思路,身为一名开发工程师,我们一定要时刻保持对注入攻击的高度警惕。

1.过滤特殊字符

过滤用户输入参数中的特殊字符,从而降低被SQL注入的风险

2.严格使用参数绑定

禁止通过字符串拼接的SQL语句,严格使用参数绑定传入的SQL参数。这样的话,如果恶意拼接字符串,会当做某个变量直接装入某个参数,而不会破坏原有SQL语句结构

3.合理使用框架防注入机制

比如MyBatis提供的#{}绑定参数,同时谨慎使用${},${}相当于使用字符串拼接SQL;Hibernate的占位符?与:等。拒绝拼接的SQL语句,使用参数化的语句

猜你喜欢

转载自blog.csdn.net/mmake1994/article/details/88654123