转载自 I生活T精彩
![e5c525cef0613800b408715c86263cf5.png](https://i-blog.csdnimg.cn/blog_migrate/21e0e2f0730ae10c5b19a1acf06e2efe.jpeg)
韩方旭
平台开发处
![4b25b50b229a7f289df2fcd924a46d3e.png](https://i-blog.csdnimg.cn/blog_migrate/45c539b1258be9dff115fe0003552f85.png)
#1:引子
现在人给孩子起名都用尽心思,有的人为了避免重名,给孩子起名用了比较生僻的字,结果学校老师都不知道孩子名字怎么念。有一个IT工程师别出心裁,给孩子起了一个不会重名的名字,结果到了上学的年纪,这个名字不仅给老师、还给学校的系统带来了更大的麻烦,有一天她就接到了学校老师的电话:
![6d3c73c1466a5d6fca24cefeb46fd8aa.png](https://i-blog.csdnimg.cn/blog_migrate/239268b9657645abc90d1914c3c0faf0.png)
现实世界里当然不会有人给孩子起名叫“Robert’);DROP TABLE Students;--”,这个漫画只是举了一个SQL注入攻击的例子,下面我们就来说说SQL注入攻击的原理和常见防御方法。
#2:SQL注入原理及危害
从原理上说,SQL注入就是恶意攻击者通过在Web表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。
能够造成SQL注入这个问题的原因是,SQL数据库的操作是通过SQL语句来执行的,SQL语法允许数据库命令和用户数据混杂在一起,这就导致如果恶意攻击者在数据中加入某些SQL语句关键字(例如SELECT、DROP等等),这些故意写入的关键字就很可能在数据库访问数据时被当成操作命令得到执行,这样的话,恶意攻击者就不仅能访问Web应用的数据,而且还可以执行任意命令。
SQL注入的危害主要包括以下几点:
猜解后台数据库,盗取网站敏感信息
绕过认证,例如绕过验证登录网站后台
可以借助数据库的存储过程进行提权等操作
#3:SQL注入类型
(1)直接注入攻击法
直接注入攻击法直接将攻击代码与原始SQL命令串联在一起并使其执行,由于其直接与SQL语句捆绑,故也被称为直接注入式攻击法。
例如,原始SQL命令为:
strSQL = "SELECT * FROM users WHERE name = '" + userName + "' and pw = '"+ passWord +"'";
注入数据为:
userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
那么注入后SQL语句为:
SELECT * FROM users WHERE name = '1' OR '1'='1' and pw = '1' OR '1'='1'
相当于执行了:
SELECT * FROM users WHERE name
该SQL语句的作用是检索users表中的所有字段 ,则实现了爆破数据库表的目的。
固定布局 工具条上设置固定宽高
背景可以设置被包含
可以完美对齐背景图和文字
以及制作自己的模板
(2)间接注入攻击法
这种攻击方式将原始的SQL语句当做一个数据操作的指令,而将恶意SQL语句通过分号的形式与原始SQL分割开,当做两条命令来执行。一般在追加的恶意操作语句前面会使用分好来分割,后面使用“--”来注释尾部SQL,执行时就会仅执行原始SQL和恶意SQL。
同样是上面的语句,我们插入数据为:
userName = "'; DROP TABLE users--";
passWord = "'; DROP TABLE users--";
注入后SQL变为:
SELECT * FROM users WHERE name = ''; DROP TABLE users--' and pw = ''; DROP TABLE users--'
相当于执行了:
SELECT * FROM users WHERE name = '';
DROP TABLE users;
至此就达到了删库的目的,本文引子中所举的例子,也是使用的此种方法。
#4:针对SQL注入的常见
防御方法
SQL注入的本质是用户可以输入并执行恶意的代码,而防范SQL注入攻击最终归于对用户输入的验证和过滤,常见有以下几种方法:
(1)设计输入验证和处理策略
在应用程序输入层使用白名单进行输入验证以便验证所有用户输入都符合应用要接收的内容,应用只允许接收符合期望格式的输入。
(2)对客户端提交数据进行转义
对特殊字符进行转义,因为既然已知攻击将出现单引号等特殊字符,那么将这些特殊字符转义即可防御利用该方法的SQL注入。
(3)采用预编译技术
采用预编译技术(PreparedStatement),就会将SQL语句预先编译,也就是SQL引擎会预先进行语法分析,语法分析主要分析SQL命令(例如 select,from,where,and,or,order by等),后续无论恶意攻击者输入什么参数都不会影响该SQL语句的语法结构了,那么也不会被当成SQL命令来执行了。
(4)严格的数据类型
在不适于采用预编译技术,必须采用字符串拼接的方式时,则必须严格检查参数的数据类型,这样也是可以防止SQL注入。
![51a3cb02a8ba0a976d829fd76b99b569.gif](https://i-blog.csdnimg.cn/blog_migrate/24bb6e75ab10c3333facaaaaf0112103.gif)
#5:总结
本文主要介绍了SQL注入的基本原理、攻击类型和主要防御方法,我行针对此类信息安全漏洞,在系统开发层面制定了《互联网应用开发安全编码规范》,在输入验证方面做了详细的要求,希望可以防止各种注入类攻击,减少此类攻击的危害。