织梦检测目录是否可执行函数TestExecuteable(参数)

admin2020-01-29934

函数名:TestExecuteable($d='.', $siteuRL='', $rootDir='')

所在文件:dede/index_testnv.php

这个函数以前的织梦系统程序用这个来检测,但是,现在已经废弃了,虽然,不用了,但是,里面用到了很多知识点,所以,有必要分析一下。

我们先看看检测目录的是否可执行的原理:把$d进行md5加密后与PostHost($remoteUrl),其中$remoteUrl是$d/$filename进行对比,若相等则说明该目录可执行,关于函数PostHost($remoteUrl)也在这个文件里面,它处理的是非常底层的url,例如端口、http协议等,这个函数目前不研究分析了,与我们织梦二次开发关系不大,有兴趣的可以研究一下。

补充知识:函数chr(int $ascii) — 返回指定的字符,其中里面的参数若没有特别说明属性哪个进制则指十进制,例如chr(112)返回的值是字母“p”;若指定了字符例如chr(0x3F)里面的参数指的是十六进制,值为字符“?”问号。

进制度转换:hexdec(68)这个指的是参数为十六进制,即把十六进制的68转换成十进制,这个得到的结果是104,chr(104)的值为字母“h”。再例如:八进制转换为十进制octdec(77)指的是把八进制的77转换成十进制,得到的值为63。

现在再去研究这个函数的代码就简单多了。

代码:

$testStr = '<'.chr(0x3F).'p'.chr(hexdec(68)).chr(112)."\n\r";

这一行其实是在组装:

<?php

代码:

$testStr .= chr(0x3F).'>';

组装为:

?>

代码:

$testStr .= 'function test(){ echo md5(\''.$d.'\');}'."\n\rtest();\n\r";

这行代码组装后的结果为:

function test(){ echo md5('a');}
  test();

整个字符串$testStr组装后的结果为:

<?php
function test(){ echo md5('a');}
test();
?>

接下来,先判断一下$d目录是否可写,代码为:if (TestWriteable($d))

若可写,则把字符串内容$testStr写到$d目录里面的$filename文件里面,代码如下:

@file_put_contents($d.'/'.$filename, $testStr);

处理文件$filename路径:

$remoteUrl = $siteuRL.'/'.str_replace($rootDir, '', str_replace("\\", '/',realpath($d))).'/'.$filename;

这一行代码里面有一个函数realpath($d),它的功能是把处理$d路径中'/./', '/../' 以及多余的 '/' 并返回规范化后的绝对路径名。返回的路径中没有符号连接,'/./' 或 '/../' 成分。

最后,要删除$filename文件名,我们测试一下,先把删除连接函数关掉,看看是不是会如我们分析那样,会在a目录(这里面织梦安装后的目录a为例子)创建md5加密后的文件名的文件。

效果如下:

确实已经生成了,看看里面的内容如下:

正是我们分析的内容。

网友评论