0

外部 HTML を Web ページの WYSIWYG エディターにロードしている状況があります。外部 HTML は信頼できるソースからのものであり<div>、多数の異なるページの 2 つの特定のタグの間にあるものが含まれています。

私の問題は、一部のページにインライン JavaScript イベント ハンドラーが含まれていることです。そのため、WYSIWYG エディターで作業しているときに、特定のイベントによってこの js が実行されます。

ほとんどの場合、コンソールをエラーでいっぱいにする以外には何もしません.... is not definedこれがすべてであり、それは問題ではありません. alert(...)それでも、それは厄介であり、非常に迷惑になるような何かを実行する可能性のあるページがどこかにないかどうかはわかりません. コードはすべて信頼されていますが、意図したコンテキストから切り離されているため、望ましくない結果が生じる可能性があります。

できればインライン スクリプトを変更せずに、この実行をグローバルに防止する方法を見つけたいと考えています。各ハンドラーにアタッチ=false;するようなことを行うこともできますが、すべての受信要素をチェックする必要があり、正規表現を使用してもパフォーマンスが低下します。また、編集した HTML をサーバーに送信する前に、それを削除する必要がありました。

このオンライン コードがこの特定のコンテキスト内で実行されないようにする方法はありますか?

4

2 に答える 2

1

サポートしようとしているブラウザーに応じて、「コンテンツ セキュリティ ポリシー」ヘッダーをチェックアウトできます。ブラウザー サポートの詳細については、http://caniuse.com/contentsecuritypolicyをご覧ください。

ターゲット ブラウザがリストにある場合、CSP は探していることを正確に行うことができます。デフォルトでは、イベント ハンドラーが無効になります。イベント ハンドラーをブロックするだけでなく、ページに埋め込まれたコードの実行もブロックします。したがって、すべての js コードを移動する必要があります。html ページに存在する場合は別の js に移動し、そのファイル名をセーフ リストに指定して、そこから js をロードします。

CSP は Http ヘッダーとして設定されますが、新しい仕様ではメタ タグを使用して設定することもできます。https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#html-meta-element--experimentalを確認してください

WebKit がサポートされているブラウザー (Chrome/Safari) の場合、外部ソースからの負荷を制限するようなものがあります。承認されたソースのリストをリストに追加して、何が自分に合っているかを調べることができます。

Firefox の場合、仕様にはありますが、meta タグはまだサポートされていないと思います。 https://developer.mozilla.org/en-US/docs/Security/CSP/Introducing_Content_Security_Policy .

要約すると、Web ページをホストしている Web サーバーのヘッダーを設定でき (Chrome/Safari のサポートのみが必要な場合を除く)、ターゲット ブラウザーが CSP をサポートしている限り、試してみてください。

于 2013-08-16T13:57:53.970 に答える
0

あなたの質問に似たサイトポイントフォーラムからこれをコピーしました。これは、親から div を引き出して元に戻すというアプローチを取ります。これが必要な場合は、サンプル コードを次に示します。

var div = document.getElementById('div');
var nextSibling = div.nextSibling;
var parent = div.parentNode;
parent.removeChild(div);
function reCreateElement() {
    if (nextSibling) {
        parent.insertBefore(div, nextSibling);
    } else {
        parent.appendChild(div);
    }
}
setTimeout(reCreateElement, 100);

// Below is the stuff we don't want to run!
document.getElementById('div').onclick = function() {
 alert('CLICKED!');
}
于 2013-08-16T12:40:03.740 に答える