0Pricing
Lua Academy · Ders

Kısıtlı Bir Korumalı Alan Oluşturma

Güvenli bir _ENV beyaz listesi oluşturun ve güvenilmeyen kodu load() ile çalıştırın.

Kısıtlı Bir Korumalı Alan Oluşturma, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.

Hedef

Kısıtlanmış bir korumalı alan, güvenilmeyen Lua kodunu güvenli biçimde çalıştırmanızı sağlar: Kod hesaplama yapabilir, dizeleri ve matematiği kullanabilir; ancak dosya sistemine, OS'ye veya ağa erişemez.

İzin Listesi Yaklaşımı

Korumalı alan ortamını sıfırdan oluşturun ve yalnızca güvenli, işleyişi iyi anlaşılan işlevleri ekleyin.

local function makeSandbox()
  return {
    print   = print,
    type    = type,
    tostring = tostring,
    tonumber = tonumber,
    pairs   = pairs,
    ipairs  = ipairs,
    next    = next,
    select  = select,
    unpack  = table.unpack,
    error   = error,
    pcall   = pcall,
    xpcall  = xpcall,
    math    = math,
    string  = { format=string.format, find=string.find,
                match=string.match, gmatch=string.gmatch,
                gsub=string.gsub, sub=string.sub,
                len=string.len, byte=string.byte, char=string.char },
    table   = { insert=table.insert, remove=table.remove,
                concat=table.concat, sort=table.sort,
                unpack=table.unpack, move=table.move },
  }
end

Kodu Korumalı Alanda Çalıştırma

Kullanıcı kodunu, korumalı alanı _ENV olarak kullanarak yükleyin ve çalıştırın.

local function runSandboxed(code, env)
  local fn, err = load(code, "user", "t", env)
  if not fn then return nil, err end
  return pcall(fn)
end
local env = makeSandbox()
local ok, err = runSandboxed("return 1+1", env)
print(ok, err)  -- true  2

Çıktıyı Yakalama

print işlevini, stdout'a yazmak yerine bir arabelleğe ekleme yapan özel bir işlevle değiştirin.

local output = {}
env.print = function(...)
  local parts = {}
  for i = 1, select("#", ...) do
    parts[i] = tostring(select(i, ...))
  end
  output[#output+1] = table.concat(parts, "\t")
end

Değerleri Döndürme

Korumalı alandaki kodun değer döndürmesine izin vermek için derlenmiş parçayı bir işlev olarak çağırın ve döndürdüğü değerleri yakalayın.

local fn = load("return math.sqrt(144)", "user", "t", env)
if fn then
  local ok, result = pcall(fn)
  print(ok, result)  -- true  12.0
end

Meta Yöntem İstismarlarını Engelleme

Korumalı alandaki kodun, alan kısıtlamalarını aşmasını önlemek için meta tablolara veya rawget/rawset işlevlerine başvuru almaması gerekir.

Dize Uzunluğunu Sınırlama

Çıktı uzunluğunu sınırlamak ve çok büyük dize ayırmaları yoluyla DoS saldırılarını önlemek için dize işlemlerini geçersiz kılın.

debug.sethook ile Kaynak Sınırlama

Kontrolden çıkan kodu sonlandırmak için bir yönerge sayacı kancası ekleyin.

local function sandboxWithLimit(code, env, maxOps)
  local ops = 0
  debug.sethook(function()
    ops = ops + 1
    if ops > maxOps then error("Instruction limit exceeded") end
  end, "", 100)
  local result = table.pack(runSandboxed(code, env))
  debug.sethook()
  return table.unpack(result, 1, result.n)
end

Korumalı Alanı Test Etme

Bilinen kaçış yollarını denemek için testler yazın: _G'ye erişme, load çağırma, debug kullanma; ardından bunların tümünün başarısız olduğunu doğrulayın.

Bilinen Kaçış Yolları

Yaygın kaçış yolları: string.rep("x",2^30) (bellek DoS'u), standart nesneler üzerinde ({}).__index, dize meta tablosu üzerinden debug, package.loaded üzerinden io.

Korumalı Alan Sorusu

Bir korumalı alan neden load veya dofile içermez?

Özet: Kısıtlanmış Korumalı Alan Oluşturma

Özel bir env tablosunda yalnızca güvenli işlevleri izin listesine ekleyin. load(code, name, "t", env) kullanın. debug.sethook ile yönerge sayımı ekleyin. Kaçış yollarını test edin. Hiçbir zaman load, dofile, debug veya genel tablo erişimini eklemeyin.

Sıkça Sorulan Sorular

“Kısıtlı Bir Korumalı Alan Oluşturma” dersi ücretsiz mi?

Evet — “Kısıtlı Bir Korumalı Alan Oluşturma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.

“Kısıtlı Bir Korumalı Alan Oluşturma” dersinde ne öğreneceğim?

Güvenli bir _ENV beyaz listesi oluşturun ve güvenilmeyen kodu load() ile çalıştırın. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Lua Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Kısıtlı Bir Korumalı Alan Oluşturma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Lua 5.2+'da _ENV Modeli
  2. Kısıtlı Bir Korumalı Alan Oluşturma
  3. Korumalı Alan Kaçışlarını Önleme
  4. Kaynak Sınırları ve Enstrümantasyon
← Lua Academy Sayfasına Dön