Lua Academy · Aula

Execução isolada de plugins

Execute plugins em ambientes restritos usando setfenv/load com _ENV personalizado.

Aula 3 de 413 etapas

Execução isolada de plugins é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

Por que isolar extensões?

Código de extensões não confiáveis pode chamar funções perigosas (os.execute, io.open, load) ou acessar o estado privado do aplicativo. Um ambiente isolado restringe o que o código pode fazer.

_ENV personalizado no Lua 5.2+

No Lua 5.2+, o ambiente global de cada bloco é _ENV. Carregue um bloco com um _ENV restrito para limitar seu acesso.

local function sandbox(code, env)
  local chunk, err = load(code, "sandbox", "t", env)
  if not chunk then return nil, err end
  return pcall(chunk)
end

Criando um ambiente seguro

Crie um ambiente com uma lista de permissões que contenha apenas funções seguras da biblioteca padrão.

local safeEnv = {
  print  = print,
  type   = type,
  pairs  = pairs,
  ipairs = ipairs,
  tostring = tostring,
  tonumber = tonumber,
  table  = {insert=table.insert, concat=table.concat, sort=table.sort},
  string = {format=string.format, find=string.find, match=string.match},
  math   = math,
}

Bloqueando funções perigosas

Exclua explicitamente: os, io, load, loadfile, dofile, require, debug. Não as copie para safeEnv.

Carregando arquivos em ambiente isolado

Carregue um arquivo de extensão e execute-o no ambiente isolado.

local function sandboxFile(path, env)
  local chunk, err = loadfile(path, "t", env)
  if not chunk then return nil, err end
  local ok, result = pcall(chunk)
  if not ok then return nil, result end
  return result
end

Fornecendo acesso à API

Dê às extensões isoladas acesso a uma API restrita do aplicativo, incluindo no ambiente apenas métodos seguros.

local pluginEnv = setmetatable({
  app = {
    on       = function(e,f) app:on(e,f) end,
    emit     = function(e,...) app:emit(e,...) end,
    log      = function(msg) app:log(msg) end,
  },
}, {__index = safeEnv})

Impedindo acesso a _ENV

Não inclua _G, _ENV ou load no ambiente isolado. Eles permitem escapar do ambiente restrito.

Contagem de instruções com debug.sethook

Evite laços infinitos contando as instruções executadas e interrompendo a execução após um limite.

local function withLimit(fn, maxInstructions)
  local count = 0
  debug.sethook(function()
    count = count + 1
    if count > maxInstructions then
      error("Instruction limit exceeded")
    end
  end, "", 100)
  local ok, err = pcall(fn)
  debug.sethook()
  return ok, err
end

Limite de memória

Combine a contagem de instruções com verificações periódicas de collectgarbage("count") para interromper a execução se o uso de memória exceder um limite.

Captura de saída

Substitua print no ambiente isolado por uma função personalizada que capture a saída em um buffer em vez de escrevê-la em stdout.

Fugas do ambiente isolado a evitar

Vetores de fuga conhecidos: debug.getupvalue, getmetatable em objetos padrão e coroutine.wrap com código perigoso. Revise cuidadosamente todas as entradas do ambiente.

Pergunta sobre ambientes isolados

Como impedir que o código isolado chame os.execute?

Recapitulação: isolamento de extensões

Crie um _ENV com uma lista de permissões que contenha apenas APIs seguras. Carregue o código da extensão com load(code, name, "t", safeEnv). Use a contagem de instruções para evitar laços infinitos. Nunca inclua load, debug ou _G no ambiente isolado.

Grátis para começar

Aprenda Lua com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
40
Aulas
159

Perguntas Frequentes

A aula “Execução isolada de plugins” é grátis?

Sim — o texto completo de “Execução isolada de plugins” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “Execução isolada de plugins”?

Execute plugins em ambientes restritos usando setfenv/load com _ENV personalizado. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Execução isolada de plugins”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Descoberta e carregamento de plugins
  2. API de plugins e sistema de hooks
  3. Execução isolada de plugins
  4. Versionamento e gerenciamento de dependências
← Voltar para Lua Academy