我想保护我的 PHP 安装。我可以禁用某些功能,比如system(),exec()使用等disable_functions在php.ini。但是我可以忘记禁用一些危险的功能。是否可以禁用所有功能,不包括我的应用程序中已使用的功能?
是否可以禁用我的应用程序中未使用的所有 PHP 函数?
信息安全
php
2021-08-29 13:25:19
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 扩展,它实现了许多其他保护。
其它你可能感兴趣的问题