Kinopyo Blog

プログラマとしてRuby, Rails, iPhone, iPad,Macなどなどと向き合う日々のログポース

Posts Tagged ‘IE’

IE6でSSL(https)に接続する時、src属性なしのiframeを使うとセキュリティの警告が出る

2010年04月27日

現象

IE6を使ってSSL(https)経由で接続する時に以下の警告が出るなら

iframeのsrc属性をまずチェックしてください。

security-info


このページにはセキュリティで保護されている項目と保護されていない項目が含まれています。

ダメな書き方

<iframe />
<iframe src="" />

解決策

src属性にちゃんと値を設定するか、javascriptでfalseを指定する

<iframe src="/dummy.html" />
<iframe srec="javascript:false" />

存在しないファイルを指定するとサーバ側のログにエラーが出るかもしれないので、

設定する場合は実際存在するファイルを設定してください。

jQuery1.3.2 bind時にnamespaceを使うとIE6ではメモリリーク

2010年04月04日

表題の通り、IE6 + jQuery1.3.2の状態でbindする時に

jQueryのnamespaceを使うと確実にメモリリークが発生します。

jQuery1.4.2では発生しないことを確認しました。

メモリリークが発生するコード

$("#foo").bind("change.abc", function(){});

上記”change.abc”のabcがnamespaceです。

それをなくすことでメモリリークは解消されます。

イベントハンドラの中身とは関係ありません。

メモリリークは発生しない

$("#foo").bind("change", function(){});

これはjQueryのbugとして上げられましたが、

完全に修正できなかったみたいです。


#4241 (Namespaced events cause memory leaks)
– jQuery Core
– Bug Tracker

当時の担当者のコメントを見ると

I had a really difficult time getting a reliable test case to verify this actually solves the memory leak. r6321 appears to have fixed this issue

「時間ないからちゃんとテストしてない、r6321の対応で解決できたように見える」と、

ずいぶん適当な回答ですよね。。。

IEでJSPを開こうとするとダウンロードのプロンプトダイアログが出る

2009年12月10日

秀丸でjspと関連付けたら、IEでJSPを開こうとするとダウンロードのプロンプトダイアログが出る。

回避方法

関連付けを決断!

  • エクスプローラの「ツール→フォルダ オプション→ファイルの種類→拡張子」にJSPを捜し、「詳細設定」を開いてopenアクションを削除。
  • あるいはファイルの種類のタブの中の「削除」ボタンで削除

JSPファイルの関連付け

秀丸が悪いのか、何が悪いのかは調べてないです。

とにかくこれで一応解決。

拡張子が変更されたJavaScriptは実行されるか?IE,Firefoxでのセキュリティ

2009年12月02日

ここが危ない!Web2.0のセキュリティ:第1回 Ajaxとクロスサイトスクリプティング|gihyo.jp … 技術評論社の勉強メモ&実験です。

実験

あるJavaScriptの拡張子をcsvに変更してSCRIPTタグでそれをインポートするHTMLを用意します。

そのJavaScriptを実行しようとするとIEのデフォルトセキュリティオプションでは、

ファイルのダウンロードダイアログが出ます。

Firefoxは拡張子がcsvにもかかわらずちゃんとJavaScriptと認識してそれを実行します。

原理

CSVファイルは単にカンマで区切られたデータですので,スクリプトは実行されないはずです。

Internet Explorerの仕様にセキュリティ設定に「内容によってファイルを開く」という設定ががあります(図2)。

これは,Internet Explorerがファイルの中身を見て,その中にHTMLっぽい文字列が含まれていればHTMLだと判断するということを意味しています。このため拡張子やレスポンスに含まれるContent-Typeヘッダとは関係なく,外部から参照可能なファイルにはクロスサイトスクリプティング対策が必要であるということになります。

一方,Firefoxの場合はレスポンスのContent-Typeヘッダを見て判断しますので,ファイルの中身が何っぽいのかを気にする必要はありません。

http://gihyo.jp/dev/serial/01/web20sec/0001?page=2

この観点からはIEのほうがセキュリティの面で高いと見られます。

jQuery focus()によるIEとFirefox動きの違い

2009年11月22日

jQueryのfocus()はデフォルトのフォーカス動作とそのエレメントにバインドされたイベントが実行されます。

しかしIE8とFirefoxではこのfocus()の動作が多少違います。

現象

例えば複数のinput要素があって、それぞれfocusイベントとblurイベントがバインドされたとします。

focus()を実行する前はelem1にフォーカスしていて、要素$(‘elem2′).focus()を実行すると

  • Firefox 3.5.5ではelem1のblurイベントが実行した後に、elem2のfocusイベントが実行する
  • IE8ではelem1のblurイベントは実行されますが、elem2には2回フォーカスするように動作します。つまり下記の動きです。
    1. elem1のblurイベント
    2. elem2のfocusイベント
    3. elem2のblurイベント
    4. elem2のfocusイベント

普通に考えたらFirefoxの動きが正しいはずですよね。
上記の3と4は余計な処理になります。

サンプルコード

$("form :input").bind("focus", function() {
	$(this).css("background-color", "gray");
	// ログを出力
		$("#result").append($(this).get(0).id + " focus event triggered.");
	}).bind("blur", function() {
	$(this).css("background-color", "");
	// ログを出力
		$("#result").append($(this).get(0).id + " blur event triggered.");
	});
$("#foo").focus();
setTimeout(focusBar, 3000);
function focusBar() {
	$("#" + document.activeElement.id).trigger('blur');
	$("#bar").focus();
};
Foo

Bar

先にfooテキストエリアにフォーカスしてくささい。

3秒後にbarテキストエリアにfocus()メソッドでフォーカスします。

その時の出力ログを見てください。

回避策

まだいい方法はつかんでません。

Googleで検索すると似たようなものはありましたが、

回避策はまだないようです。

[jQuery] Focus event firing twice in Internet Explorer

IE JavaScript実行した際の「アクセスが拒否されました」メッセージ

2009年11月19日

経緯

iframeで動的に画面を読み込む際URL不正などによる通信エラーが起こした場合の

エラーハンドラを追加したかったので判断するロジックが必要でした。

わざと誤ったURLを渡して検証しましたが、以下のコードはだめでした。


// documentがnullかと思ってそれで判断しようとしたんです。
if (this.contentWindow.document) {}

現象

あるプロパティは存在しているのに、アクセスができない。コードで書くと

// プロパティがオブジェクトに存在するかを判断
// ここはアラーとが出した、つまり存在したってこと
if ("aProperty" in obj) alert('obj has aProperty');
// 次にそのオブジェクトにアクセスしようとすると
// エラーになった
obj.aProperty

IE8の開発ツールで見たら「アクセスが拒否されました」と書いてある。

f:id:kinopyo:20091119133655j:image


エラーをcatch

判断のロジックをtry-catch文に書けばいいです。

try {
this.contentWindow.document;
} catch (e) {
if (e.number == -2147024891) {
//アクセスが拒否されました。
alert(e.message);
} else {
alert("別のメッセージ");
}
}


参考サイト:http://sei.qee.jp/docs/freetalk/2009/02.html

IEのActiveXコントロールに関する警告を非表示にするには

2009年11月18日

開発においてローカルでいろいろテストすることが多いでしょう。

その時ブラウザを開くと「セキュリティ保護のため、このコンピューターにアクセスする可能性のあるスクリプトやActiveXコントロールを実行しないよう、IEで制限されています。オプションを表示するには、ここをクリックしてください」という警告がそのたびに出て、気分が悪くなっちゃいます。IEの[セキュリティ]タブをいじってもファイルはローカルなので、効きません。


解決方法

  • [マイコンピュータ内のファイルでのアクティブコンテンツの実行を許可する*]をチェックしIEを再起動(*がついてるので再起動は絶対必要とされている)

f:id:kinopyo:20091117012539j:image:right

f:id:kinopyo:20091117012540j:image

  • 「スクリプトを実行しても安全とマークされているActiveXコントロールのスクリプトの許可」をチェック

f:id:kinopyo:20091117012541j:image

バージョン情報

  • OS: Windows XP
  • IE: IE8


参考サイト:How to disable "ActiveX Control May Be Unsafe" popup – Stack Overflow

クライアント側のActiveXが有効か無効かを検出するJavaScript

2009年11月17日

知っておくべきこと

  • ActiveXはIE専用のものと理解してよい、Firefoxなどでは存在しない
  • new ActiveXObject(“Microsoft.XMLHTTP”)でIEのXMLHttpRequestが生成される
    • IE のバージョンによっては、”Microsoft.XMLHTTP”の代わりにこれらも使用できるそうです:
    • “Msxml2.XMLHTTP.5.0″
    • “Msxml2.XMLHTTP.4.0″
    • “Msxml2.XMLHTTP.3.0″
    • “Msxml2.XMLHTTP”
  • もし生成できればActiveXコントロールは有効になっている


検出ソースコード

// ブラウザがIEの場合
if (window.ActiveXObject) {
try {
//IEのXMLHttpRequestオブジェクトを試しに生成
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert('ActiveXコントロールは無効になっています');
}
}


参考サイト

動画をHTMLに埋め込むヒント – faireal.net

IEセキュリティにマイコンピュータゾーンを追加する方法

2009年11月16日

概要

ローカルのファイルを参照する際のセキュリティを変更したとします。

IEの[インターネット オプション] ダイアログ ボックスの [セキュリティ] タブでは

ローカルのマイコンピュータのセキュリティゾーンがデフォルトでは非表示になっています。

それを表示させるにはレジストリを編集する必要があります。

動作環境

以下の環境で動作確認済みです。

その他の環境についてはマイクロソフトのサポートヘルプを参照してください。

  • OS: Win XP
  • IE: IE8

方法

警告 : レジストリ エディタの使い方を誤ると、深刻な問題が発生することがあります。


[インターネット オプション] ダイアログ ボックスの [セキュリティ] タブにマイ コンピュータのセキュリティ ゾーンを表示するかどうかは、次のレジストリ キー内にある Flags 値によって設定できます。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0

Flags 値は DWORD 値です。Flags 値のデータ値を 47 (16 進) に設定すると、マイ コンピュータのセキュリティゾーンが表示されるようになります。Flags 値のデータ値を 21 (16 進) に設定すると、マイ コンピュータのセキュリティゾーンが非表示になります。

http://support.microsoft.com/kb/315933

IE6でjQueryを使う時のエラー:selectにoption生成の不具合

2009年11月09日

環境f:id:kinopyo:20091110011109j:image:right

  • IE6
  • jQuery1.3.2

現象

IE7、IE8、Firefox上全部OKのアプリが

なぜかIE6ではエラーが頻発しました。

エラーの詳細もないので、原因がはっきりわかりません。


ソースは特に変な作り方をしてないと思うので、

やはりIE6が主な原因と判断しググってみました。

調査結果

IE6でselect boxに

その追加した値を.valで設定しようとすると上記のエラーが発生します。

(設定する値が追加した値以外の場合、正常に設定できます)

今回のアプリではselectボックスは静的にHTMLで書いて、

jQueryでoptionをどんどんappendしてました。

やはりこの辺が怪しかったですね。


回避策としてあげられるのは.valを設定する前に.width()を一回実行することです。

信じられないぐらい、本当になおりました。

setTimeout(function () {}, 0); も回避策の一つとの選択肢もあったのですが、

なぜかこれは効きませんでした。

以下個人感想

IE6のばかばかしい動きが元凶なので、詳しく追求する気はないです。

ほかにもjQueryを使うときに注意すべきものがいっぱいあるようです。

まあ、またエラーなんか起きたらそのときまた検索すればって思います。


ウェブアプリ開発者はIE6~IE8、Firefoxなどいろいろなブラウザにも注意しながら

開発するしかないことがすごく嫌です。

この前FirefoxがやっとIE6を市場シェアを抜けて一位になった記事がありました。

(Firefox > IE6 > IE7 > IE8の感じかな、トータルではもちろIE全体がまだトップ)

IE6なんかもう早く下がってほしい。


なので、ブラウザに気にしないFlex開発に興味を持ち、今勉強中です。

そこら辺の感想はまた別途で記事書きます。


ちなみに、Google分析で私のブログを見る平均時間は44秒です。

内容的にこんなに駄目なんですか。。?

44秒、、短すぎ、、

参考になったサイト

jQueryでoption要素を追加した際の諸問題

jQueryを使うときに気をつけるべき8のポイント