2016-01-16 1 views
1

Я новичок в песочнице в Lua и хотел бы узнать, как фильтровать такие вещи, как GetChildren() или: Kick().ROBLOX sandboxing

Это то, что я до сих пор:

function safeGetChildren(obj) 
    local objs = {} 
    for _,v in pairs(obj) do 
     if not v.Name:match("^^") then 
      table.insert(objs, v.Name) 
     end 
    end 

    return objs 
end 

function safeClearAllChildren(obj) 
    if obj:IsA("Player") or obj:IsA("Players") or obj:IsA("Workspace") or obj:IsA("ServerScriptService") or obj:IsA("Lighting") or obj:IsA("ReplicatedStorage") or obj:IsA("StarterGui") then 
     return error("Cannot clear this object!"); 
    else 
     obj:ClearAllChildren(); 
    end 
end 

function safeRemoveObject(obj) 
    local name = obj.Name:lower(); 

    if obj:IsA("Player") or name == "remoteevents" or obj.Parent == "RemoteEvents" or obj.Parent == "ReplicatedStorage" or obj.Parent == "StarterGui" or obj.Parent == "ServerScriptService" or obj.Parent == "TinySB" then 
     return error("Cannot destroy this object!"); 
    else 
     obj:Destroy(); 
    end 
end 

local Globals = { 
    -- Globals 
    workspace = workspace, 
    print = print, 
    error = error, 
    table = table, 
    pairs = pairs, 
    game = game, 
    string = string, 
    _G = _G, 
    getfenv = getfenv, 
    loadstring = loadstring, 
    ipairs = ipairs, 
    next = next, 
    os = os, 
    pcall = pcall, 
    rawequal = rawequal, 
    rawget = rawget, 
    rawset = rawset, 
    select = select, 
    setfenv = setfenv, 
    setmetatable = setmetatable, 
    tonumber = tonumber, 
    tostring = tostring, 
    type = type, 
    unpack = unpack, 
    _VERSION = _VERSION, 
    xpcall = xpcall, 
    collectgarbage = collectgarbage, 
    assert = assert, 
    gcinfo = gcinfo, 
    coroutine = coroutine, 
    string = string, 
    table = table, 
    math = math, 
    delay = delay, 
    LoadLibrary = LoadLibrary, 
    printidentity = printidentity, 
    spawn = spawn, 
    tick = tick, 
    time = time, 
    UserSettings = UserSettings, 
    Version = Version, 
    wait = wait, 
    warn = warn, 
    ypcall = ypcall, 
    PluginManager = PluginManager, 
    LoadRobloxLibrary = LoadRobloxLibrary, 
    settings = settings, 
    stats = stats, 

    -- Functions 
    ["require"] = function(...) 
     return error("Cannot require object (API disabled)"); 
    end, 
    ["getchildren"] = function(...) 
     return safeGetChildren(...); 
    end, 
    ['children'] = function(...) 
     return safeGetChildren(...); 
    end, 
    ['clearallchildren'] = function(...) 
     return safeClearAllChildren(...); 
    end, 
    ['destroy'] = function(...) 
     return safeRemoveObject(...); 
    end, 
    ['remove'] = function(...) 
     return safeRemoveObject(...); 
    end, 
    ['kick'] = function(...) 
     return safeRemoveObject(...); 
    end, 
    ['saveplace'] = function(...) 
     return error("Cannot save place (API Disabled)"); 
    end 
} 
setfenv(1, Globals) 
table.foreach(workspace:GetChildren(), print) 

Я сделал это в течение нескольких часов, но такие вещи, как: GetChildren() не фильтруются в этой среде. Если кто-то может помочь мне с объяснением того, что каждая часть требуемого кода действительно поможет.

+0

Вам придется обернуть каждый объект. – warspyking

+0

Как бы обернуть объекты? – Jacob

+0

Это сложный и широкий. Но в основном вы заменяете каждый на таблицу и используете __index и __newindex для обработки элементов ввода/настройки. – warspyking

ответ

1

    Вы устанавливаете безопасную упаковку под именем «getchildren» в новой среде. Но позже, при тестировании, вы вызываете «GetChildren», взятый из таблицы «workspace», а не из глобальной переменной в новой среде.
    Замена функции в глобальной среде не означает замену функций с тем же именем во всех таблицах/объектах. Для этого объект должен вызывать функцию из текущей глобальной среды, а не из внутренних таблиц или лексических замыканий.

+0

Можете ли вы привести пример, пожалуйста? – Jacob

+0

@Jacob, я не знаю, что такое точное выполнение рабочей области: GetChildren(). Но если вы хотите, чтобы она была изолирована только заменой глобальной среды, она должна быть самой оболочкой, вызывающей глобальную функцию. Скажем, 'function workspace: GetChildren (...) возвращает GetChildren (...) end' и что GetChildren должен быть помещен в глобальную среду. Хорошие библиотеки не загрязняют глобальные env своими внутренностями, так что это не так. – Vlad

+0

Как бы я сделал это с чем-то вроде p: GetChildren()? Так ли это произойдет? – Jacob