ブラウザから読み取れる情報
どのWebページも、許可ダイアログを一切出さずに JavaScript だけでここまで読み取れる、という一覧です。 (最後のタブ「許可が必要なもの」だけは、ボタンを押して許可したときに何にアクセスできるようになるかを示します。) 各項目の下にあるコードを他のサイトの開発者ツールのコンソールに貼り付ければ、同じ値が取れます。
このページは静的なサイトで、ここに表示した情報はどこにも送信していません。
ブラウザの種類とバージョン、OS、言語やタイムゾーン、ダークモードなどの設定です。どれも1つだけならありふれた値ですが、組み合わせると人をかなり絞り込めます。
読み込み中…
GPUの機種や、描画・音声処理の結果に出るわずかな差は、Cookieを消しても変わらないので、ブラウザフィンガープリント(端末の識別)によく使われます。
読み込み中…
何が入っているかは、OSや言語だけでなく、使っているソフトや仕事の見当まで付けられる材料になります。
読み込み中…
ウィンドウの大きさや位置、いま見られているかどうかは、ページを開いている間ずっと読み取れます。
読み込み中…
このページを開いた瞬間から、マウス、スクロール、キー入力などをページ自身が記録しています(ここでは表示しているだけで、どこにも送っていません)。マウスの動きやキー入力のリズムには人ごとの癖があるため、ボット検知だけでなく本人の識別(行動バイオメトリクス)にも使われています。
読み込み中…
ここだけは、アクセスするときにブラウザが許可を求めます。下のボタンを押すと許可ダイアログが出て、許可すると現在地、カメラの映像、マイクの音、機器の名前、スマホの傾きや加速度にアクセスできるようになります(傾きと加速度だけは、Android の Chrome なら許可なしでアクセスできます)。許可しなければ何にもアクセスできず、取得した内容はこのページの外には出ません(どこにも送っていません)。一度許可して「記憶」させると、そのサイトは次からダイアログなしでアクセスできます。
(await navigator.permissions.query({ name: 'geolocation' })).stateposition.coords.latitudeposition.coords.longitudeposition.coords.accuracyposition.coords.altitudeposition.coords.altitudeAccuracyposition.coords.headingposition.coords.speedposition.timestamp(await navigator.permissions.query({ name: 'camera' })).stateawait navigator.mediaDevices.getUserMedia({ video: true })stream.getVideoTracks()[0].labelgetSettings().width, getSettings().heightstream.getVideoTracks()[0].getSettings().frameRatestream.getVideoTracks()[0].getCapabilities().width.maxstream.getVideoTracks()[0].getSettings().facingMode(await navigator.permissions.query({ name: 'microphone' })).stateawait navigator.mediaDevices.getUserMedia({ audio: true })stream.getAudioTracks()[0].labelstream.getAudioTracks()[0].getSettings().sampleRatestream.getAudioTracks()[0].getSettings().channelCountgetSettings().echoCancellation など(await navigator.mediaDevices.enumerateDevices()).filter(d => d.kind === 'videoinput').map(d => d.label)(await navigator.mediaDevices.enumerateDevices()).filter(d => d.kind === 'audioinput').map(d => d.label)(await navigator.mediaDevices.enumerateDevices()).filter(d => d.kind === 'audiooutput').map(d => d.label)device.deviceIdaddEventListener('deviceorientation', e => [e.alpha, e.beta, e.gamma])addEventListener('devicemotion', e => e.accelerationIncludingGravity)