织梦检测目录是否可写函数TestWriteable($d,$c==flase)

admin2023-01-18936

这个函数在多个文件中有定义,这几个文件分别是:

dede/update_guide.php
dede/sys_verifies.php
dede/module_main.php
dede/index_testenv.php
dede/testenv.php

一般来说一个函数只定义一次就够了,但是,这个检测目录是否可写函数在上面五个文件里都有定义,而且,它们的定义差别很小,本教程将以文件dede/index_testenv.php定义的函数进行分析讲解。

函数功能:检测一个目录是否具有可写权限。

返回值:布尔值。

函数代码:

161620n1knsgfr17bgbn1c.jpg

为什么要检测目录呢?因为,有时候我们不想把某个目录让用户访问,特别是敏感的内容,这样做的目的就是为了网站安全,如果要写入某个目录有访问权限这时,也要检测一下,所以,检测目录的权限就变得比较重要,特别是第一种情况。

这个函数看上去,虽然,简单但是里面用到的知识却不少,所以,有必要分析一下。

代码分析开始:

在定义一个函数时我们首先要做的就是:判断一下这个函数是否存在,若不存在再去定义这个函数,养成一个良好的习惯你会发现对你以后去编写代码帮助很大,因为,有时候可能就因为一句代码你写的东西可能要么效率降低,要么会出现漏洞等问,这个要注意最好先判断一下函数是否存在。

既然,这个函数是判断目录是否可写,如果判断?只要把这一个关键问题弄明白了,写这个函数就容易多了。要判断一个目录是不是有权限,直接向这个目录写一个文件不就可以确定是不是有权限了,有时候感觉一个问题好像很复杂似的,但是,细想一下很简单。

如果知道了这个最核心的知识,那么,第一行代码为什么要定义一个文件$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;
    }
}

总结:如果我们把织梦里面的每个函数分析到这种程度,那么再去做织梦二次开发,你会明白为什么会用这个函数,什么时候用这个函数,不至于用了很多次,结果下次遇到同样一个函数结果还是不会用,然后再去查资料。

网友评论