1. ホーム
  2. javascript

[解決済み] JavaScriptからHTMLを生成する際、<ではなく、なぜ" \x3C "を使用するのですか?

2022-02-17 22:01:11

質問

コンテンツデリバリーネットワークからjQueryを読み込み、CDNが利用できない場合はローカルコピーにフォールバックするために、次のHTMLコードがよく使われているのを見かけます(例. Modernizr ドキュメント ):

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.1.min.js">\x3C/script>')</script>

質問ですが、なぜ最後の < の文字は document.write() ステートメントをエスケープシーケンスに置き換えたものです。 \x3C ? < はJavaScriptでは安全な文字であり、同じ文字列の中で先に使われていることさえあるのですが、なぜそこでエスケープするのでしょうか?それは、悪質なブラウザの実装が </script> が本当のスクリプト終了タグなのでしょうか?もしそうなら、この件で失敗するようなブラウザは本当にあるのでしょうか?

続いての質問ですが、私はまた、このように unescape() (にあるように)。 この答え )も何度か野放しになっています。そのバージョンがいつも すべて その <> という文字がありますか?

解決方法は?

ブラウザが </script> HTMLパーサーはJavaScriptについて全く知らないので、文字列の中に現れたものと、それが 実際の意味 を使用して script 要素を終了させます。) そのため </script> がHTMLページ内のJavaScriptに文字どおり現れると、(良い場合は)エラーの原因となり、(悪い場合は)巨大なセキュリティホールとなります。

そのため、どうにかしてこの文字列が表示されないようにする必要があるのです。この問題に対する他の一般的な回避策は "<"+"/script>""<\/script>" (いずれも同じものになる)。

これをバグと考える人もいますが、実際には でなければならない のように、このようになります。 仕様 ユーザーエージェントのHTML部分は、スクリプトエンジンから完全に分離されています。あなたは、あらゆる種類のものを <script> タグは、JavaScriptだけではありません。W3Cでは、VBScriptやTCLを例として挙げています。また、他の例として jQueryテンプレートプラグイン というタグがあり、このタグも使われています。

しかし、JavaScriptの中でも、文字列の中のこのようなコンテンツは認識できるため、終了タグとして扱わないという提案ができるのですが、コメントを考慮すると、次のような曖昧な点がでてきます。

<script type="text/javascript">foo(42); // call the function </script>

- この場合、ブラウザはどうすればいいのでしょうか?

最後に、JavaScriptを知らないブラウザはどうでしょう?の間の部分は無視されるだけでしょう。 <script></script> という文字列に異なるセマンティクスを与えたとします。 </script> に基づいて ブラウザのJavaScriptの知識 を使うと、突然2つの異なる結果が HTMLパース段階 .

最後に、ご質問のあった すべて の角括弧を使用します。少なくとも99%の場合、難読化のため、つまり、JavaScriptがHTML的なことをやっているという事実を(アンチウイルスソフトや検閲プロキシ(あなたの例のように(入れ子の括弧は素晴らしい))等から)隠すためだと思います。以外のものを隠す技術的な理由は思いつきません。 </script> 少なくとも最近のブラウザ(つまり、Mosaicより新しいもの)では、そうではありません。