Moai+Easter 上級マニュアル
Moai Manual Advanced Manual Annoucement FAQご案内 Moaiエンジン CustomBoyエンジン HowToコンパイル Moai CGI Developers
Overview and Tutorial Cookie Hints PostVars Hints Fingerprint Hints Snippet Hints Futaba Note
はじめに
ここではCustomBoyが取り扱うSnippetコードの真偽値に関する情報を列挙する.
これらはBrowser毎に異なる真偽値のパターンを持つため、Browser解析等で有用である.
そしてその情報はCustomBoyエンジンのKnowledge-baseにも内蔵されており、通常は特にユーザが何も設定せずとも、CustomBoyあるいはVirtualUSERSの実行結果に自動的に反映される.
一般ユーザがこの記事に記載されたパターンの詳細を気にする必要は全くないが、万一CustomBoyエンジンが内蔵するKnowledge-baseでは問題が発生した場合は、
ここにある情報を元にエキスパートユーザが手動でそのパターンを修正することもできる.
目次
- Snp_LtIE6
- Snp_LtIE7
- Snp_LtIE8
- Snp_IE9
- Snp_IE10
- Snp_IE11
- Snp_Trident
- Snp_Edge
- Snp_Gecko
- Snp_MozillaSidebar
- Snp_NavigatorOnline
- Snp_SessionStorage
- Snp_FunctionX5
- Snp_DocCurrentScript
- Snp_EventSource
- Snp_Crypto
- Snp_PerformanceNow
- Snp_AudioContext
- Snp_IndexedDB
- Snp_WindowStyles
- Snp_SendBeacon
- Snp_GetGamepads
- Snp_NavLanguages
- Snp_NavMediaDevices
- Snp_WinCaches
- Snp_CreateImageBitmap
- Snp_Onstorage
- Snp_NavGetBattery
- Snp_Presto
- Snp_LtChrome14
- Snp_ChromiumInFutaba
- Snp_Touch
- Snp_FacileMobile
- Snp_Webkit
Snp_LtIE6
以下のJavascriptコードを実行した結果である.
typeof window.addEventListener == 'undefined'
&& typeof document.documentElement.style.maxHeight == 'undefined'
&& typeof document.documentElement.style.maxHeight == 'undefined'
目次に戻る
Snp_LtIE7
以下のJavascriptコードを実行した結果である.
typeof window.addEventListener == 'undefined'
&& typeof document.querySelectorAll == 'undefined'
&& typeof document.querySelectorAll == 'undefined'
目次に戻る
Snp_LtIE8
以下のJavascriptコードを実行した結果である.
typeof window.addEventListener == 'undefined'
&& typeof document.getElementsByClassName == 'undefined'
&& typeof document.getElementsByClassName == 'undefined'
目次に戻る
Snp_IE9
以下のJavascriptコードを実行した結果である.
!!document.uniqueID && document.documentMode==9
目次に戻る
Snp_IE10
以下のJavascriptコードを実行した結果である.
!!document.uniqueID && document.documentMode==10
目次に戻る
Snp_IE11
以下のJavascriptコードを実行した結果である.
!!document.uniqueID && document.documentMode==11
目次に戻る
Snp_Trident
以下のJavascriptコードを実行した結果である.
!!document.uniqueID
IEはこれを使っているためtrue.
目次に戻る
Snp_Edge
以下のJavascriptコードを実行した結果である.
'-ms-scroll-limit' in document.documentElement.style
&& '-ms-ime-align' in document.documentElement.style
&& !window.navigator.msPointerEnabled
&& '-ms-ime-align' in document.documentElement.style
&& !window.navigator.msPointerEnabled
Edgeの場合はtrue.
目次に戻る
Snp_Gecko
以下のJavascriptコードを実行した結果である.
'MozAppearance' in document.documentElement.style
Firefoxはこれを使っているためtrue.
目次に戻る
Snp_MozillaSidebar
以下のJavascriptコードを実行した結果である.
!!window.sidebar
Firefoxにはこれが存在するためtrue.
目次に戻る
Snp_NavigatorOnline
以下のJavascriptコードを実行した結果である.
typeof window.navigator.onLine != 'undefined'
目次に戻る
Snp_SessionStorage
以下のJavascriptコードを実行した結果である.
!!window.sessionStorage
Browserの対応状況は以下が目安である(MDNによる).
- Chrome: 5以上
- Firefox(Gecko): 2以上
- IE: 8以上
- Opera: 10.50以上
- Safari(Webkit): 4以上
- Android: 2.1以上
- Opera Mobile: 11以上
- Safari Mobile: iOS 3.2以上
目次に戻る
Snp_FunctionX5
以下のJavascriptコードを実行した結果である.
(function x(){})[-5] == 'x'
'function x(){}' を文字列として見た場合、その -5 番目の文字(最後から5番目)は 'x' となっている.
Firefox Ver3.x ではこのような暗黙の文字列変換が行われるようで、その特性が存在するかを検証するコードである.
Firefox Ver3.xのみtrue.
目次に戻る
Snp_DocCurrentScript
以下のJavascriptコードを実行した結果である.
typeof document.currentScript != 'undefined'
- Chrome: 29以上
- Firefox(Gecko): 4以上
- Opera: 16以上
目次に戻る
Snp_EventSource
以下のJavascriptコードを実行した結果である.
typeof(EventSource) != 'undefined'
- Chrome: 9以上
- Firefox(Gecko): 6以上
- Opera: 11以上
目次に戻る
Snp_Crypto
以下のJavascriptコードを実行した結果である.
!!window.crypto && !!window.crypto.getRandomValues
- Chrome: 11以上
- Firefox(Gecko): 21以上
- IE: 11以上
- Opera: 15以上
- Safari: 3.1以上
目次に戻る
Snp_PerformanceNow
以下のJavascriptコードを実行した結果である.
!!window.performance && !!window.performance.now
- Chrome: 20以上
- Firefox(Gecko): 15以上
- IE: 10以上
- Opera: 15以上
- Safari: 8以上
目次に戻る
Snp_AudioContext
以下のJavascriptコードを実行した結果である.
!!window.AudioContext
- Chrome: 10以上
- Firefox(Gecko): 25以上
- Opera: 15以上
- Safari: 6以上
目次に戻る
Snp_IndexedDB
以下のJavascriptコードを実行した結果である.
!!window.indexedDB
Browserの対応状況は以下が目安である(MDNによる).
- Chrome: 23以上
- Firefox(Gecko): 10以上
- IE: 10以上
- Opera: 15以上
- Safari(Webkit): 7.1以上
- Edge: OK
- Android: 4.4以上
- Firefox Mobile: 22以上
- Firefox OS: 1.0.1以上
- Opera Mobile: 22以上
- Safari Mobile: 8以上
目次に戻る
Snp_WindowStyles
以下のJavascriptコードを実行した結果である.
!!window.styles
(少なくとも他のサイトでは、私はこのようなコードを見たことがない)
そしてMDNなどのよく知られたどのドキュメントを参照しても、window objectの中にstylesというpropertyは記載されていない.
果たしてこのpropertyを持つBrowserが世界に存在するのであろうか?
これまで私が試したすべてのBrowserにおいて、このコードがtrueとなるものは発見されなかった.
ちなみにwindow objectの中のstatusというpropertyならば、Gecko 1.9.1以降ならば存在する.
目次に戻る
Snp_SendBeacon
以下のJavascriptコードを実行した結果である.
!!window.navigator.sendBeacon
- Chrome: 39以上
- Firefox(Gecko): 31以上
- Opera: 26以上
目次に戻る
Snp_GetGamepads
以下のJavascriptコードを実行した結果である.
!!navigator.getGamepads
- Chrome: 21以上
- Firefox(Gecko): 29以上
- Opera: 15以上
目次に戻る
Snp_NavLanguages
以下のJavascriptコードを実行した結果である.
!!window.navigator.languages
- Chrome: 32以上
- Firefox(Gecko): 32以上
目次に戻る
Snp_NavMediaDevices
以下のJavascriptコードを実行した結果である.
!!window.navigator.mediaDevices
- Chrome: 51以上
- Firefox(Gecko): 36以上
目次に戻る
Snp_WinCaches
以下のJavascriptコードを実行した結果である.
!!window.caches
- Chrome: 43以上
- Firefox(Gecko): 39以上
目次に戻る
Snp_CreateImageBitmap
以下のJavascriptコードを実行した結果である.
!!window.createImageBitmap
- Chrome: 50以上
- Firefox(Gecko): 42以上
目次に戻る
Snp_Onstorage
以下のJavascriptコードを実行した結果である.
typeof window.onstorage!='undefined'
- Firefox(Gecko): 45以上
目次に戻る
Snp_NavGetBattery
以下のJavascriptコードを実行した結果である.
!!window.navigator.getBattery
- Chrome: 39以上
- Firefox(Gecko): ?
- Opera: 25以上
目次に戻る
Snp_Presto
以下のJavascriptコードを実行した結果である.
!!window.opera
Opera12.16以前ではこれがtrueとなる.
目次に戻る
Snp_LtChrome14
以下のJavascriptコードを実行した結果である.
!!window.chrome && typeof window.chrome.webstore!='undefined'
前半の!!window.chromeはChromium系か否かを判定する定石コードである.
後半のtypeof window.chrome.webstore!='undefined'は、OperaやEdgeの可能性を廃するために付加したものであろう.
Chrome Ver14以上のみtrueである.
目次に戻る
Snp_ChromiumInFutaba
以下のJavascriptコードを実行した結果である.
!!window.chrome && 'WebkitAppearance' in document.documentElement.style
(少なくとも他のサイトでは、私はこのようなコードを見たことがない)
実質 Chromium系であるか否かを示しているが、コードの後半が無意味である.
以下の環境においてtrue.
- Chrome: 全Version
- Opera: 14以上
解説
まずBrowser解析をされている方にとってはおなじみの以下のコードを掲載しておこう.
コード前半に!window.chromeと置くことで、Chromium系以外であることを前提とした上でコード後半部によりWebkitが使われているVersionのみを検出するというものである.
これは様々なサイトで広く見られる正しいコードであり、例えばSafariなどを検出できる.
この記事でもSnp_Webkitという項目として挙げておいた.
ところが、本項目のふたばちゃんねる独自のコードでは、前半部分が!!window.chromeとなっている.
これでは逆にChromium系であることを前提としてしまう.
これはどうしたことか…?
もしかするとChromium系かつWebkitが使われているVersionのみを検出しようと試みたのであろうか?
しかしながら、Browser解析をされている方なら普通はご存知だと思うが、 Chromium系では'WebkitAppearance' in document.documentElement.style でWebkit版であるか否かを判定することはできないのである.
(だからこそ、定石では先頭にまず!window.chromeという前提条件を置く)
なぜならばChromium系の場合、どのVersionでもこの'WebkitAppearance' というパターンを必ず含む.
たとえWebkitが使われていないVersionでもである.
つまりこのコードの && より後半は必ずtrueになるのであるから、明らかに無意味である.
まずBrowser解析をされている方にとってはおなじみの以下のコードを掲載しておこう.
!window.chrome && 'WebkitAppearance' in document.documentElement.style
これは様々なサイトで広く見られる正しいコードであり、例えばSafariなどを検出できる.
この記事でもSnp_Webkitという項目として挙げておいた.
ところが、本項目のふたばちゃんねる独自のコードでは、前半部分が!!window.chromeとなっている.
これでは逆にChromium系であることを前提としてしまう.
これはどうしたことか…?
もしかするとChromium系かつWebkitが使われているVersionのみを検出しようと試みたのであろうか?
しかしながら、Browser解析をされている方なら普通はご存知だと思うが、 Chromium系では'WebkitAppearance' in document.documentElement.style でWebkit版であるか否かを判定することはできないのである.
(だからこそ、定石では先頭にまず!window.chromeという前提条件を置く)
なぜならばChromium系の場合、どのVersionでもこの'WebkitAppearance' というパターンを必ず含む.
たとえWebkitが使われていないVersionでもである.
つまりこのコードの && より後半は必ずtrueになるのであるから、明らかに無意味である.
検証
以下ではChromium系としてChromeまたは新しいVersionのOperaの例を挙げ、このことを検証してみよう.
この'WebkitAppearance'というパターンを調べるコードがtrueとなるのは、Chromeの場合は全Version、Operaの場合はVer14以上のときである.
ChromeはVer28以降Webkitは廃止されBlinkへと移行した.
Operaの場合も同様にVer15以降はBlinkとなっている.
つまりWebkitではないVersionでもこのコードはやはりtrueとなってしまうことがお分かりだろう.
以下ではChromium系としてChromeまたは新しいVersionのOperaの例を挙げ、このことを検証してみよう.
この'WebkitAppearance'というパターンを調べるコードがtrueとなるのは、Chromeの場合は全Version、Operaの場合はVer14以上のときである.
ChromeはVer28以降Webkitは廃止されBlinkへと移行した.
Operaの場合も同様にVer15以降はBlinkとなっている.
つまりWebkitではないVersionでもこのコードはやはりtrueとなってしまうことがお分かりだろう.
目次に戻る
Snp_Touch
以下のJavascriptコードを実行した結果である.
typeof document.ontouchstart != 'undefined'
目次に戻る
Snp_FacileMobile
以下のJavascriptコードを実行した結果である.
typeof window.orientation != 'undefined'
window.orientationとは端末画面が縦長(portrait)と横長(landscape)のどちらであるかに関する情報である.
これはモバイル環境である否かの簡易判定に使うことができる.
目次に戻る
Snp_Webkit
以下のJavascriptコードを実行した結果である.
!window.chrome && 'WebkitAppearance' in document.documentElement.style
これはChromium系以外のWebkitが使われているBrowser、例えばSafariなどを検出する目的で一般によく使用されている定石的なコードである.
目次に戻る
This article was written by:
K.Yakisoba.H
@znk project