CentOS 6 - Відправте визначену користувачем команду з PHP


0

У мене є веб-панель управління, і мені потрібно, щоб мої користувачі могли надсилати команди для їх застосування.

У мене схожа проблема з ін'єкцією SQL.

$user_input='good command';
shell_exec('tmux send-keys session1:0 "'.$user_input.'" C-m');

Це надішле команду tmux send-keys session1:0 "good command" C-m, що добре.

Але користувач також може ввести якийсь інший.

$user_input='good command" C-m | rm / | tmux send-keys sessionUserMayNotDoAnyThingIn:0 "some command';
shell_exec('tmux send-keys session1:0 "'.$user_input.'" C-m');

Це надішле команду tmux send-keys session1:0 "good command" C-m | rm / | tmux send-keys sessionUseerMayNotDoAnyThingIn:0 "some command" C-m

(Це надішле 3 команди)

tmux send-keys session1:0 "good command" C-m
rm /
tmux send-keys sessionUseerMayNotDoAnyThingIn:0 "some command" C-m

То яке рішення для цього?


Жодному користувальницькому вкладу не можна довіряти.
Еван Дарвін

@EvanDarwin Чи стане можливо щось подібне \ n перед ""
користувачем3524823

Звичайно, у такому випадку це стає нескінченною грою на додавання регулярних виразів та замін. Однак я хотів би вам перевірити docker.io, який не працює в tmux сесіях, але вони отримують власну "VM" з низькою пам'яттю.
Еван Дарвін

Докер @EvanDarwin не відповідав би моїм потребам :( Але чи було б це безпечно, якби мені це сподобалосьshell_exec('tmux send-keys session1:0 \n"'.$user_input.'\n" C-m');
user3524823

Відповіді:


0

Ви можете використовувати escapeshellcmd()для втечі команди (перший маркер) та escapeshellarg()для аргументів уникнення аргументів.


Просто для впевненості. Чи повністю захищений? shell_exec("tmux send-keys -t session:0 ".escapeshellarg($user_input)." C-m");
користувач3524823

Якщо ви повинні дозволити лише команди (без аргументів), ви повинні використовувати тільки escapeshellcmd($user_input), але слід перевірити, чи це раніше дозволена команда.
denisvm

Якщо ви хочете , щоб аргументи, ви повинні спочатку відокремити команду від аргументів і розмітити рядок джерела , використовуючи прогалини, пройти перший токен escapeshellcmd()і escapeshellarg()з кожним аргументом, то ви переконаєтеся , що рядок «; гт -rf /» буде переданий в якості лише один аргумент замість цього дозволяє йому запускатись як команда.
denisvm

Я не на 100% впевнений, що ти маєш на увазі. Чи не shell_exec ("tmux send-keys -t сесія: 0" .escapeshellarg ($ user_input). "См"); досить добре? Якщо ви не можете, то можете зробити приклад, як це зробити?
користувач3524823

Вам потрібно дозволити користувачеві надсилати лише команди (наприклад whoami) або команди з аргументами (наприклад ls -l /tmp)?
denisvm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.