0Pricing
Lua Academy · درس

إنشاء بيئة معزولة مقيّدة

أنشئ قائمة سماح آمنة لـ _ENV ونفّذ الشيفرة غير الموثوقة باستخدام load()

إنشاء بيئة معزولة مقيّدة درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

الهدف

يتيح لك العزل المقيّد تشغيل شيفرة Lua غير موثوقة بأمان؛ إذ يمكنها إجراء العمليات الحسابية واستخدام السلاسل النصية والرياضيات، لكنها لا تستطيع الوصول إلى نظام الملفات أو نظام التشغيل أو الشبكة.

نهج القائمة البيضاء

أنشئ بيئة العزل من الصفر، ولا تُضمّن فيها إلا الدوال الآمنة والمفهومة جيدًا.

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

تشغيل الشيفرة في بيئة العزل

حمّل شيفرة المستخدم ونفّذها مع استخدام بيئة العزل بوصفها _ENV.

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

التقاط المخرجات

استبدل print بدالة مخصصة تُلحق المخرجات بمخزن مؤقت بدلًا من كتابتها إلى stdout.

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

إرجاع القيم

للسماح للشيفرة المعزولة بإرجاع قيم، استدعِ الوحدة البرمجية المترجمة كدالة والتقط قيم الإرجاع الخاصة بها.

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

حظر استغلالات الطرق الوصفية

يجب ألا تحصل الشيفرة المعزولة على مراجع إلى الجداول الوصفية أو إلى rawget/rawset، لتجنب تجاوز قيود الحقول.

تحديد طول السلاسل النصية

استبدل عمليات السلاسل النصية للحد من طول المخرجات ومنع هجمات حجب الخدمة الناتجة عن تخصيص سلاسل نصية ضخمة.

حدود الموارد باستخدام debug.sethook

أضف خطافًا لعدّ التعليمات لإنهاء الشيفرة التي تستمر في العمل بلا توقف.

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

اختبار بيئة العزل

اكتب اختبارات تحاول استخدام مسارات الهروب المعروفة: الوصول إلى _G، واستدعاء load، واستخدام debug، ثم تحقّق من فشلها جميعًا.

مسارات الهروب المعروفة

تشمل مسارات الهروب الشائعة: string.rep("x",2^30) (هجوم حجب خدمة للذاكرة)، و({}).__index على الكائنات القياسية، وdebug عبر metatable السلاسل النصية، وio عبر package.loaded.

سؤال حول بيئة العزل

لماذا لا تتضمن بيئة العزل load أو dofile؟

مراجعة: بناء بيئة عزل مقيّدة

لا تُدرج في جدول env المخصص إلا الدوال الآمنة. واستخدم load(code, name, "t", env). وأضف عدّ التعليمات باستخدام debug.sethook. واختبر مسارات الهروب. ولا تُضمّن مطلقًا load أو dofile أو debug أو الوصول إلى الجدول العام.

الأسئلة الشائعة

هل درس «إنشاء بيئة معزولة مقيّدة» مجاني؟

نعم — نص درس «إنشاء بيئة معزولة مقيّدة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «إنشاء بيئة معزولة مقيّدة»؟

أنشئ قائمة سماح آمنة لـ _ENV ونفّذ الشيفرة غير الموثوقة باستخدام load() تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «إنشاء بيئة معزولة مقيّدة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نموذج _ENV في Lua 5.2 وما بعده
  2. إنشاء بيئة معزولة مقيّدة
  3. منع الهروب من البيئة المعزولة
  4. حدود الموارد وأدوات القياس
← العودة إلى Lua Academy