Moai+Easter 上級マニュアル
ご案内 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