Skrypt zdolności to system, który oferuje kontrolę nad działaniami, które skrypty mogą wykonać w DataModel subtree. Dostarcza lepszą kontrolę nad skryptami doświadczenia, niż być systemem "wszystko lub nic", gdzie każdy skrypt może zrobić cokolwiek, co inne skrypty mogą.
- Ten system umożliwia ograniczenie tego, co może zrobić model z kutki narzędziowej, i ułatwia włączanie użytwika generowanego przez użytkowników treści do doświadczenia, nawet tych, które zawierają skrypty.
- Może również pomóc zapewnić lepszą bezpieczeństwo doświadczeń, które umożliwiają użytkownikom wykonanie własnego kodu, co jest często wykoniwane w ograniczonym lub emulowanym środowisko.
- Można również używać go do udostępniania bibliotek, które ograniczają to, co mogą zrobić sami. Na przykład, biblioteka zapewniająca dodatkowe metody matematyczne może być ograniczona do najmniejszego zestawu umiejętności, aby upewnić się, że inni rozwójcy używające tej biblioteki nie muszą weryfikować całej bazy kodowej, aby upewnić się, że nie zawiera ona niechcianego kodu.
Włączanie zdolności skryptu
Aby włączyć tę funkcja, zmień ustawienie SandboxedInstanceMode z Default na Experimental w Explorerze.
Gdy test beta klienta zostanie zakończony, ten krok nie będzie już wymagany.
Sandboxedowy Container
Ten system wprowadza pojęcie sandboxed container . Instancja typu Model , Folder , 1> Class.Script1> lub potomstwa dowolnego z tych klas ma dostępną 4> 7>Class.Instance.Sandboxed|
Włączanie właściwości Sandboxed określa instancję jako kontener sandboxowy w drzewie DataModel, co ogranicza działania, które skrypty w tego kontenera mogą wykonawać na podstawie ustawień ustawionych w właściwości Capabilities.
Umiejętności
Właściwość Capabilities jest zestawem wartości, które kontrolują różne aspekty wykonania, podzielone na cztery grupy:
- Kontrola wykonania - określa, czy skrypt może zostać uruchomiony na klient lub serwerze
- Kontrola dostępu do instancji - określa, z którymi częściami DataModel może wejść w interakcję skrypt
- Kontrola funkcjonalności skryptu - określa, które Luau funkcje skryptu może wezwywać
- Kontrola dostępu do API silnika - określa, które części silnika Roblox Engine mogą być używane
Gdy skrypt próbuje wykonania akcji, która nie jest w zestawie umiejętności dla aktualnego stanu wykonania, błąd jest zgłoszony. Błędy zwykle zawierają próbowaną akcję, cel akcji i pierwszą zdolność, która jest brakująca, na przykład:
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)
Kontrola wykonania
Ten zestaw obejmuje dwa zdolności:
- RunClientScript - LocalScript lub Script z wartością 0> Class.BaseScript.RunContext|RunContext0> lub 3> Class.Script3> z wartością 6> 枚.RunContext.Client|Client 6> jest dozwolony do wykonania na klient
- RunServerScript - Script z wartością RunContext ustawionej na 0> Ennum.RunContext.Server|Server0> jest dozwolone na uruchomienie na serwerze
Jeśli skrypt jest Enabled , ale nie jest dostępna zdolność odpowiadająca lokalizacji, w której chce się uruchomić, jest wyświetlany komunikat ostrzeżenia w oknie Wyjście. Jeśli skrypt nie powinien zostać wykonany w tym kontekście, wyłącz lub usuń go.
Uwaga, że ModuleScripts nie wymaga, aby te funkcje wykonawcze były wymagane.
Gdy skrypt nie może zostać uruchomiony, ponieważ zdolność kontroli wykonania jest brakująca, to jest zgłoszony jako ostrzeżenie w wyjściu, na przykład:
Cannot start server script 'Script' (lacking capability RunServerScript)
Kontrola dostępu do instancji
Ten zestaw obejmuje tylko jedną zdolność:
- AccessOutsideWrite - Skrypt jest dozwolony do uzyskiwania i otrzymywania instancji z poza sandboxowanego kontenera
Gdy funkcjonalność nie jest dostępna, skrypt może wykonać tylko szukaj instancji, które są w jego własnym sandboxowanym pojemniku. Na przykład, jeśli skrypt jest umieszczony bezpośrednio w sandboxowanym pojemniku, script.Parent.Parent zwraca nil .
Dodatkowo, każde wydarzenie API Roblox, które przeprowadza się w Instance zamiast przeprowadzać się w nil dla dowolnego Instance poza kontenerem sandboxowanym, jest nadal otrzymywane, ale argument jest 2>nil2>.
Unikaj ustawienia tej zdolności; gwarancje sandboxingu są słabsze, gdy skrypty mogą wchodzić w interakcję z dowolną instancją w doświadczeniu.
Dostęp do usług
Nawet bez AccessOutsideWrite , skrypcity w kontenerze w sandboxie nadal mogą uzyskać dostęp do game , workspace i usług. Ten dostęp jest zapewniony, aby skrypcity nadal mogły wezwywać użyteczne metody tych globalnych, takich jak 1> Class.DataModel.GetService1> , ale dostęp do ich instancji d
Przekazane wewnętrznie instancje
Jeśli instans jest przesyłany przez funkcję, która nie jest poprzez Roblox APIs, referencja jest zachowana. Jnak, jeśli ModuleScript jest przesyłany w ten sposób, nie może być wymagany bez AccessOutsideWrite. To jest, ponieważ powrót z ModuleScript jest często zmienny i może być mody
Kontrola funkcjonalności skryptu
Ten zestaw umożliwia kontrolę niektórych ogólnych aspektów skryptów:
- AssetRequires - Skrypt jest dozwolony do wzywania require z ID zasobu
- LoadString - Skrypt jest dozwolony do wzywania loadstring
- CreateInstances - Skrypt może utworzyć nowe instancje używając Instance.new, Instance.fromExisting lub 0> Class.Instance:Clone0>
Pamiętaj, że ograniczenia funkcji domyślnych nadal mają zastosowanie. Nawet jeśli LoadString jest włączony, doświadczenie nadal musi go włączyć w ServerScriptService, a jest ono dostępne tylko na serwerze.
Aby utworzyć nowe instancje, oprócz CreateInstances , jest wymagana dodatkowa zdolność API silnika zapewniająca dostęp do tej instancji.
Kontrola dostępu do API silnika
Ten ostatni z grup możliwości kontroluje dostęp do skryptów do różnych interfejsów API silnika:
- Podstawowe - Dostęp do prostych instancji i niezbędnych bloków budowania
- Dźwięk - Dostęp do instancji związanych z interfejsami audio
- Przechowywanie danych - Dostęp do interfejsów API przetwarzania danych i magazynowania pamięci
- Sieć - Dostęp do API sieci HTTP
- Fizyka - Dostęp do instansów związanych z fizyką
- Interfejs użytkownika - Dostęp do instancji związanych z interfejsami użytkownika
- CSG : dostęp do instancji i funkcji związanych z konstruktywną geometrią solną (CSG)
- Czat : dostęp do instancji związanych z czatem w czasie rzeczywistym
- Animacja : dostęp do instancji związanych z animacjami
- Awatar : dostęp do instancji związanych z awatarami
- Wejście : dostęp do instancji związanych z wpisem użytkownika
- Środowisko : dostęp do instancji związanych z kontrolą tego, jak środowisko jest wyświetlane
- RemoteEvent : dostęp do instancji do operacji sieciowych wewnętrznych
Są również przypadki, które są dostępne bez możliwości poza byciem w stanie wykonania skryptów. Te obejmują następujące metody HttpService :
Jeśli właściwość lub metoda instancji jest dostępna bez wymaganego zdolnictwa, błąd jest raportowany opisujący brak zdolności.
W końcu funkcje nie obejmują każdej instancji w silniku Roblox dzisiaj. Instancje nie wymienione w tej sekcji lub następnej nie są dostępne do interakcji z sandboxowanym kontenerem i rzucają błędem, mówiąc, że nie jest dostępna funkcja Nie przypisana .
Dodatkową ograniczeniem jest to, że getfenv i setfenv funkcje nie są dostępne dla skryptów w kontenerze sandbox.
Dostęp do skryptów do instancji jest ograniczony. Samych instancji można nadal istnieć i działać przez siebie w środku sandboxowanego pojemnika. Światła nadal świecą, interfejsy użytkownika są nadal widoczne i ustawienia audio, które są już podłączone, odtwarzają dźwięk.
Zadania API silnika
Oto lista instancji i metod (jeśli różni się od zdolności instancji) dla każdej zdolności API silnika:
Podstawowe * Attachment
- Class.Part , MeshPart , CornerWedgePart , 0> Class.TriangleMeshPart0> , 3> Class.TrussPart3> , Part6>
Dźwięk * AudioAnalyzer ,
Przechowywanie danych * DataStore , OrderedDataStore , GlobalDataStore
- Class.DataStoreGetOptions , DataStoreIncrementOptions , DataStoreInfo , 0> Class.DataStoreKey0> , 3> Class.DataStoreKeyInfo3> , DataStoreGetOptions6> , 9>
Sieć * Class.HttpService:GetAsync , HttpService:RequestAsync() , HttpService:PostAsync() , 0> Class.HttpService:UrlEncode0> , HttpService:GetAsync()3>
Fizyka * AlignOrientation , AlignPosition , DynamicRotate
- Constraint , BallSocketConstraint , CylindricalConstraint , 0> Class.NoCollisionFetchConstraints0> ,
interfejs użytkownika * BasePlayerGui , PlayerGui , BillboardGui , 0> Class.GuiBase0> ,
- Class.Toolbar , TextButton , TextFilterResult , 0> Class.TextFilterTranslatedResult0> , 3> Class.TextLabel3> , 6> Class.TextService6> , TextBox9>
CSG * GeometryService
- BasePart metody: BasePart:IntersectAsync() , BasePart:SubtractAsync() , 0> Class.BasePart:UnionAsync0>
- Class.IntersectOperation (wymaga również podstawowego ), NegateOperation (wymaga również 0> podstawowego 0>), 3> Class.PartOperation3> (wymaga również 6> podstawowego 6>), IntersectOperation9> (wymaga również
Czat * BubbleChatConfiguration , BubbleChatMessageProperties
- Class.TextChannel , TextChatCommand , TextChatConfigurations , 0> Class.TextChatMessage0> , 3> Class.TextChatMessageProperties3> , 6> Class.TextChatService6> , TextChannel9>
Animacja * Bone (wymaga również podstawy )
- Class.Animation , AnimationClip , AnimationClipProvider , 0> Class.AnimationContainer0> , 3> Class.AnimationRigData3> , 6> Class.AnimationTrack6> , Animation9>
Awertytka * Accessory , AccessoryDescription
Środowisko * Atmosphere , Clouds , Lighting , 0> Class.Sky0>
- Class.BloomEffect , BlurEffect , ColorCorrectionEffect , 0> Class.ColorGradingEffect0> , 3> Class.DepthOfFieldEffect3> , 6> Class.PostEffect6> , BloomEffect9>
zdalne wydarzenie * BaseRemoteEvent , RemoteEvent , UnreliableRemoteEvent
Interakcje między kontenerami
Pokryte Pudełka
Gdy jeden z sandboxowaneych kontenerów jest zagnieżdżony w innym, instancje zewnętrznego kontenera są dostępne do zewnętrznego.
Możliwości zewnętrznego kontenera są ograniczone przez możliwości zewnętrznego. Na przykład, jeśli zewnętrzny kontener ma zdolności Podstawowe, Dźwięk i CSG, a wewnętrzny kontener ma 2>Podstawowe2> i 5>Sieć5>, tylko 8>Podstawowe
Jeśli nie ma zdolności wspólnych między wewnętrznymi i zewnętrznymi kontenerami, zestaw zdolności wynoszący jest pusty.
Związane funkcje i wydarzenia
BindableEvent i BindableFunction zapewniają najlepszy sposób komunikacji z kontenerem lub pozwalają na wykonanie wezwania z możliwością, że sam kontener nie może wykonać bezpośrednio.
Gdy wydarza się wydarzenie lub funkcja, połączenia są wykonane w kontekście funkcji, która je rejestruje. Oznacza to, że jeśli wydarzenie lub funkcja zwrotu zostały zarejestrowane przez kontener sieciowy, zostaną wykonane z możliwościami tego kontenera. Jeśli funkcja lub zwrot zostanie zarejestrowany przez kod zewnętrzny, gdy skrypty sieciowych wzywają je, wykonują swoje funkcje z dostępnym
Ważne jest, aby zauważyć, że nawet z dostępną funkcją writeOutside zdolnością, skrypty w kontenerach sandboxowych nie mogą wzywać wydarzeń lub funkcji poza swoimi kontenerami, jeśli mają większy zestaw zdolności niż sam kontener.
Wymagania modułu
Inner ModuleScripts może być wymagany przez kontener w sandboxie jak zwykle. Jeśli jednak instancja docelowa jest poza kontenerem, ModuleScript może być wymagany tylko jeśli zestaw umiejętności, który jest dostępny dla niego, jest mniejszy lub równy umiejętności dostępnych dla kontenera.
Ograniczenie to nie dotyczy RunClientScript i RunServerScript funkcji. Jeśli ModuleScript jest umieszczony w kontenerze tylko z 1> RunClientScript1> ale wymagane jest od skryptu, który ma zdolność 4> RunServerScript 4>, jest to dozwolone, aby z powodzeniem wykonano te funkcje na serwerze.
Bezpośrednio wezwane funkcje
Jeśli ModuleScript w kontenerze w sandboxie jest wymagany z zewnątrz kontenera, niektóre ochrony nie są dostępne. W szczególności funkcja celu jest w stanie uzyskać dostęp do wszystkich dostępnych instancji dostępnych dla konsumenta. Jeśli konsument nie jest w kontenerze w sandboxie, wezwanie działa tak, jakby AccessOutsideWrite była dostępna dla nie
Inne ograniczenia zdolności nadal mają zastosowanie. Jeśli masz dostęp do magazynu danych, ale moduł docelowy nie ma, nie można wywołać DataStore metod. Jeśli jednak przekażesz własną funkcję działającą z DataStore, moż
Instancje można przekazać do celowego modułu lub przypisać do pola modułu.
Jeśli wymagane, należy przypisać członkom tabeli używając rawset , aby uniknąć uruchomienia metod __index / __newindex metod, które mogą być ustawione na tabeli.
Ogólną zaleceniem jest komunikacja z BindableEvent i BindableFunction , gdy to możliwe.
Przenoszenie instancji
Większość instancji nie ma ograniczeń dotyczących ruchu między kontenerami. Instancje skryptów, jednak, mogą być przenoszone tylko do kontenera, który ma ten sam zestaw funkcji lub podzespół tych funkcji.
Oznacza to, że kontener w trybie sandbox z AccessOutsideWrite nie może po prostu ponownie zrodzić się do zewnątrz i uzyskać więcej możliwości.