From 2ce5bd968065322ede82976feb8c57012e7a9609 Mon Sep 17 00:00:00 2001 From: xiemengjun Date: Sat, 20 Oct 2012 19:21:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 9.4.md | 22 +++++++++++----------- 9.5.md | 8 ++++---- 9.6.md | 10 ++++------ 9.7.md | 4 +--- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/9.4.md b/9.4.md index be690cc2..23309b88 100644 --- a/9.4.md +++ b/9.4.md @@ -1,12 +1,12 @@ ##9.4 避免SQL注入 ##什么是SQL注入 -SQL注入攻击(SQL Injection),简称注入攻击,它是Web开发中最常见的一种安全漏洞。SQL注入漏洞可以用来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统最高权限。 +SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统最高权限。 -而造成SQL注入的原因是由于程序没有过滤用户的输入,攻击者通过向服务器提交恶意的SQL查询语句,应用程序接收后错误的将攻击者的输入作为原始SQL查询语句的一部分执行,导致改变了程序原始的SQL查询逻辑,额外的执行了攻击者构造的SQL查询语句。 +而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。 ##SQL注入实例 -很多 web 开发者没有注意到 SQL 查询是可以被篡改的,因而把 SQL 查询当作可信任的命令。殊不知道,SQL 查询可以绕开访问控制,从而绕过身份验证和权限检查。更有甚者,有可能通过 SQL 查询去运行主机操作系统级的命令。 +很多Web开发者没有意识到SQL查询是可以被篡改的,从而把SQL查询当作可信任的命令。殊不知,SQL查询是可以绕开访问控制,从而绕过身份验证和权限检查的。更有甚者,有可能通过SQL查询去运行主机系统级的命令。 -下面将会给出一些真实的例子详细讲解一下SQL注入危害。 +下面将通过一些真实的例子来详细讲解SQL注入的方式。 考虑以下简单的登录表单: @@ -22,7 +22,7 @@ SQL注入攻击(SQL Injection),简称注入攻击,它是Web开发中最 password:=r.Form.Get("password") sql:="SELECT * FROM user WHERE username='"+username+"' AND password='"+password+"'" -如果用户的输入用户名如下所示,密码任意 +如果用户的输入的用户名如下,密码任意 myuser' or 'foo' = 'foo' -- @@ -30,9 +30,9 @@ SQL注入攻击(SQL Injection),简称注入攻击,它是Web开发中最 SELECT * FROM user WHERE username='myuser' or 'foo'=='foo' --'' AND password='xxx' -在SQL里面`--`是注释标记,所以查询语句会在此中断。这就允许了一个攻击者在不知道任何合法用户名和密码的情况下登录。 +在SQL里面`--`是注释标记,所以查询语句会在此中断。这就让攻击者在不知道任何合法用户名和密码的情况下成功登录了。 -对于MSSQL还有更加危险的一种SQL注入,就是控制系统,下面这个可怕的例子将会演示如何在某些数据库上执行系统命令。 +对于MSSQL还有更加危险的一种SQL注入,就是控制系统,下面这个可怕的例子将演示如何在某些版本的MSSQL数据库上执行系统命令。 sql:="SELECT * FROM products WHERE name LIKE '%"+prod+"%'" Db.Exec(sql) @@ -47,21 +47,21 @@ MSSQL服务器会执行这条SQL语句,包括它后面那个用于向系统添 ##如何预防SQL注入 -也许你会说攻击者要知道数据库结构的信息才能实施SQL注入攻击。确实如此,但没人能保证攻击者一定拿不到这些信息,一但他们拿到了,数据库就存在泄露的危险。如果你在用开放源代码的软件包来访问数据库,比如论坛程序,攻击者就很容易得到相关的代码。如果这些代码设计不良的话,风险就更大了。目前Discuz、phpwind、phpcms这些流行的框架都有被SQL注入攻击的先例。 +也许你会说攻击者要知道数据库结构的信息才能实施SQL注入攻击。确实如此,但没人能保证攻击者一定拿不到这些信息,一旦他们拿到了,数据库就存在泄露的危险。如果你在用开放源代码的软件包来访问数据库,比如论坛程序,攻击者就很容易得到相关的代码。如果这些代码设计不良的话,风险就更大了。目前Discuz、phpwind、phpcms这些流行的框架都有被SQL注入攻击的先例。 这些攻击总是建立在安全意识不强的代码上的。所以,永远不要信任外界输入的数据,特别是来自于客户端的,包括选择框、表单隐藏域和 cookie。就如上面的第一个例子那样,就算是正常的查询也有可能造成灾难。 -SQL注入攻击的危害这么大,那么该如何来防治呢?下面这些建议或许对你编写Web应用防治SQL注入有一定的帮助。 +SQL注入攻击的危害这么大,那么该如何来防治呢?下面这些建议或许对防治SQL注入有一定的帮助。 - 1、严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。 - 2、检查输入的数据是否具有所期望的数据格式,严格限制变量的类型,例如使用regexp包进行一些匹配处理,或者使用strconv包里面的字符串转化成相应格式的数据进行判断。 - 3、对进入数据库的特殊字符('"\尖括号&*;等)进行转义处理,或编码转换。Go里面`text/template`里面的`HTMLEscapeString`函数进行转义处理。 -- 3、所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。例如`database/sql`里面的查询的话首先执行`Prepare`然后执行`Query`,更新或者插入的话`Exec(query string, args ...interface{})` +- 3、所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,即不要直接拼接SQL语句。例如`database/sql`里面的查询的话首先执行`Prepare`然后执行`Query`,更新或者插入的话`Exec(query string, args ...interface{})` - 4、在应用发布之前建议使用一些专业的SQL注入检测工具进行检测,及时修补这些SQL注入漏洞。例如sqlmap、SQLninja等SQL注入检测工具,网上应该有很多这方面的开源工具。 - 5、避免网站打印出来SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。 ##总结 -SQL注入是目前Web应用开发中存在的比较严重的漏洞,通过上面的示例我们也知道了他的危害性是非常严重的,所以对于我们平常编写的Web应用,应该对于每一个小细节都要非常重视,细节决定命运,生活如此,编写Web应用也是这样。 +通过上面的示例我们可以知道,SQL注入是危害相当大的安全漏洞。所以对于我们平常编写的Web应用,应该对于每一个小细节都要非常重视,细节决定命运,生活如此,编写Web应用也是这样。 ## links * [目录]() diff --git a/9.5.md b/9.5.md index 4c404aa1..75b3d44d 100644 --- a/9.5.md +++ b/9.5.md @@ -1,10 +1,10 @@ ##9.5 存储密码 -过去一段时间来, 许多的网站遭遇用户密码数据库泄露事件, 这其中包括顶级的互联网企业–Linkedin, 国内诸如CSDN近600万用户帐号密码外泄,该事件横扫整个国内互联网,并且随后又爆出多玩游戏800万用户资料被泄露 ,另有传言人人网、开心网、天涯社区、世纪佳缘、百合网等社区都有可能成为黑客下一个目标。层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯在不同网站使用相同的密码,一家“暴库”,全部遭殃。 +过去一段时间以来, 许多的网站遭遇用户密码数据泄露事件, 这其中包括顶级的互联网企业–Linkedin, 国内诸如CSDN,该事件横扫整个国内互联网,随后又爆出多玩游戏800万用户资料被泄露,另有传言人人网、开心网、天涯社区、世纪佳缘、百合网等社区都有可能成为黑客下一个目标。层出不穷的类似事件给用户的网上生活造成巨大的影响,人人自危,因为人们往往习惯在不同网站使用相同的密码,所以一家“暴库”,全部遭殃。 那么我们作为一个Web应用开发者,在选择密码存储方案时, 容易掉入哪些陷阱, 以及如何避免这些陷阱? ##普通方案 -目前我们用的最多的密码存储方案是将明文密码做单向哈希后存储,单向哈希算法有一个特征:无法通过哈希后的摘要(digest)恢复原始数据,这也是“单向”二字的来源。常用的单向哈希算法包括SHA-256, SHA-1, MD5等。 +目前用的最多的密码存储方案是将明文密码做单向哈希后存储,单向哈希算法有一个特征:无法通过哈希后的摘要(digest)恢复原始数据,这也是“单向”二字的来源。常用的单向哈希算法包括SHA-256, SHA-1, MD5等。 Go语言对这三种加密算法的实现如下所示: @@ -63,9 +63,9 @@ Go语言对这三种加密算法的实现如下所示: 在两个salt没有泄露的情况下,黑客如果拿到的是最后这个加密串,就几乎不可能推算出原始的密码是什么了。 ##专家方案 -也许在几年前上面的进阶方案也许是足够安全的方案,因为攻击者没有足够的资源建立这么多的rainbow table。 但是,在今日,因为并行计算能力的提升,这种攻击已经完全可行。 +上面的进阶方案在几年前也许是足够安全的方案,因为攻击者没有足够的资源建立这么多的`rainbow table`。 但是,时至今日,因为并行计算能力的提升,这种攻击已经完全可行。 -故意增加密码计算所需耗费的资源和时间,使得任何人都不可获得足够的资源建立所需的`rainbow table`。 +怎么解决这个问题呢?只要时间与资源允许,没有破译不了的密码,所以方案是:故意增加密码计算所需耗费的资源和时间,使得任何人都不可获得足够的资源建立所需的`rainbow table`。 这类方案有一个特点,算法中都有个因子,用于指明计算密码摘要所需要的资源和时间,也就是计算强度。计算强度越大,攻击者建立`rainbow table`越困难,以至于不可继续。 diff --git a/9.6.md b/9.6.md index 9192a480..8a9147fb 100644 --- a/9.6.md +++ b/9.6.md @@ -1,5 +1,5 @@ ##9.6 加密和解密数据 -前面小节我们介绍了如何存储密码,但是我们开发Web应用过程中遇到过这样的情况,我们想把一些敏感数据进行存储,那存储的时候希望能够是加密方式存储的,但是这些加密的数据我们需要最后解密出来,那么就需要采用一种特定的算法来进行加解密数据。 +前面小节介绍了如何存储密码,但是有的时候,我们想把一些敏感数据加密后存储起来,在将来的某个时候,随需将它们解密出来,此时我们应该在选用对称加密算法来满足我们的需求。 ##base64加解密 如果Web应用足够简单,数据的安全性没有那么严格的要求,那么可以采用一种比较简单的加解密方法是`base64`,这种方式实现起来比较简单,Go语言的`base64`包已经很好的支持了这个,请看下面的例子: @@ -45,12 +45,12 @@ ##高级加解密 -Go语言的`crypto`里面支持双向加密的高级加解密包有: +Go语言的`crypto`里面支持对称加密的高级加解密包有: - `crypto/aes`包:AES(Advanced Encryption Standard),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。 - `crypto/des`包:DEA(Data Encryption Algorithm),是一种对称加密算法,是目前使用最广泛的密钥系统,特别是在保护金融数据的安全中。 -下面以aes包作为例子来讲解这两种高级加解密算法的应用,这两种方式使用方法类似,请看下面的例子 +因为这两种算法使用方法类似,所以在此,我们仅用aes包为例来讲解它们的使用,请看下面的例子 package main @@ -89,9 +89,7 @@ Go语言的`crypto`里面支持双向加密的高级加解密包有: Println("msg: ", string(plain)) } -上面通过调用函数`aes.NewCipher`,参数key必须是16、24或者32位的[]byte,分别对应AES-128, AES-192或AES-256算法。 - -该函数返回了一个`cipher.Block`接口,这个接口实现了三个功能: +上面通过调用函数`aes.NewCipher`(参数key必须是16、24或者32位的[]byte,分别对应AES-128, AES-192或AES-256算法),返回了一个`cipher.Block`接口,这个接口实现了三个功能: type Block interface { // BlockSize returns the cipher's block size. diff --git a/9.7.md b/9.7.md index 67592dd3..c5e0c431 100644 --- a/9.7.md +++ b/9.7.md @@ -1,7 +1,5 @@ ##9.7 小结 -这一章介绍了一些Web应用中典型的攻击:CSRF攻击、XSS攻击、SQL注入攻击,这些攻击都是由于我们对于用户的输入没有很好的过滤引起的,所以我们专门介绍了如何有效的进行数据过滤,以防止这些攻击的发生。然后针对目前出现的密码泄露事件,介绍了在设计Web应用的时候我们应该如何存储我们的密码,里面介绍了几种不同的存储方式。最后针对敏感数据我们介绍了如何进行加密存储,最后这些数据又可以解密,能够进行双向的加解密操作,Go语言提供了三种算法:base64、aes和des。 - -通过这一章的介绍主要的目的是希望读者在编写Web应用的时候多留心一点,能够在你的意识里面加强安全概念,不要让我们编写的Web应用轻松的成为黑客们攻击的目标。而且Go语言在支持这些防攻击方面已经做了大量的工具包,我们可以充分的利用这些包来做出一个安全的Web应用。 +这一章主要介绍了如:CSRF攻击、XSS攻击、SQL注入攻击等一些Web应用中典型的攻击手法,它们都是由于应用对用户的输入没有很好的过滤引起的,所以除了介绍攻击的方法外,我们也介绍了了如何有效的进行数据过滤,以防止这些攻击的发生的方法。然后针对日异严重的密码泄漏事件,介绍了在设计Web应用中可采用的从基本到专家的加密方案。最后针对敏感数据的加解密简要介绍了,Go语言提供三种对称加密算法:base64、aes和des的实现。 编写这一章的目的是希望读者能够在意识里面加强安全概念,在编写Web应用的时候多留心一点,以使我们编写的Web应用能远离黑客们的攻击。Go语言在支持防攻击方面已经提供大量的工具包,我们可以充分的利用这些包来做出一个安全的Web应用。 ## links * [目录]()