我正在编写2003年编写的一本较旧的php mysql书。作者使用include()函数通过包含header.inc,footer.inc,main.inc文件等来构造html页面。现在我发现了在我从服务器收到很多警告后,默认的ini设置中不允许这样做(allow_url_include设置为Off)。
我还注意到您可以使用 include 而不使用括号。我试过这个并且它可以工作,我没有收到任何错误消息或警告。两者有什么不同?也就是说 include()与 include 不同?
答案 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_once
和require
存在重大差异。
主要区别在于错误报告,如果您在应用程序中使用include,PHP将尝试加载文件,但如果它不存在,则会抛出非致命错误(意味着您的脚本不会停止),如果您是使用require
然后脚本将停止并停止处理。
对应用程序的基础文件使用require
并在模板中使用include
,因为如果出现错误,您可以指定不显示错误,因此用户不会知道差异只要它不是主要模板包括header.php
这些功能主要用于您自己的服务器上,以包含与您的应用程序相关的文件。
如果您要包含服务器外部的文件,那么我会使用curl(如果已安装)或file_get_contents()
。
希望这会对你有所帮助。
关于require
vs require_once
的注释,require_once
将添加逻辑以确保文件不会包含多次,即您不想声明数据库连接不止一次