   
- 帖子
- 618
- 积分
- 1888
- 威望
- 2421
- 金钱
- 2970
- 在线时间
- 179 小时
        
|
"保存SQL Query Structure(也称作SQL注入)失败"在CWE/SANS2月16号出版的排名前25位最危险编程错误清单上位列第二。原因是:SQL注入式攻击对企业用户构成了巨大的潜在威胁。这是因为一旦SQL注入式攻击成功,就会导致黑客侵入你的网络,访问和毁坏数据并控制计算机。
SQL注入是什么?
SQL注入式攻击的原理非常简单。当一款应用软件进行用户数据输出时,就为恶意用户入侵制造了机会,从而导致输入是作为SQL序列出现而不是数据。
举例来说,想象这样一行代码:
SELECT * FROM Users WHERE Username='$username' AND Password='$password
设计这行代码是要显示"用户"框中用户名和密码的记录。使用网络界面的话,在提示输入用户名和密码的时候,恶意用户可能会键入:
1' or '1' = '1
1' or '1' = '1
然后产生这些的序列:
SELECT * FROM Users WHERE Username='1' OR '1' = '1' AND Password='1' OR '1' = '1'
这样黑客就将整个OR条件成功的注入了验证流程。更糟糕的是,条件'1' = '1'总是正确的,因此这种SQL序列通常会导致黑客规避了验证流程。
使用诸如";"的字符会在现有序列的末尾另外产生一行序列,作为现有序列注释的一部分,黑客可能会删除整个表格或者更改包含的数据。黑客甚至能掌控基础的操作系统环境,从而控制整个计算机,将计算机沦为供其驱使的肉鸡来攻击网络中的其他计算机。概括来说SLQ注入式攻击的结果包括:机密数据泄露,数据完整性的损失,数据丢失,危及整个网络。
如何防御SQL注入式攻击?
最重要的措施就是数据清理和验证。数据清理通常会涉及任何通过某项功能运行的提交数据(比如MySQL的mysql_real_escape_string()功能)来保证任何存在风险的字符(比如" ' ")不会传递到数据的SQL序列。
验证有略微的不同。数据验证是要确保提交的数据以希望的格式出现。在最基本的层面上,这包括确保电子邮件地址包含"@"标识,提交的数据长度不能超出规定的最大长度。验证经常会以两种形式出现:通过风险黑名单或多余的字符和通过在指定情况下才能使用的字符的白名单,这更多会涉及编程人员的工作。虽然验证通常是在用户方面发生的行为,但黑客可能会修改或绕过验证,因此对服务器上的数据加以验证也很重要。
但是数据清理和验证还远远不够。以下是帮助用户阻止或缓解SQL注入式攻击的十种方法:
1.不要相信任何人:假设所提交的用户数据都是存在问题的,对所有数据加以验证和清洁。
2.不要使用可能被规避的动态SQL:无论何时都尽可能采用备好的报表,参数化的查询或者存储的流程。
3.更新和补丁:黑客的SQL注入式攻击所利用的应用软件和数据库漏洞定期都能被发现,因此经常升级系统和打补丁时非常关键的。
4.防火墙:考虑使用网络应用软件防火墙(WAF)-无论是基于软件或者应用工具的均可,以此来帮助用户过滤恶意数据。好的防火墙拥有完整的缺省规则设置,当需要时增加新的功能都比较容易。网络应用软件防火墙在系统打补丁之前,对防御某些特殊的新风险和提供安全防护上特别有用。
5.减少用户的攻击殃及面:删除你不需要的数据库功能来防御黑客乘机利用。举例来说,MS SQL中的xp_cmdshell扩展存储程序会溢出Windows命令行和可执行字符串,这确实对黑客而言非常拥有。xp_cmdshell导致的Windows溢出作为SQL Server服务帐户拥有同样的安全权限。
6.使用适当的权限设置:不要使用管理员权限的账户连接数据库,除非你有某些非它不可的理由要这么做。使用限制权限的账户更加安全,对黑客也是个限制。
7.保守秘密:假设你的应用软件并不安全,采用加密或者随机生成密码和包括连接字符串在内的其他机密数据。
8.不要泄露超出你权限的信息:黑客会从错误讯息处了解到大量关于数据库体系架构的信息,因此要保证他们显示的是最小数量的信息。使用"RemoteOnly" customErrors模式来显示本地计算机的详细错误讯息,这样外部的黑客就无法得到更多关于数据库的信息,从而避免超出控制的差错。
9.不要忘记规则:定期更改数据库应用软件帐户的密码。这是常识,但是在实践中,这些密码经常数月或者数年没有更改过。
10.购买质量更好的软件:在软件推出之前,要让代码编写者承担核查定制应用软件代码和修正安全漏洞的责任。SANS建议用户将协议中的样本合同术语用在软件供应商身上。 |
|