xmlhttp.openで書き込みできませんエラー

[新着] Webテンプレートを仮オープンしました



0   名前: SS : 2007/01/17(水) 14:23  ID:WpgXIFWT
【現在の状況】
Yahoo!JapanのGeocitiesにJavascriptのあるHTMLファイルをアップロードして、
IE6.0で開いたところ、エラーが発生しました。

箇所は、下記関数

/*----------------*/
/* Ajax風ページ取得 */
/*----------------*/
function getPage(pageURL)
{
  xmlhttp = createXMLHttp();
  if (xmlhttp)
  {
    xmlhttp.onreadystatechange = setPageData;
    xmlhttp.open('GET', pageURL);
    xmlhttp.send(null);
  }
  else
  {
    alert("XMLHttpRequest失敗");
  }
}


の、

xmlhttp.open('GET', pageURL);

の部分で「書き込みできません」というエラーが発生しています(まだその関数を呼んでもおらず、ファイルを読み込んだ段階でです)。

【どうしたいのか】
ローカルで試していた段階ではエラーは起きなかったのですが・・・。
原因と回避策、もしくは上記関数がエラーにならない無料HPスペースはありますでしょうか?


【マルチポスト】
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1410461584

1   名前: SS : 2007/01/17(水) 14:23  ID:WpgXIFWT
その後、
http://s.drmg.net/chd/dhtmldiver/htm/4_2_3_1_linkscheck_sync.htm
のサイトにより、IEの場合、

IEメニューバーの[ツール]-[インターネットオプション]-[セキュリティ]の、該当ゾーンの[レベルのカスタマイズ]により、[ドメイン間でのデータソースのアクセス]を有効にする

ことにより、エラーが起きないようにできることはわかりましたが、
1)ブラウザの設定に依存しない方法はありませんでしょうか?
2)上記、IE以外のブラウザは、どうなりますでしょうか?
3)上記のようにブラウザの設定以外に回避方法が無い場合、「書き込みできません」というエラーではなく、自ら定義したメッセージを表示たいのですが、try...catchもIE以外は対応していないのでしょうか?

2   名前: SS : 2007/01/17(水) 14:23  ID:WpgXIFWT
>(まだその関数を呼んでもおらず、ファイルを読み込んだ段階でです)

というのは間違いでした。
呼んではいたのでエラーが出るのはその関数を呼んだ段階でした。

3   名前: 匿名 : 2007/01/17(水) 14:23  ID:Rt.j/.AI
確認。

・現在マルチポスト先が見えないが、どこまで話が進んでいたのか。
・どこにあるページから、どこにあるページを GET しようとしたのか。
・どういう利用形態を想定しているのか(自分専用?公開して他人も?)。

とりあえず、

> 3)…… try...catchもIE以外は対応していないのでしょうか?

try..catch は JavaScript 1.4+ および ECMA-262 で標準化されたステートメント。IE は JScript 5.0? から対応。対応してないのは NN4(JavaScript 1.3)くらいでしょ。

4   名前: SS : 2007/01/17(水) 14:23  ID:WpgXIFWT
>・現在マルチポスト先が見えないが、どこまで話が進んでいたのか。

すみません。追加の2つのコメントの通り、事態が進んでしまったので、マルチポスト先は削除しました。

>・どこにあるページから、どこにあるページを GET しようとしたのか。

Geocitiesにあるページから、mixiにあるページをGETしようとしました。

>・どういう利用形態を想定しているのか(自分専用?公開して他人も?)。

mixiの友人に公開する感じです。



try..catch についてはありがとうございました。
NN4は現在どのくらい利用されていますかね?
マックもSafariの時代でしょうか。

5   名前: 匿名 : 2007/01/17(水) 14:23  ID:Rt.j/.AI
> Geocitiesにあるページから、mixiにあるページをGETしようと
> mixiの友人に公開する

ならば残念だが、セキュリティ上の制限により、他ドメインに属するリソースを XMLHttpRequest で取得することはできない。これはブラウザ側の設定の問題であり、スクリプト製作者側でどうこうできる問題ではない。

他ドメインのリソースを取得するには、自ドメインに設置した CGI などを経由して行う。この種の Perl、PHP スクリプトは簡単に作れるし、探せばすぐ見つかる。

まあ、ブラウザにインストールするタイプのスクリプト(いわゆる拡張)として配布するならば、ある程度までセキュリティレベルを操作することは可能。また、ブラウザの穴をついてクロスドメイン制限を突破する裏技もあるが、所詮は裏技なので自分で探してちょ。

> NN4は現在どのくらい利用されていますかね?

全体の 0.1 パーセントくらいだったと思う。

と言うか、IE で ActiveX を使うなら try..catch しなければならない(スクリプト有効で、ActiveX 無効の場合、例外が発生するため)。ActiveX、XMLHttpRequest を使う時点で、NN4 は自動的に切り捨てられる。

6   名前: SS : 2007/01/17(水) 14:23  ID:WpgXIFWT
ありがとうございます。
では、try..catchでエラーを取得しつつ、ブラウザの設定を[ドメイン間でのデータソースのアクセスを有効にする]ように促すようなメッセージを出すしかなさそうですね。

safariではそういう設定がないとの話も聞いたのですが、それについてご存知の方いらっしゃれば、引き続きご回答お願い致します。

7   名前: 匿名 : 2007/01/17(水) 14:23  ID:XrBzd7HH
Safariだと、なぜかXMLHttpRequestでクロスドメイン通信ができます。
バグなのか、Dashboard向けにセキュリティを甘くしているのかはわかりません。

8   名前: 匿名 : 2007/01/17(水) 14:23  ID:Rt.j/.AI
>>7
本当に? http://developer.apple.com/internet/webcontent/xmlhttpreq.html の「Security Issues」には

| the domain of the URL request destination must be the same as the one that serves up the page containing the script
| URL リクエストを送るドメインは、そのスクリプトを含むページのドメインと同一でなければならない。

と書いてあるのになあ……後で試してみよう。スレ主ではないけど、情報感謝。


ついでに、上記の記事にあるように、Firefox でも UniversalBrowserRead 特権を与えれば、警告付きながら他ドメインのリソースを取得することができた。もちろん、http://www.mozilla-japan.org/security/announce/2006/mfsa2006-53.html にあるように、通常は Web サイト上で特権操作を行うべきではない。が、スレ主の目的のためには丁度良いかもしれない。

9   名前: SS : 2007/01/17(水) 14:23  ID:WpgXIFWT
ありがとうございます。

Safariで試してもらった人からは、だめだったと報告を受けました。
バージョンによるのかも知れませんね。


FirefoxのためのUniversalBrowserRead特権の与え方は、

  try {
    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
  } catch (e) {
    alert(e);
  }



という感じでいいのでしょうか?
上記だとIEの場合はかならずcatchの方に行ってしまいますか?

10   名前: 匿名 : 2007/01/17(水) 14:23  ID:Rt.j/.AI
>>7
こちらの MacOS X 10.4 + Safari 2.0 では動作しなかった orz。1.3 だと動くのかな。

>>9
> FirefoxのためのUniversalBrowserRead特権

それで OK。ただし実行前に、about:config で signed.applets.codebase_principal_support を true にしてもらわないと、セキュリティエラーになる(用が済んだら false に戻してもらうように……まあ、必ず警告が出るから、ある程度は大丈夫だが)。

IE には netscape オブジェクトが存在しないので、当然エラーが発生する。try...catch だらけになるが、うまく構造化してちょ(if (typeof netscape != 'undefined') で分岐しても良い)。

11   名前: SS : 2007/01/17(水) 14:23  ID:WpgXIFWT
ありがとうございました!

一覧へ戻る