S
_G = {}
и _ENV = {}
не работаетSize: a a a
S
_G = {}
и _ENV = {}
не работаетAB
S
S
&sandboxcode = <<<EOD
...
do
local _ENV = userenv
loadstring[====[$usercode]====]()
end
EOD;
Потом эвалишь это дело.AB
&sandboxcode = <<<EOD
...
do
local _ENV = userenv
loadstring[====[$usercode]====]()
end
EOD;
Потом эвалишь это дело.S
usercode = replace(usercode, "\r?\nEOD", "\r\n EOD")
, чтобы не допустить инъекций. Простого пробела достаточно, пых уже не сломается и даст по жопе нехорошему человеку.AB
usercode = replace(usercode, "\r?\nEOD", "\r\n EOD")
, чтобы не допустить инъекций. Простого пробела достаточно, пых уже не сломается и даст по жопе нехорошему человеку.S
sandboxcode
где внутри $usercode
будет текст "EOD; db("DROP TABLE Students;");
" что оно скажет?AB
sandboxcode
где внутри $usercode
будет текст "EOD; db("DROP TABLE Students;");
" что оно скажет?S
AB
local userenv = {
print = print,
table = {
concat = table.concat,
insert = table.insert,
...
},
string = string
os = { -- допустим, разрешаем часть os-либы
time = os.time,
},
...
}2. Потом делаешь особое пространство, в котором будет пользовательский код:
-- делаем похожим на _G
userenv._G = userenv
do -- скоуп для юзерспейса
local _ENV = userenv -- переключаешь _ENV для этого скоупа
loadstring(usercode)() -- исполняем код
end
-- на этой точке _G уже обратно то _G которое было ранее. Все пользовательские объявления глобалов и переопределения не играют роли, ибо остались в userenv.
S
local _ENV = {}
Она локальная. Уже никуда не нагадить.S
AB
local _ENV = {}
Она локальная. Уже никуда не нагадить.S
AB
АК
&sandboxcode = <<<EOD
...
do
local _ENV = userenv
loadstring[====[$usercode]====]()
end
EOD;
Потом эвалишь это дело.$usercode = "]==== .. ' end ; print('injected') do ' .. ====["
AB
loadstring[====[$usercode]====]
loadstring($usercode)
АК
loadstring[====[$usercode]====]
loadstring($usercode)
AY
loadstring[====[$usercode]====]
loadstring($usercode)
Lua->call("loadstring",$usercode);