Использование $ _GET в функции system () - контрольный вопрос - PullRequest
1 голос
/ 08 мая 2020

Допустим, у нас есть следующий код:

<?php
$str = addslashes($_GET['str']);
$cmd = 'sometool "'.$str.'"';
system($cmd);
?>

Это безопасно? Могу ли я как-нибудь избежать двойных кавычек? Операционная система в linux.

Чисто теоретическое рассмотрение. Я не использую это в своем коде;)

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Это небезопасно. Вы по-прежнему можете передавать некоторые аргументы, которые будут вредоносными, т.е. выполнять другие файлы в системе.

$var = '$(sh file.sh)';
$str = addslashes($var);
$cmd = 'sometool "'.$str.'"';
system($cmd);

Вы должны использовать метод escapeshellarg для экранирования аргументов оболочки.

$str = escapeshellarg($_GET['str']);
$cmd = 'sometool ' . $str;
system($cmd);

Обратите внимание, что вы должны использовать аргумент $str как есть, и что это будет единственный аргумент. Вы не должны заключать его в кавычки ' или двойные кавычки "

2 голосов
/ 08 мая 2020

Определенно небезопасно, как есть,

Как и любой пользовательский ввод, вам придется не только избегать кавычек, но также проверять соответствие отправляемых данных и строго соблюдать их.

Например: если команда sometool ожидает путь, вы должны убедиться, что вводимый пользователем путь является допустимым. Если путь должен находиться в запрещенном месте, вы должны проверить это ограничение.

Предполагая, что ваша "str" ​​должна быть допустимой строкой, вы можете начать с функции ввода фильтра.

https://www.php.net/manual/en/function.filter-input.php

Обязательно используйте соответствующие фильтры (для кавычек, кодировки и т. Д. c.): https://www.php.net/manual/en/filter.filters.php .

Здесь невозможно обойти экранирование.

Это каким-то образом обеспечивает соответствие данных, но все же вы должны быть уверены, что команда "sometool" на саму себя не повлияют какие-либо допустимые строковые символы или синтаксис, что делает его небезопасным в использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...