2013-08-12 7 views
7

多くの開発者は、JavaScriptのeval()メソッドは避けるべきだと考えています。この考え方は、設計の観点からは理にかなっています。よりシンプルで優れたオプションが利用可能な場合は、醜い回避策としてよく使用されます。JavaScriptのeval()メソッドを利用する

しかし、私はセキュリティの脆弱性に関する懸念を理解していません。確かに、eval()を実行すると、実行可能なJavaScriptコードを実行する能力がハッカーに与えられます。

しかし、これはどうしてもできないのですか? Chromeでは、少なくとも開発者ツールでエンドユーザーが独自のJavaScriptを実行できるようになります。 eval()はデベロッパーツールよりどのように危険ですか?

+2

これは「共通のコンセンサス」ではありません。多くの経験豊富な開発者はFUDによって 'eval'について悩まされています。 * "eval is evil" *はおそらく今日経験豊富なコーダーによって言われることはありません。あなたがばかだと危険です。しかし、通常は遅くて醜いので、コードを進化させるのは難しいです。 –

+0

今、私はこの質問が良い答えを受け取る方法を見ていません... –

答えて

11

B-Conが述べたように、攻撃者はコンピュータに座っているものではないため、現在のユーザーのセッションを悪用するためにサイトに悪質なコードを渡す手段としてスクリプト内に既にeval()を使用している可能性があります。 (例えば悪意のあるリンクをたどっているユーザーなど)。

eval()の危険性は、unsanitised値で実行され、DOM Based XSSの脆弱性が発生する可能性があります。

Your query string was ?foo

しかし、どのようなクエリ文字列は、あなたは、単に次のように述べて、警告ダイアログが表示?fooある場合

<script> 

eval('alert("Your query string was ' + unescape(document.location.search) + '");'); 

</script> 

(むしろ不自然、それは私が願って問題を示しています)、あなたのHTMLに次のコードを検討このコードでは、ユーザーが自分のサイトからhttp://www.example.com/page.htm?hello%22);alert(document.cookie+%22などのURLにユーザーをリダイレクトすることができます.www.example.comはあなたのウェブサイトです。

これは

alert("Your query string was hello"); 
alert(document.cookie+""); 

(新しい行を明確にするために私が追加される)にeval()によって実行されるコードを変更します。これは、現在のクッキー値を表示するより悪意のあるものを実行する可能性があります。必要なコードが、攻撃者のリンクによって暗号化された形式でクエリ文字列に渡されるためです。たとえば、リソースリクエストで攻撃者のドメインにCookieを送信して、認証セッションをハイジャックすることができます。

これは、照会文字列だけでなく、eval()で直接未実行で実行されたユーザー/外部入力の値に適用されます。

+0

これは理にかなっています。私は 'eval()'が他のサイトがユーザーデータを掻き取るのを許可するのではなく、ウェブサイト自体をハックすることを許可したと考えていました。 –

+0

直接ではありませんが、管理ユーザーがターゲットに設定されている場合は可能です。 – SilverlightFox

2

攻撃者は、ユーザーのブラウザの開発者ツールにアクセスできません。攻撃者はユーザーがコンピュータに座っていない可能性が高いです。

eval()の危険性は、最終的にeval()によって実行されるデータを攻撃者が他の方法で操作できる可能性があることです。 eval()の文字列がHTTP接続から来た場合、攻撃者はMITM攻撃を実行して文字列を変更する可能性があります。ストリングが外部記憶装置から来た場合、攻撃者はその記憶場所内のデータを操作した可能性があります。その他

+2

本当の問題は、ユーザーが提供しているソースからの文字列です。MITM攻撃は常に「eval」の問題である。彼らがMITMをやっているのであれば、通常の非評価のJSペイロードを簡単に変更することができます。 – Matt

+1

もうひとつの古典的な例は、 'eval'というGET変数はXSSの穴を開く簡単な方法です。等 –

関連する問題