Skript-Fähigkeiten ist ein System, das die Kontrolle über Aktionen bietet, die Skripte innerhalb des DataModel durchführen können.Es bietet eine bessere Kontrolle über Erlebnisscripte anstatt ein "Alles oder Nichts"-System zu sein, in dem jedes Skript alles tun kann, was andere Skripte können.
- Dieses System lässt dich begrenzen, was Modelle aus der Toolbox tun können, und erleichtert es, benutzergenerierten Inhalt innerhalb der Erlebniseinzuschließen, auch solche, die Skripte enthalten.
- Es kann auch dazu beitragen, die Sicherheit von Erlebnissen zu verbessern, die es Spielern ermöglichen, ihren eigenen Codesauszuführen, der oft in einem eingeschränkten oder emulierten Umgebungausgeführt wird.
- Es kann auch verwendet werden, um Bibliotheken zu teilen, die bestimmen, was sie selbst tun können.Zum Beispiel kann eine Bibliothek, die zusätzliche mathematische Methoden bereitstellt, auf die kleinste Gruppe von Funktionen beschränkt werden, die sie benötigt, damit andere Entwickler, die diese Bibliothek verwenden, nicht die gesamte Codebasis validieren müssen, um sicherzustellen, dass sie keine bösartigen Codes enthält.
Skript-Fähigkeiten aktivieren
Um diese Funktion zu aktivieren, ändern Sie die SandboxedInstanceMode``Default auf Experimental im Explorer.
Wenn der Client-Beta-Test abgeschlossen ist, ist dieser Schritt nicht mehr erforderlich.
Kontainer in einer Sandbox
Dieses System führt ein Konzept eines verschachtelten Containers ein.Eine Instanz des Typs Model , Folder , Script oder Nachkommen einer dieser Klassen haben eine Sandboxed Eigenschaft, die im Studio-Fenster Eigenschaften verfügbar ist, unter der Sektion Berechtigungen .

Die Aktivierung der Eigenschaft Sandboxed deaktiviert die Instanz als sandboxierten Container innerhalb des DataModel Baums, was die Aktionen einschränkt, die die Skripte innerhalb dieses Containers auf der Grundlage des Satzes von Werten in der Capabilities Eigenschaftenausführen können.
Fähigkeiten
Die Eigenschaft Capabilities ist eine Reihe von Werten, die verschiedene Aspekte der Ausführung steuern, aufgeteilt in vier Gruppen:
- Ausführungskontrolle - Legt fest, ob ein Skript auf Client oder Server ausgeführt werden kann
- Zugriffskontrolle der Instanz - Legt fest, mit welchen DataModel Teilen ein Skript interagieren kann
- Skriptfunktionskontrolle - Legt fest, welche Luau-Funktionsskripte aufgerufen werden können
- Motor-API-Zugriffskontrolle - Legt fest, welche Teile der Roblox-Engine-API verwendet werden können
Wenn ein Skript versucht, eine Aktion auszuführen, die nicht im Set der Fähigkeiten für den aktuellen Ausführungsstatus enthalten ist, wird ein Fehler gemeldet.Fehler enthalten in der Regel die zu verscheidende Aktion, das Ziel einer Actionund die erste Fähigkeit, die fehlt, zum Beispiel:
The current thread cannot modify 'Workspace' (lacking capability AccessOutsideWrite)The current thread cannot call 'Clone' (lacking capability CreateInstances)The current thread cannot call 'GetSecret' (lacking capability Network)
Ausführungskontrolle
Dieses Set enthält zwei Fähigkeiten:
- RunClientScript - LocalScript oder Script mit einem RunContext Wert von Client ist es erlaubt, auf dem Client ausgeführt zu werden
- RunServerScript - Script mit einem RunContext Wert von Server ist es erlaubt, auf dem Server ausgeführt zu werden
Wenn das Skript Enabled ist, aber die Funktionalität, die der Standort starten möchte, nicht verfügbar ist, wird eine Warnmeldung im Ausgabe -Fenster angezeigt.Wenn ein Skript nicht in diesem Kontext ausgeführt werden sollte, deaktiviere oder lösche es.
Beachten Sie, dass ModuleScripts nicht erforderlich sind, um diese Ausführungsfähigkeiten benötigt zu werden.
Wenn ein Skript nicht startet, weil die Ausführungssteuerungsfähigkeit fehlt, wird es als Warnung in der Ausgabe gemeldet, zum Beispiel:
Cannot start server script 'Script' (lacking capability RunServerScript)
Instanzzugriffssteuerung
Dieses Set enthält nur eine einzige Fähigkeit:
- Zugriff von außen auf Schreiben - Skript darf Instanzen von außerhalb des sandboxierten Containers abrufen und empfangen
Wenn die Funktionalität nicht verfügbar ist, kann das Skript nur nach Instanzen suchen, die sich in seinem eigenen sandboxierten Container befinden.Wenn das Skript zum Beispiel direkt in den sandboxierten Container platziert wird, gibt zurück.
Zusätzlich leitet jedes Roblox-API-Ereignis, das in einem Instance passt, stattdessen in nil für jedes Instance außerhalb des sandboxierten Containers.Wenn zum Beispiel das BasePart.Touched von einer Instanz außerhalb des sandboxierten Containers durch einen Touch angezeigt wird, wird das Ereignis immer noch empfangen, aber das Argument ist nil .
Vermeiden Sie das Festlegen dieser Fähigkeit; Sandbox-Garantien sind schwächer, wenn Skripte mit jeder Instanz in einem Erlebnis interagieren können.
Zugriff auf Dienste
Selbst ohne Zugriff von außen auf Schreiben , können Skripte im sandboxierten Container immer noch auf , und Dienste zugreifen.Dieser Zugriff wird bereitgestellt, damit Skripte immer noch nützliche Methoden dieser Globals aufrufen können, wie DataModel.GetService , aber der Zugriff auf ihre Kindinstanzen immer noch validiert wird.
Innerhalb übermittelte Instanzen
Wenn eine Instanz durch eine Funktionsaufruf durchläuft, die nicht durch Roblox-APIs geht, wird die Referenz erhalten.Wenn jedoch ein ModuleScript auf diese Weise übergeben wird, kann es nicht ohne AccessOutsideWrite erforderlich sein.Das liegt daran, dass die Rückgabe der ModuleScript oft veränderbar ist und durch ein Skript in einem sandboxierten Container modifiziert werden kann.
Skriptfunktionalitätskontrolle
Diese Reihe von Funktionen kontrolliert einige allgemeine Aspekte von Skripten:
- AssetRequire - Skript kann mit einer Asset-ID aufgerufen werden require
- LoadString - Skript darf aufrufen loadstring
- CreateInstances - Skript kann neue Instanzen mit Instance.new , Instance.fromExisting oder Instance:Clone() erstellen
Denken Sie daran, dass die Standardfunktionsbeschränkungen immer noch gelten.Selbst wenn LoadString aktiviert ist, muss die Erfahrung es in ServerScriptService noch aktivieren, und sie ist immer noch nur auf dem Server verfügbar.
Um neue Instanzen zu erstellen, neben CreateInstances , ist eine zusätzliche Engine-API-Fähigkeit erforderlich, die Zugriff auf diese Instanz bietet.
Engine-API-Zugriffskontrolle
Diese letzte Gruppe von Fähigkeiten kontrolliert den Skriptzugriff auf verschiedene Engine-APIs:
- Basis - Zugriff auf einfache Instanzen und wesentliche Bausteine
- Audio - Zugriff auf Instanzen, die sich auf Audio-APIs beziehen
- Datenspeicher - Zugriff auf Datenspeicher- und Speicherapi
- Netzwerk - Zugriff auf HTTP-Netzwerk-APIs
- Physik - Zugriff auf Instanzen, die mit der Physik verbunden sind
- UI - Zugriff auf Instanzen, die sich auf Benutzeroberflächen beziehen
- CSG : Zugriff auf Instanzen und Funktionen, die sich auf konstruktive Solid-Geometrie beziehen (CSG)
- Chat : Zugriff auf Instanzen, die sich auf den Chat im Erlebnis beziehen
- Animation : Zugriff auf Instanzen, die sich auf Animationen beziehen
- Avatar : Zugriff auf Instanzen, die sich auf Avatare beziehen
- Eingabe : Zugriff auf Instanzen, die sich auf die Eingabe des Benutzers beziehen
- Umgebung : Zugriff auf Instanzen, die sich auf die Kontrolle beziehen, wie die Umgebung angezeigt wird
- RemoteEvent : Zugriff auf Instanzen für interne Netzwerkoperationen
Es gibt auch Instanzen, die ohne irgendeine Funktionalität verfügbar sind, außer der Möglichkeit, die Skripte auszuführen.Dazu gehören die folgenden HttpService Methoden:
Wenn eine Instanz-Eigenschaft oder -Methode ohne die erforderliche Fähigkeit aufgerufen wird, wird ein Fehler gemeldet, der die fehlende Fähigkeit beschreibt.
Schließlich decken Fähigkeiten heute nicht jede Instanz in der Roblox-Engine ab.Instanzen, die in diesem Abschnitt oder im folgenden nicht aufgelistet sind, sind nicht über einen sandboxierten Container für Interaktionen verfügbar und werfen einen Fehler, der sagt, dass keine unzuweisende Fähigkeit für das aktuelle Skript, das. PL: die Skriptsverfügbar ist.
Eine zusätzliche Einschränkung ist, dass getfenv und setfenv Funktionen für Skripte in einem sandgefilterten Container nicht verfügbar sind.
Nur der Zugriff von Skripten auf Instanzen ist begrenzt.Die Instanzen selbst können weiterhin existieren und von sich aus innerhalb eines sandboxierten Containers operieren.Lichter leuchten immer noch, Benutzeroberflächen sind immer noch sichtbar, und Audio-Einstellungen, die bereits verdrahtet sind, spielen Geräusche ab.
Engine API-Fähigkeitenzuweisungen
Hier ist die Liste der Instanzen und Methoden (wenn sie sich von der Instanzfähigkeit unterscheidet) für jede Engine-API-Fähigkeit:
Grundlegend * Attachment
Datenspeicher * DataStore , OrderedDataStore , GlobalDataStore
Physik * AlignOrientation , AlignPosition , DynamicRotate
UI * BasePlayerGui , PlayerGui , BillboardGui , GuiBase , GuiBase2d , GuiBase3d , LayerCollector , ScreenGui , SurfaceGui , SurfaceGuiBase , UIBase
- UIComponent , UICorner , UIDragDetector , UIFlexItem , UIGradient , UIGridLayout , UIGridStyleLayout , UILayout , UIListLayout , UIPadding , UIPageLayout , UIScale , UIStroke , UITableLayout
CSG * GeometryService
- IntersectOperation (fordert auch Grundlegendes ), NegateOperation (fordert auch Grundlegendes ), PartOperation (fordert auch Grundlegendes ), UnionOperation (fordert auch Grundlegendes )
Animierung * Bone (erfordert auch Grundlegendes )
Umwelt * Atmosphere , Clouds , Lighting , Sky
Fernereignis * BaseRemoteEvent , RemoteEvent , UnreliableRemoteEvent
Interaktionen zwischen Containern
Verschachtelte Container
Wenn ein sandboxter Container in einem anderen enthalten ist, sind die Instanzen des inneren Containers für den äußeren zugänglich.
Die Fähigkeiten des inneren Containers sind durch die Fähigkeiten des äußeren Containers begrenzt.Wenn zum Beispiel der äußere Container über Funktionen von Basic , Audio und CSG verfügt, während der innere Container über Basic und Netzwerk verfügt, stehen dem inneren Container nur Basic Funktionen zur Verfügung, wenn er zur Laufzeit ausgeführt wird.
Wenn es keine Gemeinsamkeiten zwischen den inneren und äußeren Containern gibt, ist das daraus resultierende Fähigkeiten-Set leer.
Bindbare Funktionen und Ereignisse
BindableEvent und BindableFunction bieten die beste möglichkeit, mit dem container zu kommunizieren oder ihm zu erlauben, rückrufe mit funktionen auszuführen, die es selbst nicht direkt verwenden darf.
Wenn ein Ereignis oder eine Funktion ausgelöst wird, werden Verbindungen im Kontext der Funktion ausgeführt, die sie registriert hat.Das bedeutet, dass, wenn das Ereignis- oder Funktions-Callback durch den sandboxierten Container registriert wird, es mit den Fähigkeiten dieses Containers aufgerufen wird.Wenn der Rückruf von außerhalb des Codes registriert wird, wenn Sandbox-Container-Skripte sie aufrufen, führen sie Ihre Funktionen mit verfügbaren Funktionen Ihrer Funktionen aus.
Es ist wichtig zu beachten, dass selbst mit der Zugriff außerhalb schreiben Fähigkeit Skripte in sandboxierten Containern keine Ereignisse oder Funktionen außerhalb ihrer Container auslösen können, wenn sie ein größeres Fähigkeitenset haben als der Container selbst.
Modul erfordern
Inner ModuleScripts kann vom sandboxierten Container wie üblich verlangt werden.Wenn die Zielinstanz jedoch außerhalb des Containers ist, kann die ModuleScript nur dann erforderlich sein, wenn das verfügbare Fähigkeiten-Set kleiner oder gleich dem verfügbaren Fähigkeiten-Set des Containers ist.
Diese Einschränkung gilt nicht für RunClientScript und RunServerScript Fähigkeiten.Wenn das ModuleScript in einem Container platziert wird, der nur RunClientScript enthält, aber von einem Skript erforderlich ist, das die RunServerScript Fähigkeit hat, wird es erlaubt, erfolgreich zu sein und diese Funktionen auf dem Server auszuführen.
Funktionen direkt aufgerufen
Wenn ein ModuleScript in einem sandboxierten Container von außerhalb des Containers benötigt wird, sind einige der Schutzmaßnahmen nicht verfügbar.Insbesondere ist die Zielfunktion in der Lage, auf alle verfügbaren Instanzen zuzugreifen, die dem Anrufer zur Verfügung stehen.Wenn der Anrufer nicht in einem sandboxierten Container ist, agiert der Anruf als ob Zugriff von außen auf Schreiben verfügbar ist.
Weitere Einschränkungen der Fähigkeiten gelten immer noch.Wenn du eine Datenspeicher-Zugriffsfähigkeit hast, aber das Zielmodul nicht, kann es keine DataStore.Wenn du jedoch deine eigene Funktion mit DataStore arbeiten lässt, kann das Ziel sie während dieses Aufrufs ausführen.Wenn das Ziel einen Thread mit Methoden wie denen aus task anfragt, verlieren diese Threads die Fähigkeit, diese Funktion aufzurufen.
Instanzen können dem Zielmodul übergeben oder den Modulfeldern zugewiesen werden.
Wenn erforderlich, wird empfohlen, Tabmitglieder mit rawset zuzuweisen, um die Ausführung von __index / __newindex Metamethoden zu vermeiden, die auf dem Tisch festgelegt werden könnten.
Die generelle Empfehlung ist, mit BindableEvent und BindableFunction so oft wie möglich zu kommunizieren.
Bewegung von Instanzen
Die meisten Instanzen haben keine Einschränkungen für die Bewegung zwischen Containern.Skriptinstanzen können jedoch nur in einen Container verschoben werden, der die gleiche Reihe von Funktionen oder einen Unter集 von diesen Funktionen hat.
Das bedeutet, dass der sandboxierte Container mit AccessOutsideWrite nicht einfach ein Skript innerhalb von sich selbst nach außen übernehmen und mehr Funktionen erhalten kann.