4

他のさまざまなプロジェクトで使用できるコード スニペットを生成するプロジェクトがあります。このコードの目的は、クエリ文字列から 2 つのパラメーターを読み取り、それらを iframe の "src" 属性に割り当てることです。

たとえば、URL http://oursite/Page.aspx?a=1&b=2のページには、"a" および "b" パラメータを読み取る JavaScript が含まれています。JavaScript は、これらのパラメーターに基づいて iframe の「src」属性を設定します。たとえば、「<iframe src="http://someothersite/Page.aspx?a=1&b=2" />」

現在、Microsoft の Anti Cross-Scripting ライブラリを使用してパラメーターをチェックするサーバー側コードでこれを行っています。ただし、JavaScript を使用する必要があり、サードパーティの JavaScript ツール (jQuery や Prototype など) を使用できないという新しい要件が発生しました。

私が知っている 1 つの方法は、パラメーターを使用する前に、"<"、一重引用符、および二重引用符のインスタンスをパラメーターから置き換えることですが、それは十分に安全ではないようです。

パラメータの 1 つは、常に「P」の後に 9 つの整数が続きます。もう 1 つのパラメーターは、常に 15 文字の英数字です。(私がそれを明確にすることを提案してくれたLiamに感謝します)。

誰か私たちに何か提案はありますか?

どうぞよろしくお願いいたします。

4

5 に答える 5

8

escape と unescape を使用しないで、decodeURIComponent を使用してください。例えば

function queryParameters(query) {
  var keyValuePairs = query.split(/[&?]/g);
  var params = {};
  for (var i = 0, n = keyValuePairs.length; i < n; ++i) {
    var m = keyValuePairs[i].match(/^([^=]+)(?:=([\s\S]*))?/);
    if (m) {
      var key = decodeURIComponent(m[1]);
      (params[key] || (params[key] = [])).push(decodeURIComponent(m[2]));
    }
  }
  return params;
}

document.location.search を渡します。

< を < に変換する限り、スクリプトの実行を許可せずにコンテンツを安全に HTML に挿入できることを確認するには不十分です。次の <、>、&、および " を必ずエスケープしてください。

パラメータがスプーフィングされていないことを保証するものではありません。サーバーの 1 つが URL を生成したことを確認する必要がある場合は、URL 署名を検索してください。

于 2008-09-24T17:55:18.517 に答える
4

ホワイトリストアプローチを使用する方が良いと思います。「悪い」ものだけを取り除くことは避けてください。「安全」と思われるもの以外はすべて取り除いてください。

また、パラメーターを HTMLEncode することを強くお勧めします。これを可能にするJavascript関数がたくさんあるはずです。

于 2008-09-24T16:00:40.137 に答える
1

JavaScript の escape() および unescape() 関数を使用できます。

于 2008-09-24T16:05:00.717 に答える
0

あなたがしなければならないいくつかのこと:

  • タイプ、形式、範囲などに応じて、受け入れられた値を厳密にホワイトリストに登録します
  • ホワイトリストを極端に厳しくすることができない場合は、特定の文字を明示的にブラックリストに登録します(これは通常バイパス可能ですが)。
  • 出力する前に値をエンコードします。Anti-XSSを使用している場合は、単純なHtmlEncodeでは不十分であることがすでにわかっています。
  • HTMLフラグメントを生成するのではなく、DOMを介してsrcプロパティを設定します
  • 動的な値はクエリ文字列パラメーターとしてのみ使用し、任意のサイトには使用しないでください。つまり、サーバーの名前、ターゲットページなどをハードコーディングします。
  • あなたのサイトはSSL経由ですか?その場合、フレームを使用するとSSLUIとの不整合が発生する可能性があります...
  • 一般に名前付きフレームを使用すると、フレームスプーフィングを許可できます。安全なサイトの場合、これは関連する攻撃ベクトルである可能性があります(フィッシングなどで使用するため)
于 2008-09-24T16:25:54.817 に答える
0

正規表現を使用して、P の後に 9 つの整数があり、15 個の英数字の値があることを検証できます。私が持っている RegEx の本には、役立つ JavaScript の例がいくつか載っていると思います。

文字セットを ASCII 値のみに制限すると効果的であり、上記のすべてのアドバイスに従います (ホワイトリスト、DOM を介した src の設定など)。

于 2008-09-24T17:56:27.580 に答える