include()为什么不使用它?

时间:2010-05-29 22:06:44

标签: php security function

我正在编写2003年编写的一本较旧的php mysql书。作者使用include()函数通过包含header.inc,footer.inc,main.inc文件等来构造html页面。现在我发现了在我从服务器收到很多警告后,默认的ini设置中不允许这样做(allow_url_include设置为Off)。

我还注意到您可以使用 include 而不使用括号。我试过这个并且它可以工作,我没有收到任何错误消息或警告。两者有什么不同?也就是说 include() include 不同?

4 个答案:

答案 0 :(得分:16)

这是一种误解。您可以关闭远程文件(使用URL http://www.example.com/include.php而不是文件系统路径)。您始终可以包含本地文件。

后者是因为include不是正常函数,而是语言结构。与die一样,它可以与括号一起使用,也可以不与括号一起使用。资料来源:Manual

  

因为include()是一种特殊的语言结构,所以在其参数周围不需要括号。比较返回值时要小心。

答案 1 :(得分:4)

使用include()可以引入本地文件包含(LFI)或Remote File Include(RFI) Vulnerably。您应该尝试避免使用include,例如如果您要包含HTML ,那么写print(file_get_contents($file))include($file)更好。但是,大多数php应用程序中都需要include()个PHP文件来减少代码重复。

即使禁用了远程文件包含,它仍然可以使用Advanced LFI Attack来利用系统。

如果你确实需要接受include()中的用户输入,那么你应该确保它在白名单上:

$good_includes=array("contact","home","view");
if(in_array($_GET[page],$good_includes)){
    include("inc/".$_GET[page].".php");
}

答案 2 :(得分:0)

函数include适用于文件的动态包含。如果我们在循环中包含文件,这非常好。但是如果我们静态包含文件,我们应该使用require。第二个函数在脚本的开头部分。

答案 3 :(得分:-1)

include / require_oncerequire存在重大差异。

主要区别在于错误报告,如果您在应用程序中使用include,PHP将尝试加载文件,但如果它不存在,则会抛出非致命错误(意味着您的脚本不会停止),如果您是使用require然后脚本将停止并停止处理。

对应用程序的基础文件使用require并在模板中使用include,因为如果出现错误,您可以指定不显示错误,因此用户不会知道差异只要它不是主要模板包括header.php

这些功能主要用于您自己的服务器上,以包含与您的应用程序相关的文件。

如果您要包含服务器外部的文件,那么我会使用curl(如果已安装)或file_get_contents()

希望这会对你有所帮助。

关于require vs require_once的注释,require_once将添加逻辑以确保文件不会包含多次,即您不想声明数据库连接不止一次