织梦检测目录是否可写函数TestWriteable($d,$c==flase)
这个函数在多个文件中有定义,这几个文件分别是:
dede/update_guide.php dede/sys_verifies.php dede/module_main.php dede/index_testenv.php dede/testenv.php
一般来说一个函数只定义一次就够了,但是,这个检测目录是否可写函数在上面五个文件里都有定义,而且,它们的定义差别很小,本教程将以文件dede/index_testenv.php定义的函数进行分析讲解。
函数功能:检测一个目录是否具有可写权限。
返回值:布尔值。
函数代码:
为什么要检测目录呢?因为,有时候我们不想把某个目录让用户访问,特别是敏感的内容,这样做的目的就是为了网站安全,如果要写入某个目录有访问权限这时,也要检测一下,所以,检测目录的权限就变得比较重要,特别是第一种情况。
这个函数看上去,虽然,简单但是里面用到的知识却不少,所以,有必要分析一下。
代码分析开始:
在定义一个函数时我们首先要做的就是:判断一下这个函数是否存在,若不存在再去定义这个函数,养成一个良好的习惯你会发现对你以后去编写代码帮助很大,因为,有时候可能就因为一句代码你写的东西可能要么效率降低,要么会出现漏洞等问,这个要注意最好先判断一下函数是否存在。
既然,这个函数是判断目录是否可写,如果判断?只要把这一个关键问题弄明白了,写这个函数就容易多了。要判断一个目录是不是有权限,直接向这个目录写一个文件不就可以确定是不是有权限了,有时候感觉一个问题好像很复杂似的,但是,细想一下很简单。
如果知道了这个最核心的知识,那么,第一行代码为什么要定义一个文件$tfile就明白其中的原因了,代码如下:
$tfile = '_write_able.txt';
若我们输入的参数$d,把后面加上了一个“/”号,那么,我们要把这个删除,代码是:
$d = preg_replace("/\/$/", '', $d);
然后,打开这个文件$d/$tfile代码如下:$fp = @fopen($d.'/'.$tfile,'w'),我们知道通过函数fopen(参数)处理后,在$d目录里面若不存在文件$tfile,则这个文件将被创建,这个函数的返回值的类型为资源类型。
若if(!$fp)成立,也就是在目录$d里面不存在$tfile文件,这说明这个目录不可写,因为,fopen(参数)函数在不存在文件名的时候,就会按照这个文件名来创建一个文件,如果找不到就说明写不进$d目录。
如果if( $c==false ),这个参数指的是$d有没有子目录,若没有,则改变目录$d为可以写入文件,并返回flase。
若$c==true,进行递归调用,再一次检测$d子目录是否有可写权限,以此类推荐,直至结束。
如果$fp 存在,说明已经把文件写入到$d目录了,这也说明了目录$d是可以写内容的。直接关闭$fp,并删除文件目录里面的$d.'/'.$tfile文件,也就是在一开始定义的_write_able.txt文件,若删除成功返回true,否则,返回false。
测试:
在根目录里面建立一个test.php文件,写上上面的函数,然后再写上如下代码:
echo TestWriteable("a",false);
因为目录a是可写的,这时就会在目录a里面创建了一个空的txt文件:_write_able.txt,如下图所示。
上面五个文件里的函数功能虽然一样,但是,具体要求不同,要求返回的值不同,所以,有些细微差别,我把这几个函数拿出来对比一下,由于其它函数的代码功能都已经在上面分析了,就不用一个一个再分析了,这里只列出这几个函数,大家可以比对一下,看看它们有什么差异。
以下这二个文件:dede/index_testenv.php和dede/testenv.php
函数就是本教程分析的函数,所以,不用列出来了。
文件update_guide.php和sys_verifies.php检测目录函数为:
function TestWriteAble($d) { $tfile = '_dedet.txt'; $fp = @fopen($d.$tfile,'w'); if(!$fp) { return false; } else { fclose($fp); $rs = @unlink($d.'/'.$tfile); return true; } }
文件module_main.php时面的检测目录函数为:
function TestWriteAble($d) { $tfile = '_dedet.txt'; $d = preg_replace("#\/$#", '', $d); $fp = @fopen($d.'/'.$tfile,'w'); if(!$fp) return FALSE; else { fclose($fp); $rs = @unlink($d.'/'.$tfile); if($rs) return TRUE; else return FALSE; } }
总结:如果我们把织梦里面的每个函数分析到这种程度,那么再去做织梦二次开发,你会明白为什么会用这个函数,什么时候用这个函数,不至于用了很多次,结果下次遇到同样一个函数结果还是不会用,然后再去查资料。