是否可以禁用我的应用程序中未使用的所有 PHP 函数?

信息安全 php
2021-08-29 13:25:19

我想保护我的 PHP 安装。我可以禁用某些功能,比如system()exec()使用等disable_functions在php.ini。但是我可以忘记禁用一些危险的功能。是否可以禁用所有功能,不包括我的应用程序中已使用的功能?

2个回答

要挂钩@UTF-8的注释,使用PHP_Parser,您可以相当轻松地生成应用程序未实际使用的默认 PHP 函数列表,然后您可以将其存储在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;

可以为 创建类似的东西disable_classes,只需寻找即可PhpParser\Node\Expr\New_

需要考虑的一些事项:

  • 您的第一步应该是减少您的 PHP 实例正在加载的模块数量。
  • 管理这个会很烦人。
  • 如果你动态地使用任何东西,你将会度过一段糟糕的时光。
  • 设置较大disable_functions可能会对性能产生影响。您可能需要考虑使用https://security.stackexchange.com/a/122471/242建议的 Suhosin 的白名单功能。

您可以使用 Suhosin 扩展,它允许您将想要允许的功能列入白名单。

请参阅 Suhosin 的 suhosin.executor.func.whitelist配置选项。

suhosin.executor.func.whitelist

允许调用的函数的逗号分隔白名单。如果白名单为空,则评估黑名单,否则调用不在白名单中的函数将终止脚本并被记录。

注意:此设置停用 suhosin.executor.func.blacklist。


Suhosin(发音为“su-ho-shin”)是 PHP 安装的高级保护系统。它旨在保护服务器和用户免受 PHP 应用程序和 PHP 核心中已知和未知的缺陷的影响。Suhosin 有两个独立的部分,可以单独使用或组合使用。第一部分是针对 PHP 核心的一个小补丁,它实现了一些针对缓冲区溢出或格式字符串漏洞的低级保护,第二部分是一个强大的 PHP 扩展,它实现了许多其他保护。