2010-10-14 19 views
20

¿Existe alguna función en PHP que pueda usar para detectar si la función exec está disponible o no?Compruebe si "exec" está deshabilitado

+0

¿por qué no intentar 'exec'? – Fosco

+0

Estoy construyendo una aplicación web, y en la página de instalación, quiero verificar los requisitos. No puedo encontrar nada sobre lo que arroja 'exec' ... así que quería comprobar aquí. : P – esqew

+0

'echo (int) function_exists ('exec');' –

Respuesta

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

EDIT: Se arregló la explosión según el comentario de Ziagl.

+1

Esto devuelve 'true' si' exec' está habilitado. –

+1

es por eso que la función se llama exec_enabled, simplemente no es exactamente lo que pidió. – UltimateBrent

+3

esto podría funcionar o no; desafortunadamente, en mi caso, encontré que 'ini_get()' estaba en la lista de funciones deshabilitadas junto con 'exec' y otras funciones del sistema de archivos; un escenario probable, dado que los proveedores de hosting podrían estar preocupados por exponer información en el archivo INI. –

2

Puede buscar en la configuración de ini disable_functions para la función exec().

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

simplemente para la corrección, tenga en cuenta que PHP Safe Mode pone algunas restricciones sobre la función también.

+0

Demasiado lento como veo :) – svens

+8

Esto devolverá la respuesta incorrecta si una función como 'shell_exec' se ha colocado en' disable_functions' pero 'exec' no. Es mejor usar explode o regex para asegurarse de que coincida con un completo nombre de función. – webbiedave

+0

Vaya, es correcto. – svens

1

También es necesario comprobar si safe_mode está activo como ejecutivo no está disponible si safe_mode está en

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; 

} 
13

La siguiente función es más robusto. Se trata del valor disabled_functions que tiene 0 o más espacios entre los nombres de función, comprueba la configuración de la lista negra del parche suhosin, cubre safe_mode y almacena la respuesta para referencia futura.

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; 
} 
+0

Para el registro, la edición que agregaba la lista negra suhosin fue por mí. Después de enviarla, me di cuenta de que mi sesión de autenticación estaba de alguna manera fuera de control. –

0

Existe una compilación de una línea de modo seguro, existe función y se desactivó el ejecutor utilizando algunas de las técnicas encontradas en varias publicaciones de SO.

Esto verificará que el ejecutor esté disponible y habilitado ANTES de intentar ejecutarlo. Si ejecuta exec() y la función no existe o está desactivada, se generará una advertencia. Dependiendo de la configuración del servidor que pueda mostrarse en el navegador, casi siempre escribirá una línea en un archivo de registro = golpe de rendimiento.

// 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'); } 
Cuestiones relacionadas