Вопрос или проблема
У меня есть скрипт оболочки, который я запускаю так
/var/www/test.sh 2015
или
/var/www/test.sh 2014
Когда этот скрипт выполняется, он на самом деле берет данные из freeradius и генерирует график на основе gnuplot для конкретного года в папке www, такой как
/var/www/output.jpg
Теперь я хочу сделать выпадающее меню php с годами, такими как 2015, 2014 и так далее, и когда пользователь выбирает любой год, он должен запустить скрипт с выбранным годом. Но как мне передать год в скрипт оболочки.
Пока что я пробовал это, но это не работает.
root@rm:/var/www# cat test5.php
<html>
<head><title>некоторый заголовок</title></head>
<body>
<form method="post" action="">
<input type="text" name="something" value="<?= isset($_POST['something']) ? htmlspecialchars($_POST['something']) : '' ?>" />
<input type="submit" name="submit" />
</form>
<?php
if(isset($_POST['submit'])) {
echo ($_POST['something']);
// Теперь скрипт должен быть выполнен с выбранным годом
$message=shell_exec("/var/www/test.sh $something");
// и после выполнения скрипта эта страница должна также открыть output.jpg в браузере
}
?>
</body>
<html>
root@rm:/var/www#
Выпадающее меню в html – это select.
<form method="post" action="">
<select name="something">
<option value="2014">год 2014</option>
<option value="2015">год 2015</option>
</select>
<input type="submit" name="submit" />
</form>
Затем после отправки
$something = $_POST["something"];
shell_exec("/var/www/test.sh $something");
Разрешение PHP выполнять команды опасно. Есть много вещей, которые могут помешать вам достичь вашей цели – SELinux, Apparmor, PHP, работающий в chroot, PHP, работающий в безопасном режиме, отключенные функции в PHP….
Чтобы убедиться, что код только делает то, что вы намерены, вам необходимо проверить ввод
// Поскольку значение, похоже, является числовым годом, давайте настаивать, что это число
$arg=(integer)$_POST['something'];
// в соответствующем диапазоне
if ((1970<$arg) && (3000>$arg)) {
// эта часть избыточна, учитывая проверки выше, но включена для полноты
$arg=escapeshellarg($arg);
$message=shell_exec("/var/www/test.sh $something");
}
Ваш код должен работать (хотя он очень небезопасен). Причина, по которой он не работал, должна быть в ваших логах.
Ответ или решение
Для создания выпадающего меню на PHP, которое будет запускать оболочную команду с переданным аргументом (годом), вам необходимо учесть несколько важных моментов. Рассмотрим шаг за шагом, как правильно реализовать этот функционал, обеспечив безопасность и работоспособность вашего скрипта.
Шаг 1: Создание HTML-формы с выпадающим меню
Первое, что нужно сделать, это создать HTML-форму, позволяющую пользователю выбрать год. Это можно сделать с помощью HTML-тега <select>
. Вот пример, как это можно сделать:
<html>
<head>
<title>Выбор года</title>
</head>
<body>
<form method="post" action="">
<select name="year">
<option value="2014">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
<option value="2017">2017</option>
<option value="2018">2018</option>
<option value="2019">2019</option>
<option value="2020">2020</option>
</select>
<input type="submit" name="submit" value="Генерировать график"/>
</form>
</body>
</html>
Шаг 2: Обработка данных из формы
После отправки формы, необходимо обработать данные в PHP и передать выбранный год в ваш скрипт. Важно также включить валидацию для исключения недопустимых значений.
<?php
if (isset($_POST['submit'])) {
$year = $_POST["year"];
// Проверяем, что выбранный год является числом и находится в допустимом диапазоне
if (is_numeric($year) && $year > 1970 && $year < 3000) {
// Экранируем аргумент для безопасного использования в командной строке
$year = escapeshellarg($year);
// Запускаем скрипт
$output = shell_exec("/var/www/test.sh $year");
// Убедимся, что скрипт завершился успешно
if ($output !== null) {
echo "График сгенерирован для года $year.<br>";
echo "<img src='/var/www/output.jpg' alt='График'>";
} else {
echo "Произошла ошибка при выполнении скрипта.";
}
} else {
echo "Выберите корректный год.";
}
}
?>
Шаг 3: Обеспечение безопасности
Запуск внешних команд через shell_exec
может быть рискованным. Поэтому важно применять следующие рекомендации:
-
Валидация ввода: Обязательно проверяйте, что полученные данные соответствуют ожидаемым. В приведённом выше примере скрипт проверяет, что введённый год является числом и находится в заданном диапазоне.
-
Экранирование аргументов: Использование
escapeshellarg
гарантирует, что переданное значение не содержит потенциально опасных символов. Это особенно актуально в случае, если в будущем появится возможность передавать вводимые пользователем значения. -
Логи: Включите логирование для отслеживания ошибок, возникающих при выполнении вашего скрипта. Это поможет отладить и выявить возможные проблемы.
Заключение
Теперь у вас есть все необходимые элементы для создания выпадающего меню на PHP, которое запускает оболочную команду с переданным аргументом. Правильная валидация и экранирование обеспечат безопасность вашего приложения. Следуя этим шагам, вы сможете легко расширять функционал в будущем, добавляя новые годы или дополнительные параметры по мере необходимости.