spaze/phpinfo

将 phpinfo() 提取为变量并将 CSS 移动到外部文件。

v1.3.0 2024-05-15 23:56 UTC

This package is auto-updated.

Last update: 2024-09-16 03:43:31 UTC


README

phpinfo() 提取为变量并将 CSS 移动到外部文件。

当你想在网站的布局中仅向认证用户显示 phpinfo() 的输出时,这可能很有用。

$phpInfo = new \Spaze\PhpInfo\PhpInfo();
$html = $phpInfo->getHtml();

getHtml()

getHtml() 方法返回 phpinfo() 输出,不带 HTML headbody 元素,并包装在 <div id="phpinfo"></div> 中。

所有内联 CSS 都将“外部化”为 CSS 类,你可以加载 assets/info.css 来获取颜色。

使用 Nette 框架的示例(也可以与其他框架或独立使用)

$this->template->phpinfo = Html::el()->setHtml($this->phpInfo->getHtml());

请注意,这将还会移除包含 meta name="ROBOTS" 标记的 HTML head 元素,该标记阻止搜索引擎和其他机器人索引 phpinfo() 输出。你必须以某种方式将其添加回来,例如通过在你的布局中渲染包含 meta name="ROBOTS" 标记的 head 元素的 getHtml() 输出。通常,phpinfo() 输出应仅对认证用户可用。

getFullPageHtml()

有时,你可能想显示经典的 phpinfo() 输出,带有原始的 HTML headbody 元素,meta name="ROBOTS" 标记,内联样式等,但仍对敏感信息进行清理(见下文)。在这种情况下,你可以使用 getFullPageHtml()

$phpInfo = new \Spaze\PhpInfo\PhpInfo();
echo $phpInfo->getFullPageHtml();

清理

默认情况下,会话 ID 将自动确定并替换为 [***]。这是为了防止一些会话劫持攻击,这些攻击会从反映在 phpinfo() 输出中的 cookie 值中读取会话 ID(请参阅我的博客文章,描述攻击、HttpOnly 绕过和解决方案)。你可以通过调用 doNotSanitizeSessionId() 禁用清理,但绝对不推荐这样做。请不要禁用它。

你可以使用以下方法添加要清理的字符串

addSanitization(string $sanitize, ?string $with = null): self

如果找到,则将 $sanitize 中的字符串替换为 $with 中的字符串,如果 $with 为 null,则使用默认的 [***]

由于 phpinfo() 输出中的某些值是按 URL 编码打印的,因此 $sanitize 值也将自动搜索 URL 编码。这意味着 foo,barfoo%2Cbar 都将被替换。

清理器将尝试自动确定会话 ID 并进行清理,你可以(但不应该)通过 doNotSanitizeSessionId() 禁用它。

确定会话 ID 时将使用以下值

  1. 如果为 false 则为 session_id() 输出
  2. 如果它是字符串,则为 $_COOKIE[session_name()]

然而,不建议仅依赖自动方式,例如,你可能在自定义服务中某处设置了会话名称,而清理器可能无法使用它。我更愿意建议你手动配置清理。

$phpInfo->addSanitization($this->sessionHandler->getId(), '[***]'); // where $this->sessionHandler is your custom service for example

$phpInfo->addSanitization($_COOKIE['MYSESSID'], '[***]'); // where MYSESSID is your session name

或类似的东西。

清理任意字符串

如果你有 phpinfo() 输出(或任何其他东西)的字符串,你可以使用清理器独立使用,例如

$sanitizer = new \Spaze\PhpInfo\SensitiveValueSanitizer();
$string = $sanitizer->addSanitization('🍍', '🍌')->sanitize('🍍🍕');

然后,您可以传递已配置的清理器到PhpInfo类中,该类将使用您的配置来清理phpinfo()输出的内容。

$phpInfo = new \Spaze\PhpInfo\PhpInfo($sanitizer);
$html = $phpInfo->getHtml();