Skip to content

Going online ja

Tom_XV edited this page Sep 23, 2026 · 3 revisions

English | 日本語

実験的な機能です。 中核 1.2.0 で入ったもので、mods network は Tool window 1.1.0 で入りました(フレームワーク 1.2.0、2026-09-17)。

Mod はゲームと同じ権限で動くので、何でもどこへでも送れます。プレイヤーからはそれが見えませんし、Mod のソースを読む人もほとんどいません。そこでフレームワークには、単純な決まりがあります。外と通信する Mod はそのことを申告し、プレイヤーは驚く前に Mods 画面でそれを確かめられる。

なぜ必要か

外との通信は、マルウェアが紛れ込む場所にもなります。Mod はプレイヤーのファイルを外へ送ったり、コードを取ってきて動かしたりしながら、見た目は普通の Mod のままでいられます。人をだますように作られた Mod は、フレームワークには止められません(これができないこと)。できるのは、外と通信するならどの Mod も必ずそれを公に申告する、という決まりにすることです。そうすれば、

  • プレイヤーは、遊ぶ前にも遊んでいる間にも、どの Mod がどこと何のために通信するかを確かめられる
  • 申告していない所へつないだ Mod は、Mods 画面とログで目立ち、プレイヤーやレビューする人、ほかの Mod 作者の目に留まる
  • 正直な Mod 作者には、自分の Mod が何をするかを伝える、分かりやすい決まった方法がある

仕組みは 3 つに分かれています。Mod 作者向けのルール(GUIDE のルール 11)、Mods 画面に表示される ModInfo.Network での申告、それから、どの Mod が実際に通信したかを記録して、申告していない Mod に印を付ける見張りです。

Mod 作者の方へ:ルール

インターネットにつなぐ Mod は、つなぐ先のホストをすべて ModInfo.Network に並べて、何のためか、何を送るか、どう止めるかを書きます。プレイヤーについての情報(名前、セーブ、入力した文字、その人を追える ID)は、本人がオンにしてから送ります。プレイヤーについて何も送らない確認なら、フレームワークの更新確認のように既定でオンにしておいても構いません。

Mod 作者の方へ:申告

ModFramework.Register(new ModInfo
{
    Guid = MyMod.Guid,
    DisplayName = "My Mod",
    Network = new[]
    {
        new NetworkUse
        {
            Host = "api.example.com",          // または "*.example.com"
            Purpose = "Downloads the latest word list once a day.",
            Sends = "The language you chose. Nothing that identifies you.",
            TurnOff = "Mods → My Mod → Settings → Online word list",
        },
    },
});
  • ホストは完全に同じものだけが合います。*.example.com と書けば、example.com とその下すべてに合います。アドレスへ直接つなぐ Mod は、そのアドレスを申告します。
  • UpdateRepository のためには、何も足さなくて大丈夫です。その問い合わせ(api.github.com へ)はフレームワークが Mod の代わりにして、申告もフレームワークがやります。フレームワーク自身の更新確認も同じように申告しています。プレイヤーが更新確認をオフにすると、これらの項目は消えます。
  • TurnOff には、プレイヤーが Mods 画面でたどる道筋を書いてください。

プレイヤーの方へ:どう見えるか

Mods 画面(Options → Mods)では次のように出ます。

  • 一覧では、ホストを申告しているか、通信しているのが見られた Mod に Online(オンライン) のタグが付きます。
  • 詳細には Uses the internet:(インターネットを使用)と接続先が出ます。
  • Mod の Internet タブには、接続先ごとに What for(何のため)、What is sent(何を送るか)、How to turn it off(止め方)が並び、続けて、このセッションでその Mod が接続したのが見られた先が出ます。About や Settings と並ぶタブになったのは1.5.0 からで(1.5.0)、それまでは Settings の上のボタンで開くページでした。
  • 警告色で出ていたら、その Mod は申告していない接続先へつないだということです。詳細には Went online without saying so:(申告せずに通信した)と Internet タブへのボタンが出て、タブには警告色の点が付き、タブの中ではその接続先に not declared by the mod(Mod が申告していない)と付きます。一覧の Needs attention の絞り込みにも入ります(1.5.0)。ログにも警告が出ます。

Console の mods network でも、読み込まれている全プラグインについて同じ内容を出せます。

見張り

NetworkWatch(Mods → Drag'n Wash ModFramework → Settings → Watch connections、[Network] Watch connections、既定でオン)は、どの Mod がどこへ接続したかを記録します。見張るのは次の呼び出しです。

API 見張る所
UnityWebRequest SendWebRequest()
WebRequest(WebClient も経由する) Create・CreateDefault・CreateHttp
HttpClient Get / Post / Send がすべて行き着く SendAsync(request, option, token)。System.Net.Http が読み込まれた時点から
Socket Connect(EndPoint)・Connect(host, port)・BeginConnect(EndPoint, ...)・BeginConnect(host, port, ...)・ConnectAsync(SocketAsyncEventArgs)・SendTo(..., EndPoint)
TcpClient Connect(host, port)

呼び出しがあるたびに、呼び出し元のスタックで最初に見つかったプラグインを探して、Mod とホストと API を記録します。ある Mod があるホストに初めてつないだとき、申告済みならログに情報を 1 行出します。申告していなければログに警告を出して、上に書いた印を Mods 画面に付けます。

  • 数えるのは一番外側の呼び出しだけです。 CreateHttp は Create を、Connect("host") は Connect(アドレス) を呼びますが、残すのはホスト名の入った 1 件だけです。HttpWebRequest・HttpClient・TLS の中で開かれるソケットは、それを始めた呼び出しの側で数えます。
  • file: や jar: のようなネットワークでない URL と、localhost やループバックのアドレスは数えません。名前解決(Dns)も見張りません。名前解決だけなら、リゾルバーに名前が送られるだけだからです。
  • 記録はスタック上の最初のプラグインに付きます。 ライブラリが Mod の代わりに通信すれば、ライブラリの分になります。後で別スレッドで動き、スタックに Mod がいないコード(async の続き)は、誰の分にもせず、記録もしません。それを始めた呼び出しのほうで、もう記録してあるからです。
  • 負荷としては、見張る呼び出しのたびにスタックをたどりますが、通信はめったにないので問題になりません。

これができないこと

見張るだけです。何も止めず、遅らせず、変えません。見張りの中で何か失敗しても握りつぶすので、Mod の通信はそのまま進みます。

安全を保証する仕組みではありません。 ネイティブコード、Mod が自前で持つソケットのライブラリ、見張りを外す Harmony の小細工、呼び出し元を隠すコードは、すり抜けます。正直な使い方を見えるようにして、うっかりを目立たせるためのもので、Mod が安全だと証明することはできません。Internet タブにも、そのことを 1 行で書いています。

オフにするには

  • ある Mod の通信を止めるには、その Mod の Internet タブの How to turn it off(止め方)に従うか、Mods 画面でその Mod をオフにします。
  • 更新確認(フレームワークのものと、UpdateRepository を設定したすべての Mod のもの)は、Mods → Drag'n Wash ModFramework → Settings → Check for updates でオフにします。
  • 見張りそのものは、Mods → Drag'n Wash ModFramework → Settings → Watch connections でオフにします。オフにすると何も記録せず、Internet タブには見張りがオフだと出ます。申告の表示はそのまま残ります。

API

API メンバー
NetworkUse Host、Purpose、Sends、TurnOff
ModInfo.Network NetworkUse[]
NetworkWatch.Enabled プレイヤーの設定
NetworkWatch.DeclaredBy(guid) Mod の申告と、その Mod のためのフレームワークの更新確認
NetworkWatch.SeenBy(guid) / All() このセッションの Connection:Guid、Host、Via、Count、Declared、FirstSeenUtc
NetworkWatch.HasUndeclared(guid) 申告していないホストへ接続していれば true

Clone this wiki locally