LINUX.ORG.RU

История изменений

Исправление shdown, (текущая версия) :

Экранирование от языка не зависит.

Конечно зависит. Для Си и для шелла экранировать нужно по-разному.

И у меня всё экранировано

Ничего у тебя не экранируется. Во-первых, ты не экранируешь знак доллара, backtick, backslash, переводы строки, которые интерпретируются в двойных кавычках. Во-вторых, ты явно не понимаешь, как работают одинарные кавычки в shell.

function change(str)
    str = str:gsub('%"','\\"');
    str = str:gsub("%'","\\'");
    return str;
end

title = '$(touch /tmp/pwned)'
arg = {'arg1', 'arg2'}

title = change(title)
os.execute('notify-send -u normal Воспроизводится "'..title..'\n'..arg[2]..' "');

Этот код исполнит код из title и создаст файл /tmp/pwned.


Не говоря уже о том, что код абсолютно угрёбищен во всех остальных отношениях. Вот ты можешь объяснить, зачем ты используешь ; в Lua? Это даже не JavaScript, где есть automatic semicolon insertion и без них в некоторых случаях может что-то не то выйти. Почему if (something) then (зачем скобки)?

Исправление shdown, :

Экранирование от языка не зависит.

Конечно зависит. Для Си и для шелла экранировать нужно по-разному.

И у меня всё экранировано

Ничего у тебя не экранируется. Во-первых, ты не экранируешь знак доллара, backtick, backslash, переводы строки, которые интерпретируются в двойных кавычках. Во-вторых, ты явно не понимаешь, как работают одинарные кавычки в shell.

function change(str)
    str = str:gsub('%"','\\"');
    str = str:gsub("%'","\\'");
    return str;
end

title = '$(touch /tmp/pwned)'
arg = {'arg1', 'arg2'}

title = change(title)
os.execute('notify-send -u normal Воспроизводится "'..title..'\n'..arg[2]..' "');

Этот код исполнит код из title и создаст файл /tmp/pwned.


Не говоря уже о том, что код абсолютно угрёбищен во всех остальных отношениях. Вот ты можешь объяснить, зачем ты используешь ; в Lua? Это даже не JavaScript, где есть automatic semicolon insertion и без них в некоторых случаях может что-то не то выйти.

Исходная версия shdown, :

Экранирование от языка не зависит.

Конечно зависит. Для Си и для шелла экранировать нужно по-разному.

И у меня всё экранировано

Ничего у тебя не экранируется. Во-первых, ты не экранируешь знак доллара, backtick, backslash, переводы строки, которые интерпретируются в двойных кавычках. Во-вторых, ты явно не понимаешь, как работают одинарные кавычки в shell.

function change(str)
    str = str:gsub('%"','\\"');
    str = str:gsub("%'","\\'");
    return str;
end

title = '$(touch /tmp/pwned)'
arg = {'arg1', 'arg2'}

title = change(title)
os.execute('notify-send -u normal Воспроизводится "'..title..'\n'..arg[2]..' "');

Этот код исполнит код из title и создаст файл /tmp/pwned.