Как проверить, разрешена ли функция PHP system ()?и не выключен по соображениям безопасности - PullRequest
5 голосов
/ 27 октября 2010

Я хотел бы знать, как проверить, разрешены ли system () или exec () на сервере. Я получаю эту ошибку "Предупреждение: exec () отключен по соображениям безопасности в ..."

Я понимаю, что функция safe_mode устарела в версии php, которую выполняет мой провайдер (5.3.3), поэтому я не могу использовать проверку get_ini ('safe_mode').

Что еще делать?

Я использую это для резервного копирования. если провайдер разрешает систему, скрипт создает файл tar и отправляет его мне по почте при каждом входе пользователя в систему.

Заранее спасибо.

Ответы [ 4 ]

10 голосов
/ 27 октября 2010

Ну, есть только два способа, которыми его можно отключить: safe_mode или disable_functions.

Таким образом, вы можете сделать проверку как:

function isAvailable($func) {
    if (ini_get('safe_mode')) return false;
    $disabled = ini_get('disable_functions');
    if ($disabled) {
        $disabled = explode(',', $disabled);
        $disabled = array_map('trim', $disabled);
        return !in_array($func, $disabled);
    }
    return true;
}

Да, и function_exists должен возвращать true, поскольку это основная функция (в противном случае вы могли бы подделать базовую функцию и вызвать реальный хаос на хосте) ... Следовательно, is_callable также должен вернуть true(так как функция существует).Таким образом, единственный способ сказать, это проверить настройки ini или вызвать его ...

Редактировать: Еще одна вещь, которую нужно отметить, есть несколько способов выполнения оболочкикоманды.Выезд:

3 голосов
/ 27 октября 2010

Тестирование отключенных функций и наличие безопасного режима, как показывает @ircmaxell, возможно, самый простой способ.

Если вы хотите на 1000% надежно выяснить, возможно ли выполнение системных команд - могут быть патчи безопасности, такие как Suhosin, которые блокируют это на другом уровне - попробуйте exec() внешнюю команду, которая должна работать на всех системах (включая Windows), и вряд ли потерпит неудачу, даже если права пользователя очень ограничены.

Say

cd .   

это должно работать (то есть не возвращать false и возвращать код уровня ошибки 0) по крайней мере во всех версиях Linux, Windows и Unix, включая OS X.

0 голосов
/ 27 октября 2010

exec () возвращает false в случае сбоя или строку сообщения об успешном завершении в случае успеха ... поэтому должно работать следующее:

if(!exec('cd .')){ die('ERROR: Exec is not available!!!'); }      

Замена для 'cd.'может быть любой функцией, которую вы знаете, чтобы работать в системе.

0 голосов
/ 27 октября 2010

function_exists () не работает в этой ситуации?

http://fr.php.net/function_exists

...