How would I sandbox methods like :ClearAllChildren? I am currently writing a sandbox for fun.

Here is what I have so far:

local global_env = getfenv(0)

local faked_functions = {
    ClearAllChildren = (function(...)
      return error('this has been blocked!',0)
    end)
}

local function wrap(...)
	for _,v in next,{...} do
		if pcall(game.IsA,v,"") then
			local proxy = newproxy(true)
			local proxy_meta = getmetatable(proxy)
			
			proxy_meta.__index = (function(t,k)
				local obj_k = v[k]
				
				if type(obj_k) == "function" then
					if faked_functions[obj_k] then
						return faked_functions[obj_k]
					else
						return function(self,...)
							print(self)
							return wrap(obj_k(v,...))
						end
					end
				else
					return wrap(obj_k)
				end
			end)
			
			proxy_meta.__newindex = (function(t,k,r)
				v[k] = r
			end)
			
			proxy_meta.__tostring = (function()
				return tostring(v)
			end)
			
			proxy_meta.__metatable = "This metatable is locked!"
			
			return proxy
		elseif type(v) == "function" then
			if faked_functions[v] then
				return faked_functions[v]
			else
				return v
			end
		end
	end
end

setmetatable(sandbox,{ --hax
	__index = (function(t,i)
		return wrap(global_env[i]) -- lele
	end),
	__metatable = "This metatable is locked!"
})

return function()
	setfenv(2,sandbox)
	setfenv(1,sandbox)
	setfenv(0,sandbox)
end

I am very new to sandboxing if you can tell. Help would be appreciative!

1 comment

0

No no no. You're only returning 1 thing per wrap (bad), and you're assuming member functions are methods (Technically wrong). https://github.com/CrescentCode/ValkyrieFramework/blob/bleeding-edge/Shared/Core/BaseLib.mod.lua