E 'possibile disabilitare tutte le funzioni PHP non utilizzate nella mia applicazione?

10

Voglio proteggere la mia installazione PHP. Posso disabilitare alcune funzioni, come system() , exec() ecc. Usando disable_functions in php.ini. Ma posso dimenticare di disabilitare alcune funzioni pericolose. È possibile disabilitare tutte le funzioni, escluse quelle già utilizzate nella mia applicazione?

    
posta checkbox 05.05.2016 - 09:28
fonte

2 risposte

3

Per agganciare il commento di @ UTF-8 , usando PHP_Parser , puoi facilmente generare un elenco di funzioni PHP predefinite non effettivamente utilizzate dalla tua applicazione che puoi quindi archiviare nel Opzione di configurazione 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;

È possibile creare qualcosa di simile per disable_classes , basta invece cercare PhpParser\Node\Expr\New_ .

Alcune cose da considerare:

  • Il primo passo dovrebbe essere quello di ridurre la quantità di moduli caricati dall'istanza di PHP.
  • Sarà noioso gestire questo.
  • Avrai un brutto momento se utilizzi qualcosa in modo dinamico.
  • L'impostazione di un'alta percentuale di% co_de potrebbe avere un impatto sulle prestazioni. Potresti considerare l'utilizzo della funzionalità di whitelist di Suhosin come suggerito dal link .
risposta data 06.05.2016 - 12:15
fonte
2

Puoi utilizzare l'estensione Suhosin che ti consente di autorizzare le funzioni che desideri consentire.

Vedi l'opzione suhosin.executor.func.whitelist di Suhosin.

suhosin.executor.func.whitelist

Comma separated whitelist of functions that are allowed to be called. If the whitelist is empty the blacklist is evaluated, otherwise calling a function not in the whitelist will terminate the script and get logged.

Note: This setting deactivates suhosin.executor.func.blacklist.

Suhosin (pronounced 'su-ho-shin') is an advanced protection system for PHP installations. It was designed to protect servers and users from known and unknown flaws in PHP applications and the PHP core. Suhosin comes in two independent parts, that can be used separately or in combination. The first part is a small patch against the PHP core, that implements a few low-level protections against buffer overflows or format string vulnerabilities and the second part is a powerful PHP extension that implements numerous other protections.

    
risposta data 06.05.2016 - 12:41
fonte

Leggi altre domande sui tag