diff --git a/10.1.md b/10.1.md index 76ef731e..7f23496c 100644 --- a/10.1.md +++ b/10.1.md @@ -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$ \ No newline at end of file + * $Id$ diff --git a/10.2.md b/10.2.md index 75c45027..37e00a60 100644 --- a/10.2.md +++ b/10.2.md @@ -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文件 + + //css文件 + + //图片文件 + + +这样我们在本地化视图以及资源的时候采用这种方式就可以很容易的进行扩展了。 + +##总结 +本小节介绍了如何使用存储本地资源,本地资源有些需要通过转换函数,有些通过lang设置,但是最后都是通过key-value的方式存储了相应的Locale对应数据,然后通过转换函数通过key读取出来相应的Locale信息,如果是文本信息就直接输出了,如果是时间日期或者货币需要结合`fmt.Printf`函数的处理才能转换成正确的信息展示,而对于不同Locale的视图和资源是最简单的,只要在路径里面增加lang就可以实现了。 + ## links * [目录]() * 上一节: [设置默认地区](<10.1.md>) * 下一节: [国际化站点](<10.3.md>) ## LastModified - * $Id$ \ No newline at end of file + * $Id$ diff --git a/10.3.md b/10.3.md index 0aa62b23..8fd9af75 100644 --- a/10.3.md +++ b/10.3.md @@ -1,11 +1,20 @@ -##10.3 国际化站点 +# 10.3 国际化站点 +前面小节介绍了如何处理本地化资源,即Locale一个相应的配置文件,那么如果处理多个的本地化资源呢?而对于一些我们经常用到的例如:简单的文本翻译、时间日期、数字等如果处理呢?本小节将一一解决这些问题。 ##管理多个本地包 + ##自动加载本地包 -##template mapfunc + +##template mapfunc + +1. 文本信息 +2. 时间日期 +3. 数字 + +##总结 ## links * [目录]() * 上一节: [本地化资源](<10.2.md>) * 下一节: [小结](<10.4.md>) ## LastModified - * $Id$ \ No newline at end of file + * $Id$ diff --git a/10.4.md b/10.4.md index 34527928..2af42fac 100644 --- a/10.4.md +++ b/10.4.md @@ -1,4 +1,4 @@ -##10.4 小结 +# 10.4 小结 通过这一章的介绍,读者应该对如何操作i18n有了深入的了解,我也根据这一章介绍的内容实现了一个开源的解决方案go-i18n:https://github.com/astaxie/go-i18n 通过这个开源库我们可以很方便的实现多语言版本的Web应用,使得我们的应用能够轻松的实现国际化。如果你发现这个开源库中的错误或者那些缺失的地方,请一起参与到这个开源项目中来,让我们的这个库争取成为Go的标准库。 ## links * [目录]() @@ -6,4 +6,4 @@ * 下一节: [错误处理,故障排除和测试](<11.md>) ## LastModified - * $Id$ \ No newline at end of file + * $Id$ diff --git a/10.md b/10.md index ddc29435..93ec1c88 100644 --- a/10.md +++ b/10.md @@ -1,4 +1,4 @@ -##10 国际化和本地化 +# 10 国际化和本地化 为了适应经济的全球一体化,作为开发者,我们需要开发出支持多国语言、国际化的Web应用,即同样的页面在不同的语言环境下需要显示不同的效果,也就是说应用程序在运行时能够根据请求所来自的地域与语言的不同而显示不同的用户界面。这样,当需要在应用程序中添加对新的语言的支持时,无需修改应用程序的代码,只需要增加语言包即可实现。 国际化与本地化(Internationalization and localization,通常用i18n和L10N表示),国际化是将针对某个地区设计的程序进行重构,以使它能够在更多地区使用,本地化是指在一个面向国际化的程序中增加对新地区的支持。 @@ -27,4 +27,4 @@ * 下一节: [设置默认地区](<10.1.md>) ## LastModified - * $Id$ \ No newline at end of file + * $Id$ diff --git a/9.1.md b/9.1.md index 9b1c5684..1b11a4df 100644 --- a/9.1.md +++ b/9.1.md @@ -1,4 +1,4 @@ -##9.1 预防CSRF攻击 +# 9.1 预防CSRF攻击 ##什么是CSRF CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 @@ -91,4 +91,4 @@ CSRF的防御可以从服务端和客户端两方面着手,防御效果是从 * 下一节: [确保输入过滤](<9.2.md>) ## LastModified - * $Id$ \ No newline at end of file + * $Id$ diff --git a/9.2.md b/9.2.md index 32d174a9..e84670fd 100644 --- a/9.2.md +++ b/9.2.md @@ -1,4 +1,4 @@ -##9.2 确保输入过滤 +# 9.2 确保输入过滤 过滤用户数据是Web应用安全的基础。它是验证数据合法性的过程。通过对所有的输入数据进行过滤,可以避免恶意数据在程序中被误信或误用。大多数Web应用的漏洞都是因为没有对用户输入的数据进行恰当过滤所引起的。 我们介绍的过滤数据分成三个步骤: @@ -72,4 +72,4 @@ * 下一节: [避免XSS攻击](<9.3.md>) ## LastModified - * $Id$ \ No newline at end of file + * $Id$ diff --git a/9.3.md b/9.3.md index 990e4d04..45cda210 100644 --- a/9.3.md +++ b/9.3.md @@ -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$ \ No newline at end of file + * $Id$ diff --git a/9.4.md b/9.4.md index b95396c5..127ee8df 100644 --- a/9.4.md +++ b/9.4.md @@ -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$ \ No newline at end of file + * $Id$ diff --git a/9.5.md b/9.5.md index 01bf6c86..e6bdccbf 100644 --- a/9.5.md +++ b/9.5.md @@ -1,4 +1,4 @@ -##9.5 存储密码 +# 9.5 存储密码 过去一段时间以来, 许多的网站遭遇用户密码数据泄露事件, 这其中包括顶级的互联网企业–Linkedin, 国内诸如CSDN,该事件横扫整个国内互联网,随后又爆出多玩游戏800万用户资料被泄露,另有传言人人网、开心网、天涯社区、世纪佳缘、百合网等社区都有可能成为黑客下一个目标。层出不穷的类似事件给用户的网上生活造成巨大的影响,人人自危,因为人们往往习惯在不同网站使用相同的密码,所以一家“暴库”,全部遭殃。 那么我们作为一个Web应用开发者,在选择密码存储方案时, 容易掉入哪些陷阱, 以及如何避免这些陷阱? @@ -89,4 +89,4 @@ Go语言对这三种加密算法的实现如下所示: * 下一节: [加密和解密数据](<9.6.md>) ## LastModified - * $Id$ \ No newline at end of file + * $Id$ diff --git a/9.6.md b/9.6.md index 8a9147fb..ae2aeeaf 100644 --- a/9.6.md +++ b/9.6.md @@ -1,4 +1,4 @@ -##9.6 加密和解密数据 +# 9.6 加密和解密数据 前面小节介绍了如何存储密码,但是有的时候,我们想把一些敏感数据加密后存储起来,在将来的某个时候,随需将它们解密出来,此时我们应该在选用对称加密算法来满足我们的需求。 ##base64加解密 @@ -116,4 +116,4 @@ Go语言的`crypto`里面支持对称加密的高级加解密包有: * 下一节: [小结](<9.7.md>) ## LastModified - * $Id$ \ No newline at end of file + * $Id$ diff --git a/9.7.md b/9.7.md index c5e0c431..add6005f 100644 --- a/9.7.md +++ b/9.7.md @@ -1,4 +1,4 @@ -##9.7 小结 +# 9.7 小结 这一章主要介绍了如:CSRF攻击、XSS攻击、SQL注入攻击等一些Web应用中典型的攻击手法,它们都是由于应用对用户的输入没有很好的过滤引起的,所以除了介绍攻击的方法外,我们也介绍了了如何有效的进行数据过滤,以防止这些攻击的发生的方法。然后针对日异严重的密码泄漏事件,介绍了在设计Web应用中可采用的从基本到专家的加密方案。最后针对敏感数据的加解密简要介绍了,Go语言提供三种对称加密算法:base64、aes和des的实现。 编写这一章的目的是希望读者能够在意识里面加强安全概念,在编写Web应用的时候多留心一点,以使我们编写的Web应用能远离黑客们的攻击。Go语言在支持防攻击方面已经提供大量的工具包,我们可以充分的利用这些包来做出一个安全的Web应用。 ## links @@ -7,4 +7,4 @@ * 下一节: [国际化和本地化](<10.md>) ## LastModified - * $Id$ \ No newline at end of file + * $Id$ diff --git a/9.md b/9.md index 4e33aa05..067017d3 100644 --- a/9.md +++ b/9.md @@ -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$ \ No newline at end of file + * $Id$ diff --git a/genepub.sh b/genepub.sh new file mode 100755 index 00000000..a21a0f81 --- /dev/null +++ b/genepub.sh @@ -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 diff --git a/images/3.1.dns_inquery.png b/images/3.1.dns_inquery.png index 8b529887..b95d952e 100644 Binary files a/images/3.1.dns_inquery.png and b/images/3.1.dns_inquery.png differ diff --git a/images/9.1.csrf.png b/images/9.1.csrf.png index 8fd35a0a..54d3a434 100644 Binary files a/images/9.1.csrf.png and b/images/9.1.csrf.png differ diff --git a/images/polling.png b/images/polling.png new file mode 100644 index 00000000..8bd128ec Binary files /dev/null and b/images/polling.png differ