アクセス制御と機密性

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

クライアントに表示される情報と資産を理解することは、ゲームのセキュリティと機密性を維持するために重要です。開発者は、悪用者にどれだけの情報が表示され、クライアントに複製されるかを過小評価することがよくあります。悪用者は、単一の場所に参加できれば、あなたのユニバース内の「制限された」場所にアクセスする能力を持っています。彼らは、表示されているかどうか、または現在使用中であるかに関係なく、クライアントに複製されたコンテンツをすべて見ることができます。さらに、悪用者は、クライアント上で実行されることがない場合でも、複製されたローカルスクリプトやModuleScriptを逆コンパイルすることができます。

ユニバース内のクライアント側テレポーテーション

ユニバース内に入ると、クライアントはそのユニバース内の任意の場所にテレポートでき、意図されたアクセス制限や進行ゲートをバイパスする可能性があります。これにより、開発中またはステージングゲームからの未公開コンテンツが意図せず漏洩する可能性もあります。以下のことを理解することが重要です:

  • 「直接アクセス」を無効にすると、ウェブサイト上のサブプレイスから参加ボタンが削除されるだけで、クライアントが開始したテレポートを防ぐことはできません。
  • 悪用者は、あなたのユニバース内のすべてのサブプレイスの存在を発見することを前提としてください。
  • クライアントは、ルートプレイスなどの単一の場所にアクセスできれば、任意のサブプレイスにテレポートできます。これは、あなたの意図したデザインフローに関係なくです。

多くの開発者は、サブプレイスから無許可のユーザーをキックすることでアクセスを防ごうとします。これはゲームプレイをブロックするのには効果的ですが、プレイヤーが参加する前にサーバー側のキックロジックが実行される前に、コンテンツがクライアントに複製されるのを防ぐことはできません

セキュアなテレポートを使用する

無許可のアクセスをテレポーテーションによって防ぐ最も効果的な方法は、クリエイターダッシュボードで場所のアクセス制御ユニバース内のみセキュアに設定することです。これにより、すべての非スタートプレイスがサーバー開始のテレポートのみに制限され、プレイヤーがサブプレイスに参加する前にプラットフォームレベルでクライアント開始のテレポートがブロックされます。プレイヤーが参加しないため、コンテンツは彼らに複製されません。

クライアント開始のテレポートを使用している既存のゲームの設定手順と移行ガイダンスについては、場所間のテレポートを参照してください。

制限された場所のための深層防御

セキュアなテレポートを使用できないユニバースや、それに追加の保護層を組み合わせるために、以下の対策を講じてください:

  • 開発およびテストプレイスを別のプライベートユニバースに保つ — これは未公開コンテンツの機密性を確保する唯一の信頼できる方法です。機密のイベント資産、スクリプト、またはUI要素を、意図されたアクティブになる前に本番環境に出荷しないでください。
  • 可能であれば、ストリーミングを使用して新しいプレイヤーに複製される世界の量を制限します。
  • サーバー側のグループロールまたはバッジの検証を追加し、プレイヤーの状態や進行要件を確認します。
  • デフォルトで、参加するプレイヤーを許可しないようにします。これにより、検証プロセスが不確定な場合でも、プレイヤーが許可されないことが保証されます。たとえば、エンジンから例外がスローされた場合などです。
  • 実用的であれば、検証に失敗したプレイヤーに対してBan APIを使用します。これにより、プレイヤーが同じアカウントで参加し続けることを防ぎます。

複製

複製は、エンジンのインスタンス間で状態がネットワークを介して転送される方法を説明します。Robloxの複製モデルは、一般的にいくつかの重要な方法で簡略化されています:

  • インスタンスはサーバー権限があり、インスタンスがすべての参加者(サーバーとすべての接続されたクライアント)間で複製されるためには、サーバー上で作成される必要があります。
  • インスタンスのプロパティもサーバー権限があり、ほとんどのプロパティは、すべてのクライアントに変更を表示するためにサーバー上で変更する必要があります。
  • 一般的に、インスタンスはすべての接続されたクライアントに複製されるか、複製されないかのいずれかです。ストリーミングなどの例外もあります。

複製コンテナは、クライアントに複製されるトップレベルのインスタンス(DataModelの下に親子関係を持つ)です。インスタンスがその生涯の中で複製コンテナの子孫になる場合、その状態の多くがすべてのクライアントに複製されることを期待する必要があります。一般的な複製コンテナについては、データモデルガイドで詳しく読むことができます。疑問がある場合は、Play Soloなどのテスト環境でインスタンスやプロパティがどのように複製されるかを常に確認できます。テストモードについては、スタジオテストモードで詳しく読むことができます。

複製のセキュリティへの影響

クライアントに複製されるコンテンツは、悪用者によって抽出され、データマイニングされる可能性があります。一般的なルールとして、ユーザーに見られる準備ができていない限り、機密コンテンツをライブの本番環境に公開または出荷することは避けてください。コンテンツのリリースやアクセスをゲーム内で後の日付まで制限するロジックがあったとしても(または他の条件があったとしても)、悪用者はコンテンツが公開されるとすぐにそれを発見し、漏洩させる方法を見つけると考えてください。

スクリプト、リモート、モデルを含むがこれに限定されない、機密インスタンスに対して過度に説明的または予測可能な名前を避けてください。予測可能なDataModel階層を持つことは、エクスプロイトの開発を容易にします。

スクリプトの逆コンパイル

LocalScriptScriptRunContext::Clientを持つ)、またはModuleScriptは、クライアントに複製されると、悪用者によって逆コンパイルされる可能性があります。たとえそのようなスクリプトが無効であったり、必要とされなかったり、クライアント上で実行されなかったりしてもです。ServerStorageまたはServerScriptServiceに保存されたサーバー専用のスクリプトやModuleScriptは、クライアントに複製されないため、逆コンパイルされることはありません。

サーバー専用コードとクライアント専用コードを同じスクリプトに含むModuleScriptを書くことは推奨されません。なぜなら、サーバー側のロジックが逆コンパイルで露出し、悪用されるバグをより簡単に分析される可能性があるからです。

元のModuleScript in ReplicatedStorage
local module = {}
local Remote = script:WaitForChild("RemoteEvent")
-- 避けるべきパラダイムの例です
-- サーバーコードはScriptインスタンスまたはServerStorage/ServerScriptStorageに保管してください!
if game:GetService("RunService"):IsServer() then
function module:DoServerThing(password)
if password == "SecretPassword" then
print("機密のサーバーコード")
end
end
Remote.OnServerEvent:Connect(function(player, password)
module:DoServerThing(password)
end)
else
function module:DoServerThing(password)
Remote:FireServer(password)
end
end
return module
逆コンパイル結果
local table1 = {};
local RemoteEvent = script:WaitForChild("RemoteEvent");
if game:GetService("RunService"):IsServer() then
function table1.DoServerThing(_, p2) -- 行: 9
if p2 == "SecretPassword" then
print("機密のサーバーコード");
end
end
RemoteEvent.OnServerEvent:Connect(function(player: Player, p3) -- 行: 15
--[[
Upvalues:
[1] = table1
--]]
table1:DoServerThing(p3);
end);
return table1;
end
function table1.DoServerThing(_, p1) -- 行: 19
--[[
Upvalues:
[1] = RemoteEvent
--]]
RemoteEvent:FireServer(p1);
end
return table1;

上記のように、逆コンパイルは、ハードコーディングされたパスワード、ビジネスルール、悪用者が脆弱性を分析できる実装の詳細を含むサーバー側のロジックを明らかにします。

機密性の侵害の影響

機密性の侵害は、次のような重大な結果をもたらす可能性があります:

  • コンテンツの漏洩:未公開のアイテム、マップ、または機能が公式発表前に発見され、公開される可能性があります。
  • 競争上の不利:メカニクス、アルゴリズム、または今後の機能が競合他社によってリバースエンジニアリングされる可能性があります。
  • エクスプロイトの開発:露出したサーバーロジックにより、悪用者が脆弱性を特定し、標的攻撃を開発するのが迅速かつ容易になります。
©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。