プロが教える店舗&オフィスのセキュリティ対策術

とあるサイトを表示すると、別窓で広告系の別サイトが表示されます。
(これについては別の質問で投稿してあります)
別窓表示の部分はJavaScriptで記述されていて
通常なら

document.write('<script src="~
だと思うのですが、なぜか

document.write('<s' + 'cript src="~
と、わざわざsだけ切り離してあります。

これは、例えばポップアップブロック回避などで使われる悪意のある記述方法なのでしょうか?
それとも、なんらかの不具合回避などで使われる正常な記述方法なのでしょうか?

A 回答 (4件)

率直に言えば無意味です。



script 要素内で避けねばならないのは '</' です。SGML 規定に従えば、対応する完全な終了タグ </script> が無くとも、'</'(その後ろに名前文字)が現れた時点で script 要素を終了することになっているからです。従って、注意深いコードであれば '<\/script>' あるいは '<' + '/script>' のように書かれているはずです。

一部のブラウザやプログラムでは、script 要素中に '</script>' が現れた時点で script 要素の終わりと見なします。そういう場合、

<script type="..">document.write('<script type=".."></script>');</script>

では以下の内容が「余って」しまいます。

');</script>

</script> は無視されますので、「');」がブラウザ上に表示されるでしょう。記憶にある限りでは MacIE4 がそうです。また、Google などの検索エンジンにもこのような挙動を示すものがあるようで、検索すれば script 要素の解釈ミスによりスクリプトコードが検索本文に反映されてしまったものが大量にヒットします。

そこで、'</scr' + 'pt>' のように切る人が多かったわけですが、これでは最初に述べた SGML 規定上の問題が残ります。そもそも '</' を避けてさえいれば良い話なのです。

あるいは、タグを出力するときに最初から '<' を避けて '\x3C'(JavaScript の場合)にすれば、ほとんどのケースに対応できます。

※更に、ものすごく古いブラウザでは '>' をコメント終端と見なすものもあります(HTML4: 18.3.2)。ブラウザによっては script 要素中に開始タグ '<script>' があるとそれもタグとして解釈するとか <s> と間違わないようにとかいった話もあった気がしますが、検索しても見つからないので私の記憶違いかもしれません。この辺はもう気にしても仕方ないでしょう。

少なくとも今現在、'<s' + 'cript' と切ることに意味はありません。制作者が上記のような事情を勘違いした結果生まれた妙ちくりんな記述が、あるいは、制作者が HTML の規定に沿わないツールを使った結果生じた変てこりんな産物か、どちらかでしょう。

この回答への補足

一応、疑問の元となったサイトも記載しておきます。
映画の紹介サイトで、先月まで無かったポップアップ広告が今月になって急に出るようになって、そのJavaScriptの記述方法が質問内容の通りでした。
見る時間帯によって、別窓が出たり出なかったりしますが、広告ページは海外アドレス(.co.uk)になっています。

ポップアップの事について聞いた質問
http://oshiete1.goo.ne.jp/qa5378330.html

疑問の元となったサイト
CINEMA TOPICS ONLINE:シネマトピックスオンライン
http://www.cinematopics.com/cinema
トップページのソースの最下部にこの記述があります。

補足日時:2009/10/22 19:33
    • good
    • 0
この回答へのお礼

詳しい回答ありがとうございます。
'</' がダメだからそのために工夫が必要なのですね。

今回疑問に思った記述が

<script language="JavaScript">
document.write('<s' + 'cript src="http://~~~ '">');
document.write('</' + 's' + 'cript>');
</script>

なので、'</' の記述を回避していないおかしな記述って事だと思います。

お礼日時:2009/10/22 19:32

調べてみたら見つけました。


http://74.125.153.132/search?q=cache:UvCTH5u6hD8 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
仕様上の問題でHTMLの終了タグ </ が使えないんですね。

書いてある内容が難しすぎて半分も理解出来ていないかもですが^^;

お礼日時:2009/10/22 19:07

No1.です


訂正
document.writeの時だけです。
    • good
    • 0

ソースの中に


<script>
とか
</script>
の記述があると、例えリテラル文字列でも、コメントでも
ブラウザーが勝手に、よけいな親切に、文法間違いを中途半端に
補正しようとしたりして、
本来のタグとして解釈したりする事があります。
だから、わさわさ離してくっつけているのだと思います
    • good
    • 0
この回答へのお礼

ありがとうございます。

悪意のある記述方法では無く、よくある不具合回避法なのですね。

お礼日時:2009/10/22 18:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!