网站的安全与性能似乎是矛与盾的关系。对于一个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 <strong><span style="color: #006699;">function</span></strong> microtime_float() { ???? list( <span style="color: #aa7700;">$usec</span> , <span style="color: #aa7700;">$sec</span> ) = <span style="color: #ff1493;">explode</span> ( <span style="color: #0000ff;">" "</span> , microtime()); ???? <strong><span style="color: #006699;">return</span></strong> ((float) <span style="color: #aa7700;">$usec</span> + (float) <span style="color: #aa7700;">$sec</span> ); } ? ?<span style="color: #aa7700;">$time_start</span> = microtime_float(); ? ?<span style="color: #ff1493;">is_file</span> ( <span style="color: #0000ff;">'1.html'</span> );? <span style="color: #008200;">//判断当前目录是否有1.html这个文件 </span> <span style="color: #aa7700;">$time_end</span> = microtime_float(); <span style="color: #aa7700;">$time</span> = <span style="color: #aa7700;">$time_end</span> - <span style="color: #aa7700;">$time_start</span> ; ? ?<span style="color: #ff1493;">echo</span> <span style="color: #0000ff;">"Did is_file in $time seconds\n"</span> ; ?> |
对于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/”。
?
?
?
?
?
?
?