безопасность exec () - PullRequest
       1

безопасность exec ()

0 голосов
/ 08 июля 2011

Я пытаюсь добавить безопасность GET-запроса в функцию exec.

Если я удалю функцию escapeshellarg (), она будет работать нормально.Как решить эту проблему?

ajax_command.php

<?php
$command = escapeshellarg($_GET['command']);
exec("/usr/bin/php-cli " . $command);
?>

Предположим, $_GET['command'] значение run.php -n 3

Какую проверку безопасности я могутакже добавить?

Ответы [ 3 ]

6 голосов
/ 08 июля 2011

Вы хотите escapeshellcmd (экранировать целую команду или, в вашем случае, последовательность аргументов) вместо escapeshellarg (экранировать только один аргумент).

Обратите внимание, что, хотя вы приняли особые меры предосторожности, этот код позволяет любому в любом случае выполнять произвольные команды на вашем сервере, указав весь сценарий php в параметре -r.Обратите внимание, что php.ini не может использоваться для ограничения этого, поскольку его местоположение может быть перезаписано с помощью -c.Вкратце (и с очень небольшим запасом ошибок): Этот код создает серьезную уязвимость безопасности.

1 голос
/ 08 июля 2011

Сбой не будет, если нет файла с именем run.php -n 3. Вы не хотите экранировать ни одного аргумента, вы хотите экранировать имя файла и аргументы.

Это неправильный способ сделать это. Пусть один скрипт PHP выполнит все ваши команды, все, что указано в аргументах командной строки. Избегайте аргументов и беспокойтесь о безопасности внутри этого PHP-файла.

Или, еще лучше, общаться через канал.

1 голос
/ 08 июля 2011

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

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