1

信頼できないURIを解析していますが、そのURIフードを尊重する必要があります。私はjavascript:リンクから保護しようとしていますが、次のようなことがあるので、それを繰り返す必要があるように感じます。

javascriptjavascript::

そして、すべてのインスタンスを取り除いた後javascript:、私たちの古い友人javascript:をもう一度取り戻します。

私の他の懸念は、同様にネストされたUnicodeエンティティです。たとえば、次のようになります。

"j&#X41vascript:alert('pwnt')"

...しかし、私たちも持つことができます:

"j&#&#X5841vascript:alert('pwnt')"

...私はそれを間違っているように見えますが(成功した攻撃者は明らかにそうしません)。

function resolveEntities(uri) {
  var s = document.createElement('span')
    , nestTally = uri.match(/&/) ? 0 : 1
    , limitReached = false;

  s.innerHTML = uri;
  while (s.textContent.match(/&/)) {
    s.innerHTML = s.textContent;
    if(nestTally++ >= 5) {
      limitReached = true;
      break;
    }
  }

  return encodeURI(s.textContent);
}
4

2 に答える 2

3

以前、ほぼ同じ質問をしていませんか?とにかく、私の提案は同じままです:適切なHTMLサニタイザーを使用してください

リンクした特定のサニタイザーはjavascript:URLを自動的に削除しますが、Thomasが提案するような特定のホワイトリストに登録されたURLスキームのみを許可するように設定することもできます。彼が指摘するように、これは良い考えです。なぜなら、あなたが安全であるとhttp知っいるようなスキームだけを許可する方がはるかに安全だからです。https

(特に、特定のあいまいなURLスキームが安全かどうかは、ユーザーのブラウザーだけでなく、ユーザーのOSやインストールされているサードパーティソフトウェアにも依存する可能性があります。多くのプログラムは、自分自身をハンドラーとして登録することを好みます。独自のURLスキーム用。)

于 2012-09-08T15:58:31.080 に答える
2

ブラックリストに登録する内容( URIなど)を指定するのではなく、ホワイトリストに登録する内容(例:およびのみ)javascript:を指定することをお勧めします。このようなものはどうですか?httphttps

function sanitizeUri(uri) {
  if (!uri.match(/^https?:\/\//)) {
    uri = "http://" + uri;
  }
  return uri;
}
于 2012-09-08T14:44:40.083 に答える