で使用try..catch
するeval()
JSFiddleで必要な処理を行う安全でない例を作成しましたが、キャレットがまだ入力ボックスにあるときに結果を待つ代わりに、blur
イベントにアタッチして、コントロールの外でフォーカスを切り替えたときに値が評価されるようにしました。
それがすることはこれです:
$("input").blur(function(evt) {
try {
var val = eval(this.value);
this.value = val;
}
catch (e) {}
});
入力ボックスの内容を評価しようとし、評価できた場合は、内容を結果に置き換えます。eval
これは、噛むことができる限り、何でも投げることができることを意味します。
私は安全ではないと言いました。なぜなら、コードはブラックホールが宇宙を飲み込む原因となる可能性のあるものについてコンテンツをチェックしていないからです...;)
例
1 + 2 * 3
変更されます7
universe
宇宙のままにします
010+1
9に変更されます(したがって、8進数もグロクします)
0xf *2 +3
33を返します(ma'hexも見てください)
- 等
それをより安全にするためにあなたの方法を実装してください
もちろん、これはほんの始まりにすぎません。xを乗数にしたい場合は、入力文字列でいくつかの置換を行う必要がありますが、私の例では行いません。しかし、そうするのはかなり簡単です。
特定の計算のみを実行したい場合も同じことが当てはまります。そのため、オブジェクトや日付などの作成は許可されません...
あなたの場合に望ましくない可能性が高い例は、入力する場合です
alert(new Date())
もちろん、このコードを実行してアラートボックスを表示します。これを許可するかどうかはあなた次第です。元のデータをサーバーに投稿する場合は、もちろん入力を厳しくサニタイズする必要があります。