¿Es posible deshabilitar todas las funciones de PHP que no se usan en mi aplicación?

10

Quiero asegurar mi instalación de PHP. Puedo deshabilitar algunas funciones, como system() , exec() , etc. usando disable_functions en php.ini. Pero puedo olvidar desactivar algunas funciones peligrosas. ¿Es posible desactivar todas las funciones, excluyendo las que ya se utilizan en mi aplicación?

    
pregunta checkbox 05.05.2016 - 09:28
fuente

2 respuestas

3

Para engancharse en el comentario de @ UTF-8 , usando PHP_Parser , puede generar bastante fácilmente una lista de funciones PHP predeterminadas que su aplicación no usa realmente y que luego puede almacenar en el Opción de configuración disabled_functions :

<?php

require 'vendor/autoload.php';

use PhpParser\Node;
use PhpParser\NodeTraverser;
use PhpParser\ParserFactory;
use PhpParser\NodeVisitorAbstract;
use PhpParser\PrettyPrinter\Standard;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\Function_;


class Collector extends NodeVisitorAbstract
{
    public $functions = [];
    public function leaveNode(Node $node)
    {
        if ($node instanceof PhpParser\Node\Expr\FuncCall)
            $this->functions[] = (string) $node->name;
    }
}

$sourcePath = __DIR__ . '/test/';

$files = new \CallbackFilterIterator(
    new \RecursiveIteratorIterator(
        new \RecursiveDirectoryIterator($sourcePath),
            \RecursiveIteratorIterator::SELF_FIRST
    ),
    function($current, $key, $iterator) { return preg_match('~.php$~i', (string) $current) > 0; }
);

$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor($visitor = new Collector());
$parserFactory = new ParserFactory();
$parser        = $parserFactory->create(ParserFactory::PREFER_PHP7);

foreach ($files as $file) 
{


    $stmts  = $parser->parse(file_get_contents((string) $file));
    $nodeTraverser->traverse($stmts);
}

$defined_functions = get_defined_functions();

$blocked_functions = array_diff($defined_functions['internal'], $visitor->functions);

echo 'disabled_functions = "', join(',', $blocked_functions), '"', PHP_EOL;

Se puede crear algo similar para disable_classes , solo busque PhpParser\Node\Expr\New_ en su lugar.

Algunas cosas a considerar:

  • Su primer paso debería ser reducir la cantidad de módulos que se está cargando su instancia de PHP.
  • Va a ser molesto manejar esto.
  • Vas a tener un mal momento si usas algo dinámicamente.
  • Tener una configuración disable_functions grande puede tener un impacto en el rendimiento. Es posible que desee considerar el uso de la funcionalidad de la lista blanca de Suhosin como lo sugiere enlace .
respondido por el NSSec 06.05.2016 - 12:15
fuente
2

Puede usar la extensión Suhosin que le permite agregar a la lista blanca las funciones que desea permitir.

Consulte la opción suhosin.executor.func.whitelist settings de Suhosin.

  

suhosin.executor.func.whitelist

     

Lista blanca separada por comas de funciones que se pueden llamar. Si la lista blanca está vacía, se evalúa la lista negra, de lo contrario, si se llama a una función que no está en la lista blanca, se terminará la secuencia de comandos y se registrará.

     

Nota: esta configuración desactiva suhosin.executor.func.blacklist.

  

Suhosin (pronunciado 'su-ho-shin') es un sistema de protección avanzada para instalaciones de PHP. Fue diseñado para proteger a los servidores y usuarios de fallas conocidas y desconocidas en las aplicaciones PHP y el núcleo de PHP. Suhosin viene en dos partes independientes, que se pueden usar por separado o en combinación. La primera parte es un pequeño parche contra el núcleo de PHP, que implementa algunas protecciones de bajo nivel contra los desbordamientos de búfer o las vulnerabilidades de las cadenas de formato y la segunda parte es una poderosa extensión de PHP que implementa muchas otras protecciones.

    
respondido por el Sajjad Pourali 06.05.2016 - 12:41
fuente

Lea otras preguntas en las etiquetas