Roy
Он создаст пустой объект с ключом name
Roy
В луа тоже самое?
Александр
Roy
Ну короче, хз я как объяснить, я хочу понять, есть ли расходы при проверки таблиц через квадратные скобки, допустим, если у нас есть 10000 наименований и каждое из них проверяется в if как на скрине выше, то будет ли каждая проверка при отсутствии в таблице данного имени создавать какие то объекты и кушать память?
Highly Likely
Roy
Другой вопрос, касаемо безопасности
Roy
Roy
HandleChat вызывается когда игроки пишут в чат сообщения
Roy
Тут уязвимость в том, что если игрок пошлет в чат %s %d или другие спец символы, то вылетит исключение
Snusmumriken
Правильно
Roy
Правильно
Да, это поведение логично, но вот это
print(string.format("Hello %s, %s", "world", message))
Roy
С хера ли это тоже уязвимо?
Roy
Ведь message теперь используется как аргумент и выводится как строка
Snusmumriken
В сишке та же фигня.
Roy
а форматирующей строкой является fmt
Roy
точнее первый аргумент
Snusmumriken
В первой строке у тебя шаблон.
Snusmumriken
Выдавать юзерам шаблон на редактирование — это странно )
Roy
Не понял, в смысле шаблон
Snusmumriken
В прямом, шаблон куда надо набить аргументы.
Snusmumriken
string.format(template_str, arg1, arg2, arg3, ...)
Highly Likely
Или типа того
Roy
Ну короче, как это исправить?
Roy
Точнее, как форматировать строки пользовательского ввода?
Aydar
Snusmumriken
function HandleChat(role, message)
("Hello %s %s"):format("world", message)
end
Roy
Snusmumriken
Snusmumriken
объясните магию?
Шаблон использован по назначению, то что забил юзер, какие бы символы там ни были, является контентом забитым в шаблон.
Snusmumriken
А вот повторный format не стоит делать без экранирования, мало ли что юзер туда забил ))
Snusmumriken
Тем что ты делаешь замену %s на %s, ты не знаешь что именно в шаблоне, потому что это то что типа прислал юзер.
Highly Likely
function HandleChat(tole, message)
local l = loadstring(‘print(’ .. message .. ‘)’)
l()
end
Highly Likely
Snusmumriken
Карочи. Просто берём и запрещаем в пользовательском тексте проценты и слеши, решаем проблему отпиливанием лишнего ))
function HandleChat(role, message)
message = message:gsub("[%%\\]", "")
("Hello %s" .. message):format("world")
end
mva
Roy
Snusmumriken
Ну вдруг ОЧЕНЬ хочется? ))
mva
лучше его вторым аргументом передавать
Highly Likely
Roy
а в моем примере все было шаблоном?
Daniil
Roy
Highly Likely
Но мой вариант всё ещё намного более гибкий ))
Roy
То есть, воспринимать все что передает юзер как строку
mva
Highly Likely
Snusmumriken
Для того кто хочет хакнуть весь серв ))0
Highly Likely
Грузим эту функцию отдельным файлом через лоадфайл с отдельным ENV
Snusmumriken
Да зачем в сэндбокс, когда можно сразу в os.execute("lua -e " .. message) от рута? ))0
Highly Likely
)0)
Snusmumriken
Карочи, теперь учимся делать шаблоны.
У луа есть прекрасная функция gsub. Она умеет работать с табличками и функциями.
Snusmumriken
mva
Snusmumriken
string.format это замена.
mva
но использование gsub вместо него - упоризм
mva
:)
Snusmumriken
А вот и нет.
Snusmumriken
Посмотри пример на который я сослался.
Snusmumriken
Скопипащу.
function t(tmpl, tbl)
local function replace(c)
return tbl[c] or '{' .. c .. '}'
end
return tmpl:gsub('{(.-)}', replace)
end
local tmpl = "Hello {bla}!"
local str = t(tmpl, {bla = 'World'})
-->"Hello World!"
И вот эта штука не падает при отсутствии полей.
mva
🤷♂️
mva
ну, что-то в этом есть
mva
только мне как-то всегда неуютно от конкатенации :)
Snusmumriken
В этом есть нормальные шаблоны с именованными полями.
Snusmumriken
И конкатенация тут вызывается только и исключительно если данное поле не найдено в тексте, но присутствует в таблице для шаблона.
mva
format лучше конкатенации тем, что в при конкатенации не-строки будет исключение, а format - отработает
mva
впрочем, можно просто tostring() применять
Snusmumriken
Конкатенация тоже упадёт при конкатенации не строк (если это не строки и числа, на что пофигу).
mva
Snusmumriken
Карочи, берёшь и кладёшь болт. Это уже серверный код, если тут автор серверной фигни прислал не строку — это его проблемы.
На юзерский же ввод автоматом становится пофигу.
Roy
Короче, это я тупанул оказывается