2

私がやっていることは、真理値表ジェネレーターを作成することです。ユーザーが提供する関数 (例: a && b || c) を使用して、JavaScript に a、b、c のすべての組み合わせを関数の結果とともに表示させようとしています。

ポイントは、ユーザーが提供する関数を解析する方法が完全にはわからないということです。つまり、ユーザーは基本的に必要なものすべてを関数に入れることができ、それにより私のウェブサイトが変更されるなどの影響が生じる可能性があります.

eval()まったく安全ではありません。どちらも ではありません。どちらもnew Function()、ユーザーが関数内の好みに合わせてすべてを配置できるためです。通常JSON.parse()は の優れた代替手段ですがeval()、関数は JSON には存在しません。

a && b || cそのため、悪意のあるコード文字列を無視しながら、カスタムのブール演算子文字列を関数のように解析する方法を考えていました。関数内ではブール演算子 ( &&, ||, !) のみを使用できます。

4

4 に答える 4

1

ブール式をチェックしても、次のことができます。

(a && b && (function() { ruinYourShit(); return true; })())

これは、一般的なケースでは問題が解決できないことを示すためです。

状況に応じて機能させるには、すべての変数が1つのアルファベット文字であることを要求するなど、変数の命名に厳しい制限を課し、正規表現を使用して他に何かが見つかった場合にそれをキックバックする必要があります。また、ブール式を「一致」させるには、実際にはその式の文法を開発する必要があります。非正規言語(javascript)を解析しようとしているため、任意の複雑さのすべての可能なブール式に一致する可能性のある正規表現を記述できません。基本的に、あなたが解決しようとしている問題は本当に、本当に難しいです。

誰かがあなたのたわごとを台無しにした場合に世界が崩壊することを期待していないと仮定すると、キーワードをチェックし、とに含まれる論理コードブロックを禁止するだけで十分な解決策を開発できます。function{}

于 2011-03-22T14:07:52.393 に答える
1

入力を期待するサーバー側スクリプトのいずれかに適切な検証/フィルターがある限り、eval()を使用してユーザーに好きなことをさせても問題はありません。確かに、ユーザーはあなたのページを台無しにする何かをすることができます、しかし(s)彼はすでにそれをすることができます。ユーザーは、組み込みのブラウザ機能やアドオンをいくつでも使用して、ページ上で必要なJavaScriptを簡単に実行できます。

于 2011-03-22T14:08:49.830 に答える
1

私が行うことは、最初にユーザー入力をトークン(変数名、演算子、および場合によってはグループ化のための括弧)に分割し、次にそれから式ツリーを構築し、次に式ツリーから関連する出力を生成することです(おそらくいくつかの簡略化を実行した後それ)。

たとえば、文字列「a&!b」をトークンシーケンス「a」「&」「!」に分割します。"b"を実行し、(最終的には)booland(boolvar( "a")、boolnot(boolvar( "b")))のようなものを作成すると、(カスタム、できればインジェクション)を実行するための適切なデータ構造が得られます。 -無料)評価者以上。

于 2011-03-22T14:10:06.480 に答える
0

私は正規表現で終わった:

if(!/^[a-zA-Z\|\&\!\(\)\ ]+$/.test(str)) {
   throw "The function is not a combination of Boolean operators.";
   return;
}
于 2011-03-22T15:20:58.250 に答える