很多站长朋友们都不太清楚globphp,今天小编就来给大家整理globphp,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 PHP绕过open_basedir限制操作文件的三种方法 2、 PHP文件读取问题 scandir函数和glob函数,那个效率更高? 3、 php如何读取某目录下的所有同类型文件 4、 PHP中glob()函数查找指定后缀名的文件 PHP绕过open_basedir限制操作文件的三种方法由于open_basedir的设置对system等命令执行函数是无效的,所以我们可以使用命令执行函数来访问限制目录。
我们首先创建一个目录
且在该目录下新建一个1.txt 内容为abc
再在该目录下创建一个目录命名为b
并且在该目录下创建一个1.php文件内容为
且在php.ini中设置好我们的open_basedir
我们尝试执行1.php看看open_basedir是否会限制我们的访问
执行效果如图
很明显我们无法直接读取open_basedir所规定以外的目录文件。
接下来我们用system函数尝试绕open_basedir的限制来删除1.txt
编辑1.php为
先来看看执行1.php之前的文件情况
执行1.php之后
我们先来了解一下symlink函数
symlink函数将建立一个指向target的名为link的符号链接,当然一般情况下这个target是受限于open_basedir的。
由于早期的symlink不支持windows,我的测试环境就放在Linux下了。
测试的PHP版本是5.3.0,其他的版本大家自测吧。
在Linux环境下我们可以通过symlink完成一些逻辑上的绕过导致可以跨目录操作文件。
我们首先在/var/www/html/1.php中 编辑1.php的内容为
接着在/var/www/中新建一个1.txt文件内容为
再来设置一下我们的open_basedir
在html目录下编辑一个php脚本检验一下open_basedir
执行看下。
意料之中,文件无法访问。
我们执行刚才写好的脚本,1.php
此时tmplink还是一个符号链接文件,它指向的路径是c/d,因此exploit指向的路径就变成了
由于这个路径在open_basedir的范围之内所以exploit成功建立了。
之后我们删除tmplink符号链接文件再新建一个同名为tmplink的文件夹,这时exploit所指向的路径为
由于这时候tmplink变成了一个真实存在的文件夹所以tmplink/变成了1.txt所在的目录即/var/www/
然后再通过访问符号链接文件exploit即可直接读取到1.txt的文件内容
当然,针对symlink()只需要将它放入disable_function即可解决问题,所以我们需要寻求更多的方法。
glob是php自5.3.0版本起开始生效的一个用来筛选目录的伪协议,由于它在筛选目录时是不受open_basedir的制约的,所以我们可以利用它来绕过限制,我们新建一个目录在/var/www/下命名为test
并且在/var/www/html/下新建t.php内容为
执行结果如图:
成功躲过open_basedir的限制读取到了文件。
PHP文件读取问题 scandir函数和glob函数,那个效率更高?scandir比较传统,只扫描指定的路径,不解析通配符。列目录时效率较高。
glob更高级抽象。使用简单,适合搜索文件。
php如何读取某目录下的所有同类型文件PHP使用函数opendir、readdir、closedir来实现文件夹的操作,下面以一个最基本的例子来作为入门介绍:
<?php
//获取某目录下所有文件、目录名(不包括子目录下文件、目录名)
$dir='C:/Users/';
$handler = opendir($dir);
while (($filename = readdir($handler)) !== false) {//务必使用!==,防止目录下出现类似文件名“0”等情况
if ($filename != "." $filename != "..") {
$files[] = $filename ;
}
}
}
closedir($handler);
//打印所有文件名
foreach ($filens as $value) {
echo $value."<br />";
}
?>
上面的代码显示c:\users文件夹里面的所有的文件和文件夹,忽略.和..两个特殊含义的文件夹,程序把所有文件和文件夹名称扫描保存到数组里面,然后显示。
如果你需要对文件进行过滤,例如只处理*.xls文件,可以在过滤.和..的地方添加代码。例如:
if (substr($filename,-4)=='.xls'){
当你理解了上面的代码之后,你就能编写扫描子文件夹、以及子 文件夹里面文件的方法了。基本思路是使用递归,下面我给出一个简单的例子:
function get_allfiles($path,$files) {
if(is_dir($path)){
$dp = dir($path);
while ($file = $dp ->read()){
if($file !="." $file !=".."){
get_allfiles($path."/".$file, $files);
}
}
$dp ->close();
}
if(is_file($path)){
$files[] = $path;
}
}
function get_filenamesbydir($dir){
$files = array();
get_allfiles($dir,$files);
return $files;
}
$filenames = get_filenamesbydir("c:/users/");
//打印所有文件名,包括路径
foreach ($filenames as $value) {
echo $value."<br />";
}
这个例子使用dir类来编写,实际上用opendir、readdir、closedir来写也是相同的。
PHP中glob()函数查找指定后缀名的文件建议参考以下代码
A simple function that find all files by extension an return it by an array.
<?php
function findFiles($directory, $extensions = array()) {
function glob_recursive($directory, $directories = array()) {
foreach(glob($directory, GLOB_ONLYDIR | GLOB_NOSORT) as $folder) {
$directories[] = $folder;
glob_recursive("{$folder}/*", $directories);
}
}
glob_recursive($directory, $directories);
$files = array ();
foreach($directories as $directory) {
foreach($extensions as $extension) {
foreach(glob("{$directory}/*.{$extension}") as $file) {
$files[$extension][] = $file;
}
}
}
return $files;
}
var_dump(findFiles("C:", array (
"jpg",
"pdf",
"png",
"html"
)));
?>
把C:改成你需要查找的路径,里面放后缀,测试可用。
关于globphp的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。