好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

一个replace()引发的血案 - 网站安全 - 自学php

Twitter在不久前曾经爆了一个XSS,悲剧的是,程序员的patch方案有问题,结果再次被爆菊了。 详细的分析可以看 html " target=_blank> http://blog.mindedsecurity测试数据/2010/09/twitter-domxss-wrong-fix-and-something.html 我们姑且不去说这个patch方案中其他的问题,我们关注下javascript中replace()的使用。 当时twitter的程序员是这样patch的: var c = location.href.split("#!")[1]; if (c) { window.location = c.replace(":", ""); } else { return true; } 但是,javascript有个非常要命的地方,replace()函数的第一个参数,按照规范中的方式,是要用正则写的。如果第一个参数是一个字符串,怎么办? javascript默认只会替换掉他找到的第一个字符 这和很多其他语言都是不同的! 所以,twitter第二次被爆菊的POC里,使用两个:就绕过了这条patch http://twitter测试数据/#!javascript::alert(document.domain); Gareth Heyes为此写了一篇blog讲这个问题 http://HdhCmsTestthespanner.co.uk/2010/09/27/string-replace-javascript-bad-design/ 这是一个很细节的问题,很多程序员都会用错。 我review了一些国内大站的几个主要页面,发现qq、百度等暂时都未发现此问题,在下面几个站点发现了一些用错的情况(当然也可能是程序员心里明白,故意这样用): 优酷: common.js: window.nova_init_hook_initsearch = function() {

不过,并非是用错了就一定会产生安全问题,但是很可能会产生些不可预知的后果,俗称就是bug。 那什么情况下会产生安全问题呢?当replace是用于安全过滤的时候。 我在google codesearch上找到了很多这种例子: http://HdhCmsTestgoogle测试数据/codesearch?hl=en&lr=&q=lang%3Ajavascript+%22.replace%28%27%3Cscript%22&sbtn=Search 改变搜索条件还可以搜到更多,比如 lang:javascript ".replace(" lang:javascript ".replace(javascript" 等等 所以,要安全的在javascript中使用replace函数,最好还是要使用正则: .replace(//, )    单个 .replace(//g, )   全局 第一个参数使用字符串,是一个很不好的习惯,虽然我们经常犯 :D

查看更多关于一个replace()引发的血案 - 网站安全 - 自学php的详细内容...

  阅读:60次