web-dev-qa-db-ja.com

「exec」が無効になっているかどうかを確認します

PHPに、exec関数が使用可能かどうかを検出するために使用できる関数はありますか?

21
esqew
<?php
function exec_enabled() {
  $disabled = explode(',', ini_get('disable_functions'));
  return !in_array('exec', $disabled);
}
?>

編集:Ziaglのコメントに従って爆発を修正しました。

40
Brent

次の関数はより堅牢です。関数名の間に0個以上のスペースがあるdisabled_functions値を処理し、suhosinパッチのブラックリスト設定をチェックし、safe_modeをカバーし、将来の参照のために回答を格納します。

function is_exec_available() {
    static $available;

    if (!isset($available)) {
        $available = true;
        if (ini_get('safe_mode')) {
            $available = false;
        } else {
            $d = ini_get('disable_functions');
            $s = ini_get('suhosin.executor.func.blacklist');
            if ("$d$s") {
                $array = preg_split('/,\s*/', "$d,$s");
                if (in_array('exec', $array)) {
                    $available = false;
                }
            }
        }
    }

    return $available;
}
13

Ini設定_disable_functions_でexec()関数を検索できます。

_if( false !== strpos(ini_get("disable_functions"), "exec") ) {
 // exec() is disabled
_

完全を期すために、PHP セーフモード は関数にもいくつかの制限を課していることに注意してください。

2
svens

また、safe_modeがオンの場合、execは使用できないため、safe_modeがアクティブかどうかを確認する必要があります。

function is_exec_available() {

    // Are we in Safe Mode
    if ( $safe_mode = ini_get( 'safe_mode' ) && strtolower( $safe_mode ) != 'off' )
        return false;

    // Is Shell_exec disabled?
    if ( in_array( 'exec', array_map( 'trim', explode( ',', ini_get( 'disable_functions' ) ) ) ) )
        return false;

    return true;

}
1
Tom Willmot

セーフモード、関数が存在し、さまざまなSO投稿)にあるテクニックのいくつかを使用してexecを無効にした1行のコンパイル。

これにより、execを実行する前に、execが使用可能で有効になっていることが確認されます。 exec()を実行し、関数が存在しないか無効になっている場合、警告が生成されます。ブラウザにレンダリングされる可能性があり、ほとんどの場合、ログファイルに行を書き込むサーバー設定に応じて=パフォーマンスヒット。

// Exec function exists.
// Exec is not disabled.
// Safe Mode is not on.
$exec_enabled =
     function_exists('exec')                                            &&
     !in_array('exec', array_map('trim',explode(', ', ini_get('disable_functions'))))     &&
              !(strtolower( ini_get( 'safe_mode' ) ) != 'off')
     ;


if ($exec_enabled) { exec('blah'); }
0
Lance Cleveland