Merge remote-tracking branch 'astaxie/master'

This commit is contained in:
Oling Cat
2012-10-27 22:50:43 +08:00
17 changed files with 91 additions and 30 deletions

View File

@@ -1,4 +1,4 @@
##10.1 设置默认地区
# 10.1 设置默认地区
##什么是Locale
Locale是一组描述世界上某一特定区域文本格式和语言习惯的设置的集合。locale名通常由三个部分组成第一部分是一个强制性的表示语言的缩写例如"en"表示英文或"zh"表示中文。第二部分,跟在一个下划线之后,是一个可选的国家说明符,用于区分讲同一种语言的不同国家,例如"en_US"表示美国英语,而"en_UK"表示英国英语。最后一部分,跟在一个句点之后,是可选的字符集说明符,例如"zh_CN.gb2312"表示中国使用gb2312字符集。
@@ -84,4 +84,4 @@ GO语言默认采用"UTF-8"编码集所以我们实现i18n时不考虑第三
* 下一节: [本地化资源](<10.2.md>)
## LastModified
* $Id$
* $Id$

45
10.2.md
View File

@@ -1,4 +1,4 @@
##10.2 本地化资源
# 10.2 本地化资源
前面小节我们介绍了如何设置Locale设置好Locale之后我们需要解决的问题就是如何存储相应的Locale对应的信息呢这里面的信息包括文本信息、时间和日期、货币值、图片、包含文件以及视图等资源。那么接下来我们讲对这些信息一一进行介绍Go语言中我们把这些格式信息存储在JSON中然后通过合适的方式展现出来。(接下来以中文和英文两种语言对比举例,存储格式文件en.json和zh-CN.json)
##本地化文本消息
文本信息是我们编写Web应用中最长用到的也是本地化资源中最多的信息你想要以适合本地的语言显示文本信息那么就需要建立相应的map来维护一个key-value的关系在打印消息之前从map中去获取相应的字符串例如下面这个例如一个包含英文和中文的食品名称的简单的map以及一个从该map中抽取单词的函数。
@@ -90,13 +90,48 @@
}
##本地化视图
我们在展现不同Locale的时候可能会根据不同的Locale采用不同的视图这些视图里面包含不同的图片、css、js等各种静态资源。那么我们如何来处理这些信息呢
##管理本地化资源
##本地化视图和资源
我们在展现不同Locale的时候可能会根据不同的Locale采用不同的视图这些视图里面包含不同的图片、css、js等各种静态资源。那么我们如何来处理这些信息呢首先我们需要组织对应的locale文件信息请看下面的文件目录安排
views
|--en //英文模板
|--images //存储图片信息
|--js //存储JS文件
|--css //存储css文件
index.tpl //用户首页
login.tpl //登陆首页
|--zh-CN //中文模板
|--images
|--js
|--css
index.tpl
login.tpl
有了这个文件安排之后我们就可以在渲染的地方这样来实现代码
s1, _ := template.ParseFiles("views"+lang+"index.tpl")
VV.Lang=lang
s1.Execute(os.Stdout, VV)
而对于里面的index.tpl里面的资源设置如下
//js文件
<script type="text/javascript" src="views/{{.VV.Lang}}/js/jquery/jquery-1.8.0.min.js"></script>
//css文件
<link href="views/{{.VV.Lang}}/css/bootstrap-responsive.min.css" rel="stylesheet">
//图片文件
<img src="views/{{.VV.Lang}}/images/btn.png">
这样我们在本地化视图以及资源的时候采用这种方式就可以很容易的进行扩展了。
##总结
本小节介绍了如何使用存储本地资源本地资源有些需要通过转换函数有些通过lang设置但是最后都是通过key-value的方式存储了相应的Locale对应数据然后通过转换函数通过key读取出来相应的Locale信息如果是文本信息就直接输出了如果是时间日期或者货币需要结合`fmt.Printf`函数的处理才能转换成正确的信息展示而对于不同Locale的视图和资源是最简单的只要在路径里面增加lang就可以实现了。
## links
* [目录](<preface.md>)
* 上一节: [设置默认地区](<10.1.md>)
* 下一节: [国际化站点](<10.3.md>)
## LastModified
* $Id$
* $Id$

15
10.3.md
View File

@@ -1,11 +1,20 @@
##10.3 国际化站点
# 10.3 国际化站点
前面小节介绍了如何处理本地化资源即Locale一个相应的配置文件那么如果处理多个的本地化资源呢而对于一些我们经常用到的例如简单的文本翻译、时间日期、数字等如果处理呢本小节将一一解决这些问题。
##管理多个本地包
##自动加载本地包
##template mapfunc
##template mapfunc
1. 文本信息
2. 时间日期
3. 数字
##总结
## links
* [目录](<preface.md>)
* 上一节: [本地化资源](<10.2.md>)
* 下一节: [小结](<10.4.md>)
## LastModified
* $Id$
* $Id$

View File

@@ -1,4 +1,4 @@
##10.4 小结
# 10.4 小结
通过这一章的介绍读者应该对如何操作i18n有了深入的了解我也根据这一章介绍的内容实现了一个开源的解决方案go-i18nhttps://github.com/astaxie/go-i18n 通过这个开源库我们可以很方便的实现多语言版本的Web应用使得我们的应用能够轻松的实现国际化。如果你发现这个开源库中的错误或者那些缺失的地方请一起参与到这个开源项目中来让我们的这个库争取成为Go的标准库。
## links
* [目录](<preface.md>)
@@ -6,4 +6,4 @@
* 下一节: [错误处理,故障排除和测试](<11.md>)
## LastModified
* $Id$
* $Id$

4
10.md
View File

@@ -1,4 +1,4 @@
##10 国际化和本地化
# 10 国际化和本地化
为了适应经济的全球一体化作为开发者我们需要开发出支持多国语言、国际化的Web应用即同样的页面在不同的语言环境下需要显示不同的效果也就是说应用程序在运行时能够根据请求所来自的地域与语言的不同而显示不同的用户界面。这样当需要在应用程序中添加对新的语言的支持时无需修改应用程序的代码只需要增加语言包即可实现。
国际化与本地化Internationalization and localization,通常用i18n和L10N表示国际化是将针对某个地区设计的程序进行重构以使它能够在更多地区使用本地化是指在一个面向国际化的程序中增加对新地区的支持。
@@ -27,4 +27,4 @@
* 下一节: [设置默认地区](<10.1.md>)
## LastModified
* $Id$
* $Id$

4
9.1.md
View File

@@ -1,4 +1,4 @@
##9.1 预防CSRF攻击
# 9.1 预防CSRF攻击
##什么是CSRF
CSRFCross-site request forgery中文名称跨站请求伪造也被称为one click attack/session riding缩写为CSRF/XSRF。
@@ -91,4 +91,4 @@ CSRF的防御可以从服务端和客户端两方面着手防御效果是从
* 下一节: [确保输入过滤](<9.2.md>)
## LastModified
* $Id$
* $Id$

4
9.2.md
View File

@@ -1,4 +1,4 @@
##9.2 确保输入过滤
# 9.2 确保输入过滤
过滤用户数据是Web应用安全的基础。它是验证数据合法性的过程。通过对所有的输入数据进行过滤可以避免恶意数据在程序中被误信或误用。大多数Web应用的漏洞都是因为没有对用户输入的数据进行恰当过滤所引起的。
我们介绍的过滤数据分成三个步骤:
@@ -72,4 +72,4 @@
* 下一节: [避免XSS攻击](<9.3.md>)
## LastModified
* $Id$
* $Id$

4
9.3.md
View File

@@ -1,4 +1,4 @@
##9.3 避免XSS攻击
# 9.3 避免XSS攻击
随着互联网技术的发展现在的Web应用都含有大量的动态内容以提高用户体验。所谓动态内容就是应用程序能够根据用户环境和用户请求输出相应的内容。动态站点会受到一种名为“跨站脚本攻击”Cross Site Scripting, 安全专家们通常将其缩写成 XSS的威胁而静态站点则完全不受其影响。
##什么是XSS
@@ -52,4 +52,4 @@ XSS漏洞是相当有危害的在开发Web应用的时候一定要记住
* 下一节: [避免SQL注入](<9.4.md>)
## LastModified
* $Id$
* $Id$

4
9.4.md
View File

@@ -1,4 +1,4 @@
##9.4 避免SQL注入
# 9.4 避免SQL注入
##什么是SQL注入
SQL注入攻击SQL Injection简称注入攻击是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息或者利用数据库的特性执行添加用户导出文件等一系列恶意操作甚至有可能获取数据库乃至系统用户最高权限。
@@ -69,4 +69,4 @@ SQL注入攻击的危害这么大那么该如何来防治呢?下面这些建
* 下一节: [存储密码](<9.5.md>)
## LastModified
* $Id$
* $Id$

4
9.5.md
View File

@@ -1,4 +1,4 @@
##9.5 存储密码
# 9.5 存储密码
过去一段时间以来, 许多的网站遭遇用户密码数据泄露事件, 这其中包括顶级的互联网企业Linkedin, 国内诸如CSDN该事件横扫整个国内互联网随后又爆出多玩游戏800万用户资料被泄露另有传言人人网、开心网、天涯社区、世纪佳缘、百合网等社区都有可能成为黑客下一个目标。层出不穷的类似事件给用户的网上生活造成巨大的影响人人自危因为人们往往习惯在不同网站使用相同的密码所以一家“暴库”全部遭殃。
那么我们作为一个Web应用开发者在选择密码存储方案时, 容易掉入哪些陷阱, 以及如何避免这些陷阱?
@@ -89,4 +89,4 @@ Go语言对这三种加密算法的实现如下所示
* 下一节: [加密和解密数据](<9.6.md>)
## LastModified
* $Id$
* $Id$

4
9.6.md
View File

@@ -1,4 +1,4 @@
##9.6 加密和解密数据
# 9.6 加密和解密数据
前面小节介绍了如何存储密码,但是有的时候,我们想把一些敏感数据加密后存储起来,在将来的某个时候,随需将它们解密出来,此时我们应该在选用对称加密算法来满足我们的需求。
##base64加解密
@@ -116,4 +116,4 @@ Go语言的`crypto`里面支持对称加密的高级加解密包有:
* 下一节: [小结](<9.7.md>)
## LastModified
* $Id$
* $Id$

4
9.7.md
View File

@@ -1,4 +1,4 @@
##9.7 小结
# 9.7 小结
这一章主要介绍了如CSRF攻击、XSS攻击、SQL注入攻击等一些Web应用中典型的攻击手法它们都是由于应用对用户的输入没有很好的过滤引起的所以除了介绍攻击的方法外我们也介绍了了如何有效的进行数据过滤以防止这些攻击的发生的方法。然后针对日异严重的密码泄漏事件介绍了在设计Web应用中可采用的从基本到专家的加密方案。最后针对敏感数据的加解密简要介绍了Go语言提供三种对称加密算法base64、aes和des的实现。
编写这一章的目的是希望读者能够在意识里面加强安全概念在编写Web应用的时候多留心一点以使我们编写的Web应用能远离黑客们的攻击。Go语言在支持防攻击方面已经提供大量的工具包我们可以充分的利用这些包来做出一个安全的Web应用。
@@ -7,4 +7,4 @@
* [目录](<preface.md>)
* 上一节: [加密和解密数据](<9.6.md>)
* 下一节: [国际化和本地化](<10.md>)

4
9.md
View File

@@ -1,4 +1,4 @@
##9 安全与加密
# 9 安全与加密
无论是开发Web应用的开发者还是企图利用Web应用漏洞的攻击者对于Web程序安全这个话题都给予了越来越多的关注。特别是最近CSDN密码泄露事件更是让我们对Web安全这个话题更加重视所有人都谈密码色变都开始检测自己的系统是否存在漏洞。那么我们作为一名Go程序的开发者一定也需要知道我们的应用程序随时会成为众多攻击者的目标并提前做好防范的准备。
很多Web应用程序中的安全问题都是由于轻信了第三放提供的数据造成的。比如对于用户的输入数据在对其进行验证之前都应该将其视为不安全的数据。如果直接把这些不安全的数据输出到客户端就可能造成跨站脚本攻击(XSS)的问题。如果把不安全的数据用于数据库查询那么就可能造成SQL注入问题我们将会在9.3、9.4小节介绍如何避免这些问题。
@@ -26,4 +26,4 @@
* 下一节: [预防CSRF攻击](<9.1.md>)
## LastModified
* $Id$
* $Id$

17
genepub.sh Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/sh
if [ ! -f build-web-application-with-golang ];then
go build
fi
if [ ! -d tmp ];then
mkdir tmp
fi
cd tmp
cp ../*.md .
for i in *.md;do
sed -i '/^[#]\{1,\}/s!^\([#]\{1,\}\)\([^#]\{1,\}\)!\1 \2!' $i
sed -i '/!\[\](images/s#images\(.*\)?raw=true#../Images\1#' $i
done
../build-web-application-with-golang
rm *.md

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 78 KiB

BIN
images/polling.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB