« IE7RC1スタンドアローン版を試してみる(IE6との共存させる場合の問題点) | トップページ | Mac版IE CSSハック PartII(半角円マークや特定漢字をコメントに使う) »

2006/09/20

ブラウザと改行コード(Mac用ブラウザの改行コードはCRか?)



□□□□□□ 大容量・高機能レンタルサーバー heteml □□□□□□
月額1500円で大容量2GB! Flash Media Server、ColdFusionが使えます。
その他、PHP4・PHP5・MySQL・Ruby・Perl・Pythonなども使える納得の高機能。
heteml(ヘテムル)で表現の可能性を広げよう!



WEBプログラミングをしている際に、ブラウザの種類(ユーザーエージェント)を判定する必要性が出てくることがあります。もちろん、ある言程度はできますが、ユーザーーエージェントの偽装を完全に見破ろうとすることはかなり難しいです。もちろん、OperaがIE6の振りをするのを見破ることなどは朝飯前ですし、FirefoxがIE6の真似をしても、見破るのは簡単なことです。

しかし、(何のためにそういうことをするのかというのは、ひとまず横に置いておいて、)Windows版Firefoxがユーザーーエージェントを偽装してMac版Firefoxの振りをした場合や、Windows版OperaがMac版Operaの振りをした場合などは、判別・偽装の認定がとても難しいです。

で、ある時、WindowsとMacでは改行コードが異なるので、テキストエリア内の改行コードを調べることで、どちらのOSであるかを判断しようとしてみたことがあります。結果的には、この試みは失敗に終わるのですが、サンプルはこちらです。また、サンプルのソース(ダイジェスト)は下記のようになります。

ここで、「String.fromCharCode(13,10)」というのは、「\r\n」のことであり、Windowsの改行コードです。もちろん、「\r\n」でも良いのですが、半角円マークが出現すると、LinuxのブラウザKonquerorで正しく動作しないことがあるため、半角円マークを使わないようにしています(参照:Konquerorとエスケープ文字(JavaScript謎のエラーを解く))。

テキストエリア内(スタイルシートで見えないようにしておく。)の文字列に「\r\n」が出現したら、Windowsだし、Windowsでもないのに「\r」が出現したらMacであると。「\n」ならLinuxであると。なんとなく良さそうです。しかし、先述のように、このプログラムは期待どおりには動作しません。

その理由は、

【誤判定1】Gecko系ブラウザで
FirefoxやNetscape 7.1、Safari(いわゆるGecko系ブラウザ)ではWindows版でもMac版でも改行コードはLFになります。そのため、このJavaScriptでは「Linux」として判定してしまうことになります。

【誤判定2】Operaで
Operaでは、Windows版でもMac版でも改行コードがCRLFになります。そのため、このJavaScriptでは、Mac版OperaやLinux版Operaの場合でも「Windows」として判定していしまうことになります。

まとめますと、

※ 赤字は、想定外の改行コードの場合。
OSブラウザ名textarea内の
改行コード
(JavaScriptで取得)
GET/POSTで
送信時の
URLエンコード
WindowsIE6CRLF%OD%OA
IE7CRLF%OD%OA
IE5.5CRLF%OD%OA
Firefox 1.5.0.7LF%OD%OA
Firefox 1.0.7LF%OD%OA
Netscape 7.1LF%OD%OA
SeaMonkey 1.0.4LF%OD%OA
Sleipnir 2.47
(IE6/IE7エンジン)
CRLF%OD%OA
Sleipnir 2.4.7
(Geckoエンジン)
LF%OD%OA
Lunascape 3.6.1
(IE6/IE7エンジン)
CRLF%OD%OA
Lunascape 3.6.1
(Geckoエンジン)
LF%OD%OA
Opera 9.01CRLF%OD%OA


さらに、Mac用ブラウザとLinux用ブラウザの驚くべき結果は以下のとおりです。

MacIE 5.2.3CR%OD%OA
IE5.1.7(OS 9.2.2)CR%OD%OA
IE5.0(OS 9.2.2)CR%OD%OA
Safari 2.0.4(Tiger)LF%OD%OA
Safari 1.3.2(Panther)LF%OD%OA
Firefox 1.5.0.7LF%OD%OA
Netscape 7.1LF%OD%OA
Netscape 7.02(OS 9.2.2)LF%OD%OA
SeaMonkey 1.0.4LF%OD%OA
Camino 1.0.3LF%OD%OA
Opera 9.01CRLF%OD%OA
iCab 3.03CR%OD%OA
LinuxFirefox 1.5.0.6LF%OD%OA
SeaMonkey 1.0.3LF%OD%OA
Opera 9.01CRLF%OD%OA
Konqueror 3.3.1LF%OD%OA

のようになります。



つまり、。Windows版Firefoxがユーザーエージェントを偽装してMac用Firefoxの振りをしていても、改行コードでは、Mac用FirefoxのかWindows用Firefoxなのか判別することはできません。どちらも、改行コードは「LF」ですから。(しかも、JavaScriptによる取得という方法ではなくて、実際にPOSTあるいはGETされる時にどのようにURLエンコードされているか調べたところ、調査したブラウザ全てで改行は%OD%OAになりました。JavaScriptによる取得した改行コードと送信時のコードは異なるものになることがわかりました。)これでは、Macユーザー用のページにWindows用ブラウザでアクセスできてしまうことになります。

 ですから、たとえばデータをデータベースに格納する際に、飛んできたデータをそのまま格納するような、まずいやり方をしている場合、JavaScriptベースでのバイト数チェックではクリアしていたデータがいざデータベースに格納しようとしたら溢れてしまうこともありえます。JavaScriptベースでは「\n」という1バイトだと思っていたものが、いざ送信されてサーバ側で処理しようと思った段階では「\r\n」と2バイトに増えてしまっているためです。本来は、改行コードを\nに全て統一してからデータベースに格納するなどの処理が必要なはずです。もっと言うなら、逆に、JavaScriptベースでバイト数を計算する際には、「\r\n」を1バイトとして計算するようにしないと、サーバ側での計算と合わなくなる可能性(もっと入力できるはずなのに、JavaScriptではじかれるというような現象。)がありえますね。)

話を元に戻しますと、Windows版とMac版のFirefoxで、どのような違いがあるかを考えてみるために、windowやdocument関連でサポートするオブジェクトやメソッドやプロパティを徹底的に調べてみることにしますと、window.getInterfaceをWindows版Firefox(1.5.0.7)はサポートしているのに、Mac版Firefoxでは1.5.0.7ではサポートしていないことが分かりました。ただ、Windows版Firefoxも1.0.7ではサポートしていません。あくまでも1.5xの機能です。

そのため、Windows版Firefox(1.5.0.7)がMac版Firefox(1.5.0.7)の振りをしていれば、「偽装しているな」と分かるかもしれませんが(あくまでも現時点での話です。将来的には、1.5.0.8や2.xではMacでもサポートするかもしれませんので、将来的にもそうかは決して断言できません。)、逆は成り立ちません。Mac版Firefox(1.5.0.7)がWindows版Firefox 1.5.0.7の振りをしていても、それがMac版Firefox(1.5.0.7)だと見破ることはかなり難しいです。Windows版Netscape 7.1かもしれず、Windows版Firefox 1.07かもしれないからです。

結局、OSを確実に判別するには、Flashを用いたOS判別しかなさそうです。この方法については、後日またご紹介します。



10日以内であれば完全返品受付可能

|

« IE7RC1スタンドアローン版を試してみる(IE6との共存させる場合の問題点) | トップページ | Mac版IE CSSハック PartII(半角円マークや特定漢字をコメントに使う) »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67411/11970204

この記事へのトラックバック一覧です: ブラウザと改行コード(Mac用ブラウザの改行コードはCRか?):

« IE7RC1スタンドアローン版を試してみる(IE6との共存させる場合の問題点) | トップページ | Mac版IE CSSハック PartII(半角円マークや特定漢字をコメントに使う) »