Roy
Он создаст пустой объект с ключом name
Roy
В луа тоже самое?
Roy
Ну короче, хз я как объяснить, я хочу понять, есть ли расходы при проверки таблиц через квадратные скобки, допустим, если у нас есть 10000 наименований и каждое из них проверяется в if как на скрине выше, то будет ли каждая проверка при отсутствии в таблице данного имени создавать какие то объекты и кушать память?
Roy
если элемента с ключом нет, просто вернётся nil
То есть, никакие объекты в lua стеке не будут создаваться
Roy
Другой вопрос, касаемо безопасности
Snusmumriken
То есть, никакие объекты в lua стеке не будут создаваться
Новые объекты создаются при использовании оператора "=". Особенно a = {} и b = function() end а так же c = "foo" .. "bar".
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
Выдавать юзерам шаблон на редактирование — это странно )
Я думаю подразумевается что-то типа UserName said “blablabl” when EVENT
Highly Likely
Или типа того
Roy
Ну короче, как это исправить?
Daniil
Ну короче, как это исправить?
..message за скобки вынеси справа и будет ок. :)
Roy
Точнее, как форматировать строки пользовательского ввода?
Snusmumriken
function HandleChat(role, message) ("Hello %s %s"):format("world", message) end
Snusmumriken
Все же работает
Это костыль
Snusmumriken
объясните магию?
Шаблон использован по назначению, то что забил юзер, какие бы символы там ни были, является контентом забитым в шаблон.
Snusmumriken
А вот повторный format не стоит делать без экранирования, мало ли что юзер туда забил ))
Snusmumriken
Тем что ты делаешь замену %s на %s, ты не знаешь что именно в шаблоне, потому что это то что типа прислал юзер.
Highly Likely
function HandleChat(tole, message) local l = loadstring(‘print(’ .. message .. ‘)’) l() end
Daniil
Точнее, как форматировать строки пользовательского ввода?
Если прям хочется отформатировать приходящий контент, то либо свой format написать, либо, как костыльный варик, завернуть в pcall и всегда забирать как готовую строку.
Snusmumriken
Карочи. Просто берём и запрещаем в пользовательском тексте проценты и слеши, решаем проблему отпиливанием лишнего )) function HandleChat(role, message) message = message:gsub("[%%\\]", "") ("Hello %s" .. message):format("world") end
Snusmumriken
Ну вдруг ОЧЕНЬ хочется? ))
mva
лучше его вторым аргументом передавать
Roy
а в моем примере все было шаблоном?
Highly Likely
Но мой вариант всё ещё намного более гибкий ))
Roy
То есть, воспринимать все что передает юзер как строку
Snusmumriken
function HandleChat(role, message) ("Hello %s %s"):format("world", message) end
Ну кароч, берёшь и сначала чистишь пользовательский ввод от символов, которые твоя система не может отобразить (эмодзи, например, если нет шрифта), потом чистишь управляющие символы.
Daniil
Нет, как раз не применять
А, ну тогда format(bla-bla)..message
Snusmumriken
Но мой вариант всё ещё намного более гибкий ))
Твой вариант это писос из категории вредных советов ))0
Snusmumriken
Для того кто хочет хакнуть весь серв ))0
Highly Likely
Для того кто хочет хакнуть весь серв ))0
Так в сэндбокс эту функцию, в сэндбокс!!!
Highly Likely
Грузим эту функцию отдельным файлом через лоадфайл с отдельным ENV
Snusmumriken
Да зачем в сэндбокс, когда можно сразу в os.execute("lua -e " .. message) от рута? ))0
Highly Likely
)0)
Snusmumriken
Карочи, теперь учимся делать шаблоны. У луа есть прекрасная функция gsub. Она умеет работать с табличками и функциями.
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
Конкатенация тоже упадёт при конкатенации не строк (если это не строки и числа, на что пофигу).
Snusmumriken
Карочи, берёшь и кладёшь болт. Это уже серверный код, если тут автор серверной фигни прислал не строку — это его проблемы. На юзерский же ввод автоматом становится пофигу.
Snusmumriken
только мне как-то всегда неуютно от конкатенации :)
А вот это звучит как зайчатки преждевременных эяптимизаций ))
Roy
Короче, это я тупанул оказывается