PHPに、exec
関数が使用可能かどうかを検出するために使用できる関数はありますか?
<?php
function exec_enabled() {
$disabled = explode(',', ini_get('disable_functions'));
return !in_array('exec', $disabled);
}
?>
編集:Ziaglのコメントに従って爆発を修正しました。
次の関数はより堅牢です。関数名の間に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;
}
Ini設定_disable_functions
_でexec()
関数を検索できます。
_if( false !== strpos(ini_get("disable_functions"), "exec") ) {
// exec() is disabled
_
完全を期すために、PHP セーフモード は関数にもいくつかの制限を課していることに注意してください。
また、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;
}
セーフモード、関数が存在し、さまざまな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'); }