update 9.3,9.4,9.5~

This commit is contained in:
chenwenli
2012-10-23 14:39:41 +08:00
parent 78f9e20b59
commit e6102d33a2
3 changed files with 19 additions and 18 deletions

22
9.4.md
View File

@@ -1,6 +1,6 @@
##9.4 避免SQL注入
##什么是SQL注入
SQL注入攻击SQL Injection简称注入攻击是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息或者利用数据库的特性执行添加用户导出文件等一系列恶意操作甚至有可能获取数据库乃至系统最高权限。
SQL注入攻击SQL Injection简称注入攻击是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息或者利用数据库的特性执行添加用户导出文件等一系列恶意操作甚至有可能获取数据库乃至系统用户最高权限。
而造成SQL注入的原因是因为程序没有有效过滤用户的输入使攻击者成功的向服务器提交恶意的SQL查询代码程序在接收后错误的将攻击者的输入作为查询语句的一部分执行导致原始的查询逻辑被改变额外的执行了攻击者精心构造的恶意代码。
##SQL注入实例
@@ -41,24 +41,24 @@ SQL注入攻击SQL Injection简称注入攻击是Web开发中最常
sql:="SELECT * FROM products WHERE name LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--%'"
MSSQL服务器会执行这条SQL语句包括它后面那个用于向系统添加用户的命令。如果这个程序是以sa运行而 MSSQLSERVER服务又有足够的权限的话攻击者就可以获得一个系统帐号来访问主机了。
MSSQL服务器会执行这条SQL语句包括它后面那个用于向系统添加用户的命令。如果这个程序是以sa运行而 MSSQLSERVER服务又有足够的权限的话攻击者就可以获得一个系统帐号来访问主机了。
>虽然以上的例子是针对某一特定的数据库系统的,但是这并不代表不能对其它数据库系统实施类似的攻击。使用不同方法,各种数据库都有可能遭殃。
>虽然以上的例子是针对某一特定的数据库系统的,但是这并不代表不能对其它数据库系统实施类似的攻击。针对这种安全漏洞,只要使用不同方法,各种数据库都有可能遭殃。
##如何预防SQL注入
也许你会说攻击者要知道数据库结构的信息才能实施SQL注入攻击。确实如此但没人能保证攻击者一定拿不到这些信息一旦他们拿到了数据库就存在泄露的危险。如果你在用开放源代码的软件包来访问数据库比如论坛程序攻击者就很容易得到相关的代码。如果这些代码设计不良的话风险就更大了。目前Discuz、phpwind、phpcms这些流行的框架都有被SQL注入攻击的先例。
也许你会说攻击者要知道数据库结构的信息才能实施SQL注入攻击。确实如此但没人能保证攻击者一定拿不到这些信息一旦他们拿到了数据库就存在泄露的危险。如果你在用开放源代码的软件包来访问数据库比如论坛程序攻击者就很容易得到相关的代码。如果这些代码设计不良的话风险就更大了。目前Discuz、phpwind、phpcms这些流行的开源程序都有被SQL注入攻击的先例。
这些攻击总是建立在安全意识不强的代码上。所以,永远不要信任外界输入的数据,特别是来自于客户端的,包括选择框、表单隐藏域和 cookie。就如上面的第一个例子那样就算是正常的查询也有可能造成灾难。
这些攻击总是发生在安全性不高的代码上。所以,永远不要信任外界输入的数据,特别是来自于用户的数据,包括选择框、表单隐藏域和 cookie。就如上面的第一个例子那样就算是正常的查询也有可能造成灾难。
SQL注入攻击的危害这么大那么该如何来防治呢?下面这些建议或许对防治SQL注入有一定的帮助。
- 1、严格限制Web应用的数据库的操作权限给此用户提供仅仅能够满足其工作的权限从而最大限度的减少注入攻击对数据库的危害。
- 2、检查输入的数据是否具有所期望的数据格式严格限制变量的类型例如使用regexp包进行一些匹配处理或者使用strconv包里面的字符串转化成相应格式的数据进行判断。
- 3、对进入数据库的特殊字符('"\尖括号&*;等进行转义处理或编码转换。Go里面`text/template`里面的`HTMLEscapeString`函数进行转义处理。
- 3、所有的查询语句使用数据库提供的参数化查询接口参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中即不要直接拼接SQL语句。例如`database/sql`里面的查询的话首先执行`Prepare`然后执行`Query`更新或者插入的话`Exec(query string, args ...interface{})`
- 4、在应用发布之前建议使用一些专业的SQL注入检测工具进行检测及时修补这些SQL注入漏洞。例如sqlmap、SQLninja等SQL注入检测工具网上应该有很多这方面的开源工具
- 5、避免网站打印出SQL错误信息比如类型错误、字段不匹配等防止攻击者利用这些错误信息进行一些判断
1. 严格限制Web应用的数据库的操作权限给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害。
2. 检查输入的数据是否具有所期望的数据格式严格限制变量的类型例如使用regexp包进行一些匹配处理或者使用strconv包字符串转化成其他基本类型的数据进行判断。
3. 对进入数据库的特殊字符('"\尖括号&*;等进行转义处理或编码转换。Go`text/template`里面的`HTMLEscapeString`函数可以对字符串进行转义处理。
4. 所有的查询语句建议使用数据库提供的参数化查询接口参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中即不要直接拼接SQL语句。例如使用`database/sql`里面的查询函数`Prepare``Query`或者`Exec(query string, args ...interface{})`
5. 在应用发布之前建议使用专业的SQL注入检测工具进行检测及时修补被发现的SQL注入漏洞。网上有很多这方面的开源工具,例如sqlmap、SQLninja等。
6. 避免网站打印出SQL错误信息比如类型错误、字段不匹配等把代码里的SQL语句暴露出来防止攻击者利用这些错误信息进行SQL注入
##总结
通过上面的示例我们可以知道SQL注入是危害相当大的安全漏洞。所以对于我们平常编写的Web应用应该对于每一个小细节都要非常重视细节决定命运生活如此编写Web应用也是这样。