php выпадающее меню для выполнения скрипта с аргументом

Вопрос или проблема

У меня есть скрипт оболочки, который я запускаю так

/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 может быть рискованным. Поэтому важно применять следующие рекомендации:

  1. Валидация ввода: Обязательно проверяйте, что полученные данные соответствуют ожидаемым. В приведённом выше примере скрипт проверяет, что введённый год является числом и находится в заданном диапазоне.

  2. Экранирование аргументов: Использование escapeshellarg гарантирует, что переданное значение не содержит потенциально опасных символов. Это особенно актуально в случае, если в будущем появится возможность передавать вводимые пользователем значения.

  3. Логи: Включите логирование для отслеживания ошибок, возникающих при выполнении вашего скрипта. Это поможет отладить и выявить возможные проблемы.

Заключение

Теперь у вас есть все необходимые элементы для создания выпадающего меню на PHP, которое запускает оболочную команду с переданным аргументом. Правильная валидация и экранирование обеспечат безопасность вашего приложения. Следуя этим шагам, вы сможете легко расширять функционал в будущем, добавляя новые годы или дополнительные параметры по мере необходимости.

Оцените материал
Добавить комментарий

Капча загружается...