innerHTML アプリケーション

innerHTML アプリケーション

ブランクのブログ: http://www.planabc.net/
innerHTML プロパティは、HTML 要素の内容を完全に置き換える簡単な方法を提供するため、非常によく使用されます。別の方法としては、DOM レベル 2 API (removeChild、createElement、appendChild) を使用する方法があります。しかし、innerHTML を使用して DOM ツリーを変更するのは非常に簡単で効果的な方法であることは明らかです。ただし、innerHTML には独自の問題があることに注意する必要があります。
    HTML 文字列に defer としてマークされたスクリプト タグ (<script defer>…</script>) が含まれている場合、innerHTML 属性が適切に処理されないと、Internet Explorer でスクリプト インジェクション攻撃が発生する可能性があります。 innerHTML を設定すると、イベント ハンドラーが登録されている既存の HTML 要素が破壊され、一部のブラウザーでメモリ リークが発生する可能性があります。

他にも言及する価値のある小さな欠点がいくつかあります。
    作成した要素への参照を取得することはできません。それらの参照を取得するには、コードを手動で追加する必要があります (DOM API を使用)。 すべてのブラウザのすべての HTML 要素に innerHTML プロパティを設定することはできません (たとえば、Internet Explorer では、テーブル行要素に innerHTML プロパティを設定することはできません)。

私は、innerHTML プロパティの使用に関連するセキュリティとメモリの問題をより懸念しています。明らかに、これらは新しい問題ではなく、すでにこれらの問題のいくつかを回避する方法を考え出した賢明な人々がいます。
Douglas Crockford 氏は、HTML 要素に登録されたイベント ハンドラーによって発生する循環参照を解消し、ガベージ コレクターがこれらの HTML 要素に関連付けられたメモリを解放できるようにするクリーンアップ関数を作成しました。
HTML 文字列からスクリプト タグを削除するのは、見た目ほど簡単ではありません。正規表現は期待どおりの動作をする可能性がありますが、すべての可能性がカバーされているかどうかを知ることは困難です。これが私の解決策です:
/<script[^>]*>[\S\s]*?<\/script[^>]*>/ig
ここで、これら 2 つの手法を 1 つの setInnerHTML 関数に組み合わせ、setInnerHTML 関数を YUI の YAHOO.util.Dom にバインドしてみましょう。
YAHOO.util.Dom.setInnerHTML = 関数 (el, html) {
el = YAHOO.util.Dom.get(el);
if (!el || typeof html !== 'string') {
null を返します。
}
// 循環参照を解除する
(関数 (o) {
var a = o.attributes、i、l、n、c;
もし(a){
l = a.長さ;
(i = 0; i < l; i = 1) の場合 {
n = a[i].名前;
if (typeof o[n] === 'function') {
o[n] = null;
}
}
}
o.childNodes を継承します。
もし(a){
l = a.長さ;
(i = 0; i < l; i = 1) の場合 {
c = o.childNodes[i];
// 子ノードをクリアする
引数.callee(c);
// YUI の addListener を通じて要素に登録されたすべてのリスナーを削除します
YAHOO.util.Event.purgeElement(c);
}
}
})(エル);
// HTML文字列からスクリプトを削除し、innerHTMLプロパティを設定します
el.innerHTML = html.replace(/<script[^>]*>[\S\s]*?<\/script[^>]*>/ig, "");
// 最初の子ノードへの参照を返す
el.firstChild を返します。
};
この関数に必要な他のものがある場合、または正規表現に何か不足しているものがある場合は、お知らせください。
明らかに、Web ページに悪意のあるコードを挿入する方法は他にもたくさんあります。 setInnerHTML 関数は、すべての A グレード ブラウザーでのみ <script> タグの実行動作を正規化します。信頼できない HTML コードを挿入する予定がある場合は、まずサーバー上でフィルタリングするようにしてください。これを実行できるライブラリは多数あります。
元記事: Julien Lecomte による innerHTML の問題

<<:  MySQL が暗黙のデフォルト値を処理する方法

>>:  Dockerコンテナ内で2つのプロセスを開始するときのDockerfile実装コード

推薦する

MySQL 5.7 以降のバージョンのダウンロードとインストールのグラフィック チュートリアル

1. ダウンロード1. MySQL公式サイトのダウンロードアドレス: https://downloa...

HTML テーブルタグチュートリアル (19): 行タグ

<TR> タグの属性は、次の表に示すように、テーブル内の各行のプロパティを設定するために...

Mysql の追加、削除、変更、クエリステートメントのシンプルな実装

Mysql の追加、削除、変更、クエリステートメントのシンプルな実装追加されたレコード: テーブル名...

Linux でディスクをマウントし、起動時に自動的にマウントするように設定する方法

皆さんの時間は貴重だと承知しているので、プロセス コマンドを直接書き留めておきます。設定できます。原...

JSは要素のドラッグとプレースホルダー機能を実装します

このブログ投稿は、ブロガーが数日前に取り組んだプロジェクトで遭遇した困難についてです。これを学んだ後...

データベース接続のURLの詳細な説明と概要

データベース接続のURLの詳細な説明と概要JDBC URL = プロトコル名 + サブプロトコル名 ...

JavaScript 日付ツールの概要

ユーティリティ = { /** * 死亡年ですか? * @return {Boolse} true...

Windows Server2014 にセキュリティを適用して MySQL をインストールする際のエラーに対する完璧な解決策

理由はインストール後にきちんとアンインストールされなかったためです。この問題を解決するには、次の点に...

element.style インライン スタイルを変更する方法のチュートリアル

序文上記の Web ページ スタイルを記述しているときに、スタイルの値をどのように変更しても、ページ...

Vue+SpringBoot で Alipay サンドボックス決済を実装するためのサンプルコード

まず、Alipay サンドボックスから一連のものをダウンロードします。多くのブログで取り上げられてお...

CSS @font-face パフォーマンス最適化の詳細な理解

この記事では主に、フォント読み込みの最適化に関する一般的な戦略を紹介します。内容の大部分は参考資料と...

MySQL で大文字と小文字を区別しないように設定する方法

mysql は大文字と小文字を区別しないように設定されていますウィンドウズmysqlがインストールさ...

HTML/CSS の基礎 - HTML コード記述におけるいくつかの注意事項 (必読)

この記事の警告事項は、ブラウザの互換性とはまったく関係ありません。主に、プロジェクトで遭遇したいくつ...

JSはストップウォッチタイマーを実装します

この記事の例では、ストップウォッチタイマーを実装するためのJSの具体的なコードを参考までに共有してい...

vue.js でよく使われる v 命令の解析

目次Vue でのモデルバインド表示の if の v-text の説明v-html: v-オンv-if...