フォームの検証には、どこにでもあるjquery validate プラグインを使用しています。フォーム要素に検証ルールを追加するためのメタデータ プラグインの使用をサポートします。
この機能を使用しています。validate でこれらのルールを探すと、要素に対して次の呼び出しが行われます。
$(element).metadata()[meta]
wheremeta
は、それらのルールを保存するプレフィックスです。例えば
<input data-validate="{maxLength: 12}" name='foo'/>
これらの属性を取得するには、meta の値を「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);
});
}
data-*
その結果、メタデータはすべての属性を解析し、コンテンツを評価しようとします! これは、json を含まないデータ属性を含めるとすぐに壊れます。
今質問:
メタデータと検証はどちらも「実証済み」のプラグインのようです。これは、人々が一緒に暮らすメタデータ プラグインを使用した場合の既知の副作用ですか?
私は通常、プロジェクトのニーズに合わせてプラグイン コードを変更するのは好きではありませんが、次のいずれかを行う必要があるようです。
- やみくもに eval を行わないようにメタデータ プラグインを修正し、eval または
.data()
メタデータ プラグインの代わりに検証プラグインを使用するように修正
また、メタデータプラグインを変更する以外に、これを回避する方法はありますか
報奨金の投稿の編集: 私はこれをより明確にする必要がありました.これがどのように起こったのかについての議論に興味があります. この規模のバグが、標準的な検証プラグインと resig によって書かれたあらゆる場所で使用されているプラグインの両方にどのように存在する可能性があるか。
修正は簡単で、私はすでにそれを適用しています ('meta' が定義されているときに $.data を使用するように検証プラグインを変更することにしました) - ここで 150 ポイントを与えているのは、これがまだ問題である理由についての考えです (または多分そうじゃない!)