在include
的PHP手册中,有一个用户贡献声明如下:
include()用于加载配置信息时有一个可怕的 安全漏洞,如果有人破坏了包含文件中的PHP标头 它会愉快地将配置文件打印到包含它的每个页面 作为纯文本。
幸运的是,这种行为可以快速轻松地进行锻炼(这是 在这篇文章中提到):
<?php
ob_start();//Hook output buffer
include("config.php");
ob_end_clean();//Clear output buffer
?>
我知道以下内容将阻止任何输出,直到输出缓冲区被清除/取消挂起/无论如何。但是,我不确定的是,if someone corrupts the PHP header in the included file
- 是可以在客户端/远程完成的,或者如果我不小心给php文件提供了不同的文件扩展名?
总而言之:外部用户如何破坏php标头?
答案 0 :(得分:5)
好吧,假设您有一个包含的文件seekritpasswords.php
,它包含您的数据库凭据。你有一个看起来像这样的文件:
<?php
$db_user = 'fred';
$db_passwd = 'barney';
$db_name = 'wilma';
$db_host = 'betty';
php“标题”是<?php
部分。如果它被破坏,比如通过添加一个空格,或者完全删除它等等......然后文件不再是php脚本,因为它不包含触发“php模式”的标题。它只是纯文本,并像任何其他纯文本文件一样被视为常规输出。请记住,没有PHP脚本这样的东西。只有包含一个或多个PHP块的文件,这些块由<?php ?>
标记集分隔。
答案 1 :(得分:1)
如果某人破坏了PHP所包含的任何文件,则会遇到此问题。我不知道该用户允许的内容(config.php
的网页编辑...?)但该文件只能由服务器管理员和开发人员编辑。
对config.php这样的文件进行的修改将允许某人做类似这样的事情,听起来就像用户所描述的那样。
// Removed: <?php
$config = array(
...
);
// removed: ?>
PHP核心将解析给它的任何文件(无论.php
扩展名),因此只应包含有效的项目文件。永远不要根据用户输入包含文件。
答案 2 :(得分:0)
他们所说的是,如果有人可以编辑您的PHP文件(例如删除<?php
),那么您的配置信息将被简单地发送到浏览器,因为PHP将不再解析它。 / p>
他们建议的解决方法只是从配置文件中输出任何输出。
正如@Niklas所说,如果有人可以编辑您的文件,那么无论如何都会造成损害。不能这不能远程完成(缺少代码中的严重搞砸或其他一些漏洞),不,如果你用不同的扩展包含PHP,PHP仍然会解析它。但要注意,如果有人用他们的浏览器请求该文件,PHP将不会解析它,因为由Web服务器确定文件类型并适当地处理它。
答案 3 :(得分:0)
包含的任何文件都被视为PHP源文件。也就是说,如果有一个开放的php标签&lt;?php,它将被执行,否则它将被打印。
通常,无法通过Web服务器远程修改文件,但如果攻击者通过其他方式(SSH,FTP等)获得对服务器的访问权限,并且可以编写文件,则可以修改该文件。
答案 4 :(得分:0)
对我而言,这听起来有点偏执。如果有人(除了你)可以破坏PHP标题(我们正在谈论的是
如果有人在开发过程中这样做,我希望你没有在你的生产系统上进行开发。您应该有一个开发框并将更新推送到生产环境。