2014-01-18 9 views
9

私は次のコードと同等のものを持っているのJavaScriptフレームワークに貢献している:私はこれはひどいではありません知っている次のjavascriptは任意のコード実行から安全ですか?

eval("'" + user_input.replace(/'/g, "'") + "'"); 

- 私を説得する必要。私が知りたいことは、ここに任意のコードを注入できますか?

一見してuser_input.replace("'", "'")は、私が文字列から脱落するのを防ぐように見えるでしょう。しかし私は改行を渡すことができます。 \nalert(123)\nですが、結果は常に構文エラーです。

' 
alert(123) 
' 

実際には、構文エラーを引き起こすだけではなく、ここにコードを挿入するベクターがありますか?

+1

私はここにできる注射の種類がほとんどあることを保証することができます... – Markasoftware

+0

あなたはいつもあなたが 'eval()'を使うと、それはまったく安全ではないと想定するかもしれません、そして、あなたはおそらく他の多くの間違いを犯したことがあります。それはハッカーたちの夢です。 – adeneo

+0

あなたは私にこれを説得する必要はありません。私はちょうど実際の攻撃の開発者に良い例を提供したい。 – bluepnume

答えて

8

これは間違いなく気になるパターンですが、記載されている方法で正確に使用すると安全です。 Javascriptで一重引用符で囲まれた文字列を終了できる唯一の文字は一重引用符です。その文字が単一引用符に挿入された文字列に現れない限り、文字列以外の文字として解釈されることはありません。

私が考えることのできる最悪のことは、バックスラッシュで文字列を終了することです。 user_inputがあった場合:

example\ 

を評価コードがevalに含まれる文字列が終了されることはありませんので、構文エラーになり

'example\' 

だろう。しかし、実際のevalがもっと複​​雑な場合はです。これはに悪用されます。例えば、コードがあった場合:をもたらす

; alert(1); // \ 

var escaped_input = user_input.replace(/'/g, "&39;"); 
eval("'" + escaped_input + "' some more stuff '" + escaped_input + "'"); 

は、それはような入力に悪用される可能性があり

'; alert(1); // \' some more stuff '; alert(1); // \' 
             ^^^^^^^^^ 

た下線付きで文字列を終了することになっていた見積もりがエスケープされて、次の一重引用符がになり、コンテンツが評価されます。見積もり!安全のために、可能であれば、バックスラッシュをエスケープまたは置換することをお勧めします(具体的にはeval()を使用して例外をキャッチする場合を除きます)。

+0

ええ、node.js replで、 'user_input =" console.log(42)\\ "'で文字列の終わりを待つのを一時停止することができます。 –

+0

それはかなり正しいとは思わない。不正な入力の 'eval()'はSyntaxErrorを投げ、インタプリタを一時停止しません。 – duskwuff

+0

はい、プログラム内ですが、replの中では、これ以上入力するのを待っています。 –

関連する問題