对很久以前的一个bug进行分析和总结
function parsePost(data, action) {
try {
var postData = eval("(" + data + ")");
// TO DO1
} catch (e) {
// TO DO2
}
}
这是一段页面的老代码,data是数据库body字段,既是用户录入并取出的数据,由于业务的关系,data是以json格式保存的,为了使数据能实现兼容,这里使用try...catch...方式处理,如果变量data能被转换成对象,则执行TO DO1,否则执行TO DO2.
我们知道eval的作用很简单,就是把一段字符串传递给js解析器,由javascript解析器将这段字符串解释成为javascript代码,并且执行.不过这也是非常危险,尤其是在给它传递用户输入的数据时,这往往就是恶意用户的一个切入点.
安装上面的代码,如果用户输入的data是一段js代码,如"alert('hello')",那么这段代码用数据库出来后显示部分就会eval("alert('hello')"),这时我的页面就会以alert提示框的方式弹了出来.
好了,这个就是大家都知道的 Cross-site scripting (XSS),中文翻译是跨站脚本攻击。
Cross-site scripting (XSS) is a type of computer security vulnerability typically found in web applications which allow code injection by malicious web users into the web pages viewed by other users. Examples of such code include HTML code and client-side scripts. (摘自《Cross-site scripting》http://en.wikipedia.org/wiki/Cross- site_scripting)这里介绍了 XSS 的背景,类型,利用和防范等几方面内容。
下面开始修复工作。这段代码显然没能对 data 作好严格的判断工作,data 不但是用户输入的内容,还要被似乎万恶的 eval() 函数执行,而整个过程没有对 用户输入的 data 进行一个校验工作,这就是问题所在,而且问题相当严重。
针对跟贴系统此段代码的业务逻辑,可以通过判断 data 的数据类型来确定其逻辑结构,更改后的代码如下∶
function parsePost(data, action) {
if (typeof(data) == 'string') {
// TO DO2
}
else {
// TO DO1
}
}
代码在主体上修改如上,我们的选择是,绕开 eval() 函数,把 body 的原型赋给 Javascript 的变量 data,然后使用 typeof() 来对 data 作判断处理,并且根据此判断继续下一步的处理。
另外也可以是使用 JSON 解析器对 JSON 进行解析,可从http: //www.json.org/json.js 下载的参考实现脚本。JSON 是一种基于文本的开放式数据交换格式(请参见 RFC 4627)。
ps:此bug发生在2008年,跟帖受xss攻击