论坛首页 Web前端技术论坛

原创翻译:JSON和浏览器安全(作者:Douglas Crockford)

浏览 6807 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-29  

JSON和浏览器安全
April 10, 2007 at 10:14 am by Douglas Crockford 翻译:Frank Cheung
文章出处:http://yuiblog.com/blog/2007/04/10/json-and-browser-security
JSON是一种数据交换格式,可用于机器之间的数据传送。它只是表达数据,所以它本身是与安全无关的。使用JSON的系统安全与否,取决于该系统自身设计的好坏。JSON本身并不会引入安全隐患。

浏览器是一种特别的应用程序环境。在经过长期的预测和跌跌撞撞下,浏览器的安全模型(security model)渐渐地被“锻炼”出来。大多数浏览器的漏洞已经被解决,一些情况下,修补漏洞却又很麻烦,很可能是“拆东墙补西墙”的方式来做的,所以,这种做法,又会导致一系列的错误的出现,继续跌跌撞撞,甚至更痛苦。

良好的习惯做法可避免此类痛苦。通常,所谓的专家,似乎不能够将好的习惯做法和不好的区分开来,使得有好多误导人的建议出现在web上。
下面我分享一下自己几个的“经验之谈”。如果你能抓住这些“经验之谈”,相信你会很快摆脱那些坏习惯。

勿信浏览器(Never Trust Browser)
浏览器不能够、也不会保护你的秘密,所以切勿发送秘密资料。瑾记服务端是要通过验证的。浏览器验证用户输入只是方便用户,而所有内容发到服务器必须通过验证。



保持数据整洁(Keep Data Clean)
JSON是JavaScript的子集,在WEB程序中很容易使用。由XMLHttpRequest 得到的文本格式,可通过eval方法快速地转换成为有用的数据结构。但是要注意的是,eval方法非常的不安全。如果服务器生成的JSON有轻轻、小小的错误的话,那换parseJSON解析会更好一些。parseJSON 方法使用正则表达式以保证这段文本没有危险。下一版的JavaScript会有这个方法。现在,你可以在http://www.JSON.org/json.js找到parseJSON。
服务端方面,尽可能使用好的JSON解码、编码器。

Script标签 (Script Tags)

Script可从同源策略( The Same Origin Policy)中豁免。这意味着从该页面上会潜伏着任何一个站点的脚本。以至会有一些严重的后果。
页面上引用其它站点的脚本是不安全的。外置脚本常用于传送广告、搜索选项、登录、警告、好友列表、或其它有趣的东西。不幸地是,JavaScript 和 DOM的设计中没有预料到这些有用的服务,所以不能提供任何的安全保护。页面上的每段代码都可以访问该页面上的任何一处内容。当你在页面上加载脚本,便允许了脚本能够访问你所有的机密资料,或者是你用户的机密资料。而且也是允许了脚本访问服务器的权限,如用户能够做到的事情一样。究竟怎样区分是用户发起的请求,还是脚本发起的请求,是很难做到的。有朝一日,浏览器会提供某些程度的限制机制。不过那一天没到,script标签一天都是危险的。

Script标签的另外一个用途是“跨域”调用JSON。若果站点发送的是恶意脚本而非JSON数据,这种的情形是绝对没有保障的。所以希望,有朝一日,浏览器会提供安全的跨域数据传输机制。Script标签实在太危险了。


Script标签亦用于传送Ajax库。不要加载其它的库除非你拥有高级别的信任。

切勿发送数据到陌生人(Don’t Send Data To Strangers)
如果你服务器发送敏感的资料到一个恶意的网页,运气好的话会通过。有些情况同源策略会阻止传输,事实却是由于浏览器的BUG缘故数据会通过,浏览器不会受到影响。机密消息的泄露是服务器的责任。这个责任不能推卸到浏览器身上。

所以请求必须认证。Cookies不是适合的认证源,难担机密之重务。类似的对话中,JSON工作的较出色:用JSON的有效负荷中POST一个包含机密的请求,然后得到新机密的JSON响应。

由于Script可从同源策略( The Same Origin Policy)中豁免,任何页面的Script都是发送GET请求到服务器,请求甚至包含你的COOKIES。所以,如果响应(Reponse)包含机密信息,那你的服务器就应该拒绝该请求。

有些人的做法是在JSON文本外面绕上一些“神奇包裹器( magic wrappers )”,就可以防止未认证的用户接收。千万不要信以为真。这会使得新浏览器出现更多BUG,得不偿失。

使用(Use SSL)
若然传输、请求机密之消息,请使用SSL。SSL提供了通信线路保密( link encryption),使得你的消息在传输过程中不被泄露。

   发表时间:2007-06-29  
请问原创翻译是什么意思。
0 请登录后投票
   发表时间:2007-06-29  
大哥,你翻译的忒生硬了,而且有些词翻译的不妥。我把第一段重新翻译一下:

JSON is a data interchange format. It is used in the transmission of data between machines. Since it carries only data, it is security-neutral. The security of systems that use JSON is determined by the quality of the design of those systems. JSON itself introduces no vulnerabilities.

JSON是一种数据交换格式,可用于机器之间的数据传送。它只是表达数据,所以它本身是与安全无关的。使用JSON的系统安全与否,取决于该系统自身设计的好坏。JSON本身并不会引入安全隐患。

JSON是一种数据交换格式。它用于在两台机器之间的传输。由于它承载的只是数据,所以它是安全中立的(security-neutral)。使用JSON系统的安全系数,取决于这个系统的设计指标。JSON本身不会有攻击性。
0 请登录后投票
   发表时间:2007-06-29  
to Hax:
谢谢Hax的协助翻译。“大哥”实不敢当。许多的问题,也可能难以满足众多看官的心愿。还是您提出一些问题,咱们来共同探讨为好。
0 请登录后投票
   发表时间:2007-06-29  
你第一段翻译的问题是:

第二句“它用于在两台机器之间的传输”,漏掉了data。
第三句,最近似乎“承载”这个词用的太多太滥了……我一听到这个词,就感觉像是听报告或是演说。我怕读者承载不了那么严肃的意义,所以还是用点大白话来翻译比较容易接受吧。
接着,对于“安全中立”这样的译法,我是不太中立的,这里不是法律文书,直译很拗口,还是可以采取意译的方式的。
第四句,你又跟上面死扣文字相反,添加了“系数”、“指标”,很有做报告的感觉嘛。
最后,“攻击性”的翻译是不对的。黑客才有攻击性。
0 请登录后投票
   发表时间:2007-06-29  
后面翻译的问题,随便举几例:

“良好的习惯做法可避免此类痛苦”——这是一个病句,看看原文:
This pain can be avoided by adopting good practices.
adopting被你省略了。

principle被你翻译成“经验之谈”,这是不恰当的。principle是准则、原则,往往是先验的,而非经验的。事实上,后面DC所说几点,例如never trust browser可以说是简单的常识,从安全原理上就可以推导出来。

“浏览器不能够、也不会保护你的秘密,所以切勿发送秘密资料”——不用看原文你也能发现问题了吧。看一下原文也好:so never send it your secret sauce。你把“it”活生生的吃掉了。

顺带一说,secret sauce翻成“秘密资料”太没趣味了,直接“秘方”就好了么。

“瑾记”——错别字。而且这一句不知道哪儿来的,原文是“Keep your critical processes on the server”,意思是关键过程(比如银行转账……)应该在server端执行。

“Script可从同源策略( The Same Origin Policy)中豁免。”能不能让读者从生硬翻译中豁免?“Script标签不受同源策略的限制”有那么难说么?
0 请登录后投票
   发表时间:2007-06-29  
That means that any script from any site can potentially be loaded into any page.
这一句中的三个any,你只翻了一个,语气和意思完全没有到位。

“以至会有一些严重的后果”——这个翻译……后果很严重,读者很生气……原文是:There are some very important consequences of this. 意思是从“不受同源策略限制”可以导出一些非常重要的推论。

Any page that includes scripts from other sites is not secure.
这个any你又没翻。
0 请登录后投票
   发表时间:2007-06-29  
你说的对.哈~ 小弟又学习不少。
0 请登录后投票
   发表时间:2007-06-29  
“有朝一日,浏览器会提供某些程度的限制机制。”
原文是browsers will offer some degree of modularity that would limit the danger.这个modularity(http://json.org/module.html)是DC提出的新机制,你也略掉了,老D同志肯定很生气,咋能把我的广告悄悄的撤了呢?

“不过那一天没到,script标签一天都是危险的”——别扭。人家原文“Until then, script tags are extremely dangerous.”也蛮简单的,咋译出来哪一天味儿都不对呢?

some day soon, browsers will offer safe cross-site data transport(http://json.org/JSONRequest.html). 你又把老D的广告时间给掐了,忒不厚道。

Don’t Send Data To Strangers ——给点趣味,直接“不要跟陌生人说话”就好啦。

“如果你服务器发送敏感的资料到一个恶意的网页,运气好的话会通过。”银行密码都发到恶意网页了,还运气好啊?
原文:If your server sends sensitive data to an evil web page, there is a good chance that the browser will deliver it.

“事实却是由于浏览器的BUG缘故数据会通过,浏览器不会受到影响。”
原文:but the fact is that browsers are buggy and sometimes the data will go through. It doesn’t make sense to get mad at the browser.
你的翻译很buggy,读者肯定受到影响了,保不准会get mad。。。

“类似的对话中,JSON工作的较出色:用JSON的有效负荷中POST一个包含机密的请求,然后得到新机密的JSON响应。”——这段文字可能加过密了。。。让我们看看明文:
JSON often works best in a dialog: POST a request including the secret in the JSON payload, and get a JSON response in return along with a new secret.
如果你不明白这个secret是指什么,那可能是因为前面的这段“You must have some secret which is known only by the page that indicates that it should be given the goods.”又被译者吃掉啦。

“千万不要信以为真。这会使得新浏览器出现更多BUG,得不偿失。”原文:Avoid that stuff. It will fail when new browser bugs are created and discovered, and in some cases might introduce painful new exploits.
读者千万不要信以为真,以为json可以让新浏览器出现更多bug,否则从旧的改用新的不是得不偿失么……

“若然传输、请求机密之消息,请使用SSL。”

若然要发表原创之翻译,请务必先将译文通读一遍,再行发表,以免累坏读者。




以上。

不开玩笑了,相较而言,我觉得翻译当比自己写文章更加严谨,因为你不仅要对读者负责,也应对原作者负责。
0 请登录后投票
   发表时间:2007-06-29  
顺便说一句,偶的英文滥的可以,四级考了60.5惊险过关,六级至今未过,相信sp42同志的水准不应该比我更差,所以应该批评,这个是态度问题。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics