我正在使用无处不在的jQuery验证插件进行表单验证。它支持使用元数据插件为表单元素添加验证规则。
我正在使用这个功能。当验证器查找这些规则时,它会在元素上进行如下调用:
以下是元数据插件将数据属性解析为JSON的过程:
因此,最终发生的情况是metadata解析所有
现在的问题是:
看起来metadata和validate都是“经得起考验”的插件。使用metadata插件会有这种已知的副作用吗?
我通常不喜欢修改插件代码以适应我的项目需求,但这似乎要么:
修复metadata插件以不盲目地评估内容,并且不使用eval或
修复validate插件以使用
此外,除了修改metadata插件之外,还有其他方法可以解决这个问题吗?
发布赏金编辑:
我应该更清楚地表达,我对如何可能发生这种情况感到感兴趣。为什么一个如此重要的漏洞会存在于一个经典的验证插件和一个由Resig编写的无处不在的插件中。
修复很简单,我已经应用了它(我选择修改validate插件以在定义'meta'时使用$.data) - 我在这里给出150点的原因是想法为什么这仍然是一个问题(或者也许不是!)。
我正在使用这个功能。当验证器查找这些规则时,它会在元素上进行如下调用:
$(element).metadata()[meta]
其中meta
是存储这些规则的前缀。例如:
<input data-validate="{maxLength: 12}" name='foo'/>
的值将被设置为“validate”以捕获这些属性。但是这里有一个主要问题!以下是元数据插件将数据属性解析为JSON的过程:
var getObject = function(data) {
if(typeof data != "string") return data;
data = eval("(" + data + ")"); //oh no!!!!!
return data;
}
if ( settings.type == "html5" ) {
var object = {};
$( elem.attributes ).each(function() {
var name = this.nodeName;
if(name.match(/^data-/)) name = name.replace(/^data-/, '');
else return true;
object[name] = getObject(this.nodeValue);
});
}
因此,最终发生的情况是metadata解析所有
data-*
属性,并尝试评估内容!一旦包含不包含json的数据属性,这将导致故障。现在的问题是:
看起来metadata和validate都是“经得起考验”的插件。使用metadata插件会有这种已知的副作用吗?
我通常不喜欢修改插件代码以适应我的项目需求,但这似乎要么:
修复metadata插件以不盲目地评估内容,并且不使用eval或
修复validate插件以使用
.data()
而不是metadata插件此外,除了修改metadata插件之外,还有其他方法可以解决这个问题吗?
发布赏金编辑:
我应该更清楚地表达,我对如何可能发生这种情况感到感兴趣。为什么一个如此重要的漏洞会存在于一个经典的验证插件和一个由Resig编写的无处不在的插件中。
修复很简单,我已经应用了它(我选择修改validate插件以在定义'meta'时使用$.data) - 我在这里给出150点的原因是想法为什么这仍然是一个问题(或者也许不是!)。