open_basedir 严重影响PHP I/O性能
这是昨天看到的一篇文章,看完后,我针对服务器等做了一下测试,确实有影响。毕竟open_basedir在每一次require,include以及判断文件等的时候,都要先判断是否在可执行目录内。所以。。。性能就会下降(如果是用框架的,可能性能会更差一点),如果是自己的机器,一般也可以通过设定文件目录权限,来防止这种情况发生【linux可以指定用户、用户组。windows可以设定目录的所有者(当时在win下我就最烦这个,因为需要为每个虚拟主机添加一个用户,再指定权限,然后再到目录上设定用户)】
下面就是我看到的文章的内容:
今天在做项目的时候发现 没几行语句 竟然耗费了0.04秒
十分让我吃惊.随后进行跟踪 得知就在I/O读写的时候最费时间 一个is_file竟然费了0.003秒
后来让我百思不得其解 Google也没有任何答案.
然后我又把项目放到另外一个电脑上 发现速度直线上升 从以前的0.04秒变成了0.007秒左右.
我很纳闷 难道我的本本就这么差劲不应该啊
经过我的比较 我发现了 在我机器上的这个项目的虚拟主机中 设置了open_basedir.
大家都知道 这个对于虚拟主机来说是必不可少的..
但是后来我又进行测试一遍 难道真的是这样吗
我的测试代码非常简单:
PHP代码
01.$time = microtime(true);
02.is_file('1.html');
03.echo microtime(true) - $time;
我的弄了一个空的1.html文件 这个文件是在当前目录绝对存在的.
我新建了一个虚拟主机 然后设置了一下open_basedir.
得到的结果是0.0018570423126221左右
然后我进apache的配置文件 把open_basedir删除以后
得到的结果是5.0067901611328E-5 这个结果小到PHP中的小数点都不能表示了
(注:以上结果都是多次运行缓存后的结果 因为is_file的结果会被缓存的)
现在我终于明白了 为啥虚拟主机那些探针中 I/O的性能都那么小的原因了..
杯具啊..
各位也可以测试。。实测如此。
----------------------
取消该设置,或者 ../:./:/tmp:../../
----------------------
如下是php.ini中的原文说明以及默认配置:
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory or
; per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
open_basedir = .
open_basedir可将用户访问文件的活动范围限制在指定的区域,通常是其家目录的路径,也
可用符号"."来代表当前目录。注意用open_basedir指定的限制实际上是前缀,而不是目录名。
举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是
可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成:
"open_basedir = /dir/user/"
open_basedir也可以同时设置多个目录, 在Windows中用分号分隔目录,在任何其它系统中用
冒号分隔目录。当其作用于Apache模块时,父目录中的open_basedir路径自动被继承。
有三种方法可以在Apache中为指定的用户做独立的设置:
(a) 在Apache的httpd.conf中Directory的相应设置方法:
php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考如下:
php_admin_value open_basedir /usr/local/apache/htdocs/:/tmp/
(b) 在Apache的httpd.conf中VirtualHost的相应设置方法:
php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考如下:
php_admin_value open_basedir /var/www/html/:/var/tmp/
(c) 因为VirtualHost中设置了open_basedir之后, 这个虚拟用户就不会再自动继承php.ini
中的open_basedir设置值了,这就难以达到灵活的配置措施, 所以建议您不要在VirtualHost
中设置此项限制. 例如,可以在php.ini中设置open_basedir = .:/tmp/, 这个设置表示允许
访问当前目录(即PHP脚本文件所在之目录)和/tmp/目录.
请注意: 若在php.ini所设置的上传文件临时目录为/tmp/, 那么设置open_basedir时就必须
包含/tmp/,否则会导致上传失败. 新版php则会提示"open_basedir restriction in effect"
警告信息, 但move_uploaded_file()函数仍然可以成功取出/tmp/目录下的上传文件,不知道
这是漏洞还是新功能.
针对ShopEx472版本的配置:
open_basedir = "D:/Server;../catalog;../include;../../home;../syssite;../templates;../language;../../language;../../../language;../../../../language"
网站的安全与性能似乎是矛与盾的关系。对于一个php网站来说,尤其难以取舍。举个最简单的例子:php配置文件的open_basedir将 PHP 所能打开的文件限制在指定的目录树,包括文件本身。本来这对于网站的安全是十分有利的;但据笔者从网上获取的资料来看,open_basedir会对php操作io的性能产生很大的影响。研究资料表明,配置了php_basedir的脚本io执行速度会比没有配置的慢10倍甚至更多!
起初,我也不太相信这个结果,不过测试数据却说服我承认这个观点。
创建一个简单的脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
function microtime_float()
{
list( $usec , $sec ) = explode ( " " , microtime());
return ((float) $usec + (float) $sec );
}
$time_start = microtime_float();
is_file ( '1.html' );
$time_end = microtime_float();
$time = $time_end - $time_start ;
echo "Did is_file in $time seconds\n" ;
?>
|
对于open_basedir的测试结果
0.0006 / 5.0E-5
差距是相当大的,不过聪明的朋友应该注意到,笔者的网站配置了open_basedir,相对与这样的性能损失来说,我宁愿选择牺牲性能,换取安全,您的选择呢?不用猜,您可能和我的选择一致啦~毕竟服务器安全更重要些。
小提示:如何配置open_basedir
当一个脚本试图用例如 fopen() 或者 gzopen() 打开一个文件时,该文件的位置将被检查。当文件在指定的目录树之外时 PHP 将拒绝打开它。所有的符号连接都会被解析,所以不可能通过符号连接来避开此限制。
特殊值 . 指明脚本的工作目录将被作为基准目录。但这有些危险,因为脚本的工作目录可以轻易被 chdir() 而改变。
在 httpd.conf 文件中中,open_basedir 可以像其它任何配置选项一样用“php_admin_value open_basedir none”的方法关闭(例如某些虚拟主机中)。
在 Windows 中,用分号分隔目录。在任何其它系统中用冒号分隔目录。作为 Apache 模块时,父目录中的 open_basedir 路径自动被继承。
用 open_basedir 指定的限制实际上是前缀,不是目录名。也就是说“open_basedir = /dir/incl”也会允许访问“/dir/include”和“/dir/incls”,如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜线结束路径名。例如:“open_basedir = /dir/incl/”。
分享到:
相关推荐
`open_basedir`是PHP的一项安全配置,用于限制PHP脚本可以访问的文件系统路径,以防止未经授权的文件操作,如读取、写入或执行。这个设置可以在php.ini文件中全局定义,也可以在Apache的httpd.conf或VirtualHost配置...
在绕过open_basedir限制时,需要注意安全问题。例如,攻击者可能会使用这些方法来访问敏感文件或目录。因此,在使用这些方法时,需要遵守安全原则,确保文件和目录的安全。 绕过open_basedir限制需要使用一些特殊的...
`open_basedir` 是 PHP 配置中的一个重要选项,用于增强系统的安全性,限制PHP脚本可以访问的文件系统路径。这个设置主要用于防止恶意脚本超出其应有的权限范围,访问、修改或删除敏感文件。通过配置 `open_basedir`...
【PHP的open_basedir限制与绕过方法】 在PHP中,`open_basedir`配置项是用于增强安全性的重要工具,它限制了PHP脚本能够访问的文件系统路径。当`open_basedir`设置为例如`/home/wwwroot/home/web1/:/tmp/`时,任何...
在PHP的配置中,`open_basedir` 是一个非常重要的安全设置,用于限制PHP脚本可以访问的文件系统路径。这个配置项可以帮助防止恶意代码跨目录访问,从而提高服务器的安全性。尤其是在多站点环境中,确保每个虚拟站点...
主要介绍了PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍,这个漏洞很久之前(大概5年前)被提出来了,到现在的最新版本中依然存在,需要的朋友可以参考下
第一种 第二种 第三种
受保护的ENV值的Docker示例 该存储库是使用Apache的envvars以及外部文件和open_basedir进行... 这是一个PHP ini配置,可启用open_basedir设置并限制PHP进程访问/var/www/html之外的文件。 带有ENC_KEY值的test-setting
此外,还有其他一些安全问题,如open_basedir的安全问题、文件头泄露的安全问题等。open_basedir是一个PHP的配置选项,用于控制文件的访问权限。如果启用了open_basedir,那么PHP程序中只能访问指定的文件目录,以...
总结而言,蓝帽杯one_Pointer_php writeup这篇技术文章深入分析了多个PHP相关的安全漏洞,包括反序列化漏洞、PHP数组整数溢出和open_basedir限制的绕过。这些知识点对于Web安全领域的研究者和开发者来说都是极具价值...
使用open_basedir参数来限制PHP可以访问的目录,避免PHP木马攻击时可以访问敏感目录。 7. 关闭不需要的函数 在php.ini文件中关闭不需要的函数,如allow_url_fopen、allow_url_include等,避免PHP木马攻击时可以...
5. **控制PHP脚本的访问目录(open_basedir)**:通过`open_basedir`设定脚本只能访问特定的目录,如`open_basedir = /usr/www`,可以防止PHP脚本访问敏感或非预期的文件。 6. **禁用危险函数(disable_functions)...
5. **使用`open_basedir`限制文件访问**:此设置强制PHP脚本只能访问指定的目录,防止非法访问:`open_basedir = D:/usr/www`。这有助于防止目录遍历攻击。 6. **禁用危险函数**:通过`disable_functions`,可以...
停用以下函数:system()、exec()、passthru()、shell_exec()、proc_open() 和 popen(),这些函数可能会给您的服务器带来安全风险。 六、open_basedir 配置 将 open_basedir 配置为 /tmp 目录和 web 根目录,以便...
使用`open_basedir`选项可以限定PHP脚本只能访问特定目录,防止访问敏感文件。比如,只允许访问网站根目录:`open_basedir = /usr/www`。这有助于减少phpshell攻击的风险。 为了增强安全性,可以禁用一些危险的PHP...
disable_functions = system, passthru, exec, shell_exec, popen, phpinfo, escapeshellarg, escapeshellcmd, proc_close, proc_open, dl ``` 另外,关闭**PHP版本信息**在HTTP头中的显示,可以减少服务器信息的...