C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: HTTP_USER_AGENTによる使用OS判定について


(過去ログ 177 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■101764 / inTopicNo.1)  HTTP_USER_AGENTによる使用OS判定について
  
□投稿者/ のんちゃん (1回)-(2023/04/17(Mon) 11:40:06)

分類:[ASP.NET (VB)] 

windows7とwindows10で処理を分ける必要がある為、
以下のプログラム(OsInfo)で判定しており、windows11でも同様に判定したかったのですが、
windows11と10では同じバージョン(10.0)と判定されてしまい困っております。
11を判定するにはどうしたらよいかご存じの方いらっしゃいましたら宜しくお願い致します。

Partial Class _Default
    Inherits System.Web.UI.Page

    Dim Os As String = ""     
    Dim sUA As String = ""
    
    'ページ読み込み時
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim sb As New StringBuilder()

        'OS情報を取得する
        OsInfo()

        sb.AppendLine("<script type='text/javascript'>")
        sb.AppendLine(" document.writeln('OS情報:"& Os &"<br><br>');")  
        sb.AppendLine("</script>")
        
        ClientScript.RegisterStartupScript(Me.GetType(), "script", sb.ToString())

        

        'Osに取得されたバージョン別に以下で処理を分ける



    End Sub

    Sub OsInfo()  	    
        'UserAgent取得
	sUA = Request.ServerVariables("HTTP_USER_AGENT")

        '正規表現パターンとオプションを指定してRegexオブジェクトを作成 
	Dim r As New System.Text.RegularExpressions.Regex( _
		    "Windows\sNT\s([0-9]+\.[0-9])", _
		    System.Text.RegularExpressions.RegexOptions.IgnoreCase Or _
		    System.Text.RegularExpressions.RegexOptions.Singleline)

	'Windows NT x.x部分抽出
	Dim m As Match = r.Match(sUA)
                
        'ver部分抽出
        Dim ver As String =  m.Groups(1).ToString 
        
        Select Case ver
  	Case "6.1"
            'Windows7
            Os = "Windows 7"
  	Case "6.2"
  	    Os = "Windows 8"
  	Case "6.3"
  	    Os = "Windows 8.1"
  	Case "10.0"
            'Windows10
            Os = "Windows 10"
  	Case Else  				
            Os = "NG"
        End Select
                        
    End Sub



End Class

引用返信 編集キー/
■101765 / inTopicNo.2)  Re[1]: HTTP_USER_AGENTによる使用OS判定について
□投稿者/ 魔界の仮面弁士 (3621回)-(2023/04/17(Mon) 11:54:56)
2023/04/17(Mon) 12:48:19 編集(投稿者)

No101764 (のんちゃん さん) に返信
> windows11と10では同じバージョン(10.0)と判定されてしまい困っております。
> 11を判定するにはどうしたらよいかご存じの方いらっしゃいましたら宜しくお願い致します。

機密情報が含まれないようにするため、User-Agent の情報量は削減されています。
クライアント OS を判断する試みは行わないよう、運用を見直された方が良いでしょう。
https://developer.chrome.com/ja/docs/privacy-sandbox/user-agent/

現時点で取得するとなると、experimental (実験的) な API 頼りになりそう。


> sUA = Request.ServerVariables("HTTP_USER_AGENT")
USER-AGENT ヘッダーでは区別できないので、
User-Agent クライアント ヒント (UA-CH) API を用いて
SEC-CH-UA-PLATFORM と
SEC-CH-UA-PLATFORM-VERSION で判断します。(FireFox は対象外)


/*
const uaInfo = await navigator.userAgentData.getHighEntropyValues(["platformVersion"]);
console.log(uaInfo);
*/

navigator.userAgentData.getHighEntropyValues(["platformVersion"]).then(ua =>
{
 if (navigator.userAgentData.platform === "Windows") {
  console.log(ua.platformVersion);
 }
});

https://developer.mozilla.org/ja/docs/Web/API/NavigatorUAData/getHighEntropyValues
https://learn.microsoft.com/ja-jp/microsoft-edge/web-platform/how-to-detect-win11


事前に Accept-CH 要求の応答ヘッダーを付与しておくことで
それ以降の通信に対して User Agent Client Hints(Sec-Ch-Ua) を
サーバーへ送信させてサーバーサイド判定が可能となりますが、
この機構は http では利用できないため、
https 通信であることが前提になります。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-CH-UA-Platform-Version
https://http2.try-and-test.net/client_hints.html
引用返信 編集キー/
■101769 / inTopicNo.3)  Re[1]: HTTP_USER_AGENTによる使用OS判定について
□投稿者/ WebSurfer (2670回)-(2023/04/17(Mon) 12:33:53)
No101764 (のんちゃん さん) に返信

> windows11と10では同じバージョン(10.0)と判定されてしまい困っております。
> 11を判定するにはどうしたらよいかご存じの方いらっしゃいましたら宜しくお願い致します。

ググって調べただけで検証などはしていませんが、以下の記事によると、

User-Agent クライアント ヒントを使用してWindows 11と CPU アーキテクチャを検出する
https://learn.microsoft.com/ja-jp/microsoft-edge/web-platform/how-to-detect-win11

"Web サイトでは、User-Agent クライアント ヒント (UA-CH) を使用して、Windows 11と
Windows 10のユーザーを区別し、デバイスの CPU アーキテクチャを検出できます"

・・・とのことです。

user-agent judge windows version などをキーワードにググるといろいろヒットしますの
で自分でもやてみてください。
引用返信 編集キー/
■101770 / inTopicNo.4)  Re[2]: HTTP_USER_AGENTによる使用OS判定について
□投稿者/ のんちゃん (2回)-(2023/04/17(Mon) 14:07:45)
魔界の仮面弁士さま

回答頂きありがとうございます。
紹介いただいたページ等、内容を見させていただきましたが、
埋め込み方が分からず申し訳ありません。
担当者が急遽退職してしまい、代わりに見ているのですがなかなか難しく・・・
以下処理を Sub OsInfo()内に記述するとエラーとなってしまいます。

/*
const uaInfo = await navigator.userAgentData.getHighEntropyValues(["platformVersion"]);
console.log(uaInfo);
*/

navigator.userAgentData.getHighEntropyValues(["platformVersion"]).then(ua =>
{
 if (navigator.userAgentData.platform === "Windows") {
  console.log(ua.platformVersion);
 }
});


■No101765 (魔界の仮面弁士 さん) に返信
> 2023/04/17(Mon) 12:48:19 編集(投稿者)
> 
> ■No101764 (のんちゃん さん) に返信
>>windows11と10では同じバージョン(10.0)と判定されてしまい困っております。
>>11を判定するにはどうしたらよいかご存じの方いらっしゃいましたら宜しくお願い致します。
> 
> 機密情報が含まれないようにするため、User-Agent の情報量は削減されています。
> クライアント OS を判断する試みは行わないよう、運用を見直された方が良いでしょう。
> https://developer.chrome.com/ja/docs/privacy-sandbox/user-agent/
> 
> 現時点で取得するとなると、experimental (実験的) な API 頼りになりそう。
> 
> 
>>sUA = Request.ServerVariables("HTTP_USER_AGENT")
> USER-AGENT ヘッダーでは区別できないので、
> User-Agent クライアント ヒント (UA-CH) API を用いて
> SEC-CH-UA-PLATFORM と
> SEC-CH-UA-PLATFORM-VERSION で判断します。(FireFox は対象外)
> 
> 
> /*
> const uaInfo = await navigator.userAgentData.getHighEntropyValues(["platformVersion"]);
> console.log(uaInfo);
> */
> 
> navigator.userAgentData.getHighEntropyValues(["platformVersion"]).then(ua =>
> {
>  if (navigator.userAgentData.platform === "Windows") {
>   console.log(ua.platformVersion);
>  }
> });
> 
> https://developer.mozilla.org/ja/docs/Web/API/NavigatorUAData/getHighEntropyValues
> https://learn.microsoft.com/ja-jp/microsoft-edge/web-platform/how-to-detect-win11
> 
> 
> 事前に Accept-CH 要求の応答ヘッダーを付与しておくことで
> それ以降の通信に対して User Agent Client Hints(Sec-Ch-Ua) を
> サーバーへ送信させてサーバーサイド判定が可能となりますが、
> この機構は http では利用できないため、
> https 通信であることが前提になります。
> https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-CH-UA-Platform-Version
> https://http2.try-and-test.net/client_hints.html

引用返信 編集キー/
■101773 / inTopicNo.5)  Re[3]: HTTP_USER_AGENTによる使用OS判定について
□投稿者/ 魔界の仮面弁士 (3622回)-(2023/04/17(Mon) 16:01:13)
2023/04/17(Mon) 19:16:16 編集(投稿者)

全文引用は避けてください。

No101770 (のんちゃん さん) に返信
> 以下処理を Sub OsInfo()内に記述するとエラーとなってしまいます。

いやいや。
提示した navigator.userAgentData は、
見ての通りクライアント スクリプトですよ?


サーバーサイドで処理する場合の手順は、その後の後半部に述べた通り、
サーバー側から「Accept-CH: 〜」の Response Header を付与しておかねばなりません。
そうしないと、クライアント側がバージョン情報を送信してくれません。


まずはクライアント側に拡張情報の送信をブラウザーへ依頼するために、
IIS マネージャーの「HTTP 応答ヘッダー」にて、
 名前:Accept-CH
 値:Sec-CH-UA, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version
などとして、カンマ区切りで必要な情報を載せます。

そうすると、上記の Response Header での求めに応じて、ブラウザー側から
 user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36
 sec-ch-ua-platform: "Windows"
 sec-ch-ua-platform-version: "10.0.0"
あるいは
 user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48
 sec-ch-ua-platform: "Windows"
 sec-ch-ua-platform-version: "15.0.0"
といった具合に、User-Agent ヘッダーに加えて、
Sec-Ch-UA-何某の Request Header がサーバーに対して
ブラウザから送出されるようになります。
 
この状態になった後であれば、サーバー側処理でも、
Request.ServerVariables か Request.Headers で読み取れるはず…?
 → もしかしたら違うかも。
 https://kkamegawa.hatenablog.jp/entry/20080116/p2
 
Sec-CH-UA-Platform が "windows" を返す状態において、
Sec-CH-UA-Platform-Version が "1.0.0"〜"10.0.0" なら Win10、
Sec-CH-UA-Platform-Version が "13.0.0" 以上なら Win11 です。


・Sec-CH 要求が無いとバージョン等の送信は行われないため、
 仕組み上、初回要求に対してはバージョン情報が含まれません。
 クライアント要求に Sec-CH が含まれるのは、
 サーバー応答の Accept-CH を受けてからの
 2 回目以降のリクエストに限られます。
・Sec-CH の送信には https 通信が必須です。
 SSL/TLS サーバー証明書が無い環境へは送信されません。
・この方式に対応しているブラウザーは、Chrome と Edge です。
 IE、Firefox、Safari ではサポートされていません。
・Accept-CH は常時上書きです。
 他の場所で、その他の SEC-CH 情報が必要な場合は、
 Accept-CH パラメーターにその他の情報も付与しておきましょう。
 (Sec-CH-UA-WoW64, Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version-List など)
・この情報は同一セッションにおいてのみ有効です。
 ブラウザの再起動や再ログイン時には、サーバー側は
 Accept-CH による送信依頼処理からやり直す必要があります。


追記:

実際どんな値が返るか試してみたい場合は、
https://user-agent-client-hints.glitch.me/headers
https://user-agent-client-hints.glitch.me/
を使うことができます。
引用返信 編集キー/
■101777 / inTopicNo.6)  Re[1]: HTTP_USER_AGENTによる使用OS判定について
□投稿者/ WebSurfer (2672回)-(2023/04/18(Tue) 11:17:17)
No101764 (のんちゃん さん) に返信

No101769 で紹介した Microsoft のドキュメント

User-Agent クライアント ヒントを使用してWindows 11と CPU アーキテクチャを検出する
https://learn.microsoft.com/ja-jp/microsoft-edge/web-platform/how-to-detect-win11

を検証してみました。

ドキュメントには書いてありませんが、HTTPS 通信でないとダメと言うところに
注意してください。

ドキュメントの「検出パフォーマンスの最適化 Critical-CH」セクションに書いて
あるように、Accept-CH と一緒に Critical-CH ヘッダーを応答ヘッダに含めてク
ライアント(ブラウザ)に送るのが良さそうです。

そうすると、ドキュメントの「検出パフォーマンスの最適化 Critical-CH」セクシ
ョンの下の図、

https://learn.microsoft.com/en-us/microsoft-edge/web-platform/criticalch.svg

にあるように、ブラウザは最初の応答(図の点線を見てください。応答ヘッダに
Accept-CH: sec-ch-ua-platform と Critical-CH: sec-ch-ua-platform が含まれ
る)を受けた後、直ちに再度要求を出し(その下の実線)、その要求ヘッダには
Critical-CH ヘッダーに指定された情報(図では sec-ch-ua-platform)を含まれ
ます。

以降はユーザーがブラウザの「Cookie およびその他のサイト データ」を消去し
ない限り、ブラウザは Critical-CH ヘッダーに指定された情報を送信し続けます。

また、再度 Accept-CH と一緒に Critical-CH ヘッダーを応答ヘッダに含めて送信
しても、上の図のように 2 回要求が出るということはありません。

Fiddler で要求・応答をキャプチャした画像を以下に貼っておきます。

(1) 最初の要求

Default.aspx.cs の Page_Load に以下のコードを実装して要求をかけたもの。

Response.AppendHeader("Accept-CH", "Sec-CH-UA-Platform,Sec-CH-UA-Platform-Version");
Response.AppendHeader("Critical-CH", "Sec-CH-UA-Platform,Sec-CH-UA-Platform-Version");

要求ヘッダの UA-CH は画像の青枠部分の通り。Sec-CH-UA-Platform-Version
は含まれてない。

応答ヘッダには上のコードで指定した通り Accept-CH と Critical-CH が設定
されている。

http://surferonwww.info/BlogEngine/image.axd?picture=2023%2f4%2f0418Fiddler1.jpg

(2) 自動的に再度要求が出る

応答ヘッダの Accept-CH と Critical-CH を見て自動的に再度 Default.aspx に
要求が出る。

画像の青枠の通り要求ヘッダに Sec-CH-UA-Platform-Version が含まれる (この
例では OS は Windows 10 22H2)。

http://surferonwww.info/BlogEngine/image.axd?picture=2023%2f4%2f0418Fiddler2.jpg

(3) 他のページを要求

要求ヘッダに Sec-CH-UA-Platform-Version が含まれている。

http://surferonwww.info/BlogEngine/image.axd?picture=2023%2f4%2f0418Fiddler3.jpg

(4) 再度 Default.aspx を要求

応答ヘッダには Accept-CH と Critical-CH が設定されているが、上の (2) の
ように再度要求が出ることはない。

http://surferonwww.info/BlogEngine/image.axd?picture=2023%2f4%2f0418Fiddler4.jpg
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -