spaze / phpinfo
将 phpinfo() 提取为变量并将 CSS 移动到外部文件。
Requires
- php: ^7.4 || ^8.0
Requires (Dev)
README
将 phpinfo()
提取为变量并将 CSS 移动到外部文件。
当你想在网站的布局中仅向认证用户显示 phpinfo()
的输出时,这可能很有用。
$phpInfo = new \Spaze\PhpInfo\PhpInfo(); $html = $phpInfo->getHtml();
getHtml()
getHtml()
方法返回 phpinfo()
输出,不带 HTML head
和 body
元素,并包装在 <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 head
和 body
元素,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,bar
和 foo%2Cbar
都将被替换。
清理器将尝试自动确定会话 ID 并进行清理,你可以(但不应该)通过 doNotSanitizeSessionId()
禁用它。
确定会话 ID 时将使用以下值
- 如果为
false
则为session_id()
输出 - 如果它是字符串,则为
$_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();