php中的原生类

目录遍历类

Directorylterator

只能列出目录文件名,不能读文件内容

作用:查看文件系统的目录

返回值:指定目录下的第一个文件名(一般情况下是.)

这个类会创建一个指定目录的迭代器

1
2
3
4
<?php
$dir = new DirectoryIterator('D:\PHP代码');//这是我自己的一个目录
echo $dir;
?>

image-20260324192936848

遇到echo输出时会触发DirectoryIterator中的__toString()方法

DirectoryIterator::__toString方法

参数:此函数没有参数

返回值:返回当前DirectoryIterator类的文件名

1)查看全部文件名

需要用foreach遍历

1
2
3
4
5
6
<?php
$dir = new DirectoryIterator('D:\PHP代码');
foreach($dir as $d){
echo $d."\n";
}
?>

image-20260324192925095

可以访问到这个目录下的所有文件

2)筛选出特定类型的文件

配合glob://协议筛选

1
2
3
4
5
6
<?php
$dir = new DirectoryIterator('glob:///PHP代码/*php*');
foreach($dir as $d){
echo $d."\n";
}
?>

用* *进行筛选含有php的文件

image-20260324192921105

3)一句话形式

1
2
3
4
5
6
<?php
//$dir = new DirectoryIterator('glob:///PHP代码/*php*');
//foreach($dir as $d){
// echo $d."\n";
$a = new DirectoryIterator('glob:///PHP代码/*php*');foreach($a as $d){echo($d."\n");}
?>

image-20260324192918121

FilesystemIterator

GlobIterator

读取文件

SplFileObject

作用:可用于读指定文件内容,直接echo只能读一行

1
2
3
4
<?php
$content = new SplFileObject('D:\PHP代码\异或.php');
echo $content;
?>

image-20260324192914744

1)用foreach遍历$content对象

1
2
3
4
5
6
<?php
$content = new SplFileObject('D:\PHP代码\异或.php');
foreach($content as $c){
echo $c."\n";
}
?>

image-20260324192911616

可删除文件的类

ZipArchive

https://www.php.net/manual/zh/class.ziparchive.php

作用:对文件进行压缩与解压缩处理

常用的魔术方法

魔术方法 作用
ZipArchive::addEmptyDir 添加一个新的文件目录
ZipArchive::addFile 将文件添加到指定zip压缩包中
ZipArchive::addFronString 添加新的文件同时将内容添加进去
ZipArchive::close 关闭ZipArchive
ZipArchive::open 打开一个zip压缩包
ZipArchive::aextracTo 将压缩包解压
ZipArchive::deleteIndex 删除压缩包中的某一个(deleteIndex(0)代表删除第一个文件)

ZipArchive::open

1
public ZipArchive::open(string $filename, int $flags = 0): bool|int

这段代码可以用于打开一个ZIP压缩文件或者创建新的ZIP文件

string $filename

  • 类型约束:string表示传入的参数必须是字符串类型
  • 参数作用:指定要操作的ZIP文件的路径和文件名

int $flags = 0

  • 类型约束:int表示传入的参数必须是整型
  • 参数作用:指定打开ZIP文件的模式和行为,参数的默认值为0
  • 常用可选常量:
  1. ZipArchive::CREATE:若指定文件不存在,则创建该文件,若存在直接打开
  2. ZipArchive::OVERWRITE:覆盖已存在的ZIP文件,即使文件已有内容也会清空后重新创建
  3. ZipArchive::RDONLY:以只读模式打开ZIP文件,无法对文件进行写入、添加内容等操作
  4. 可以用按位(|)组合多个选项

bool|int:返回值类型说明

ZipArchive::OVERWRITE可以把指定文件删除

image-20260324192907460

按Ctrl再点ZipArchive可以跟进方法可以看到public const OVERWRITE = 8,在调用时也可以直接将$flags赋值为8

image-20260324192904816

所以可以利用ZipArchive类调用open方法来删除目标主机上的文件

image-20260324192902064

原来存在一个2.php文件

1
2
3
4
<?php
$a = new ZipArchive();
$a->open('2.php',ZipArchive::OVERWRITE);
?>

image-20260324192858651

运行后会删除指定的2.php

1
2
3
4
<?php
$a = new ZipArchive();
$a->open('2.php',8);
?>

将flags直接写成8也是一样的可以删除指定文件

反射类

什么是反射

反射是指在PHP运行状态中,扩展分析PHP程序,导出或提取出于类、方法、属性、参数等的详细信息,包括注释。

这种动态获取的信息以及动态调用对象的方法的功能称为反射API

API:应用程序端口

反射是操纵面向对象范型中元模型的API

PHP反射API由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互

ReflectionClass类

作用

  1. 分析类结构

获取类名、命名空间、文件路径、接口、父类、修饰符、注释等

  1. 访问成员

检索类的方法、属性、常量等信息

  1. 实例化对象

动态创建类的实例(支持绕过魔术方法)

  1. 操作访问控制

绕过private/protected成员的访问权限

ReflectionClass::__construct函数

image-20260324192854454

测试代码1

1
2
3
4
<?php
$a = new ReflectionClass('Exception');
echo $a;
?>

image-20260324192850360

测试了原生类Exception,可以看到其中的类、属性、方法

测试代码2

flag.php文件:

1
2
3
4
5
6
7
8
9
<?php
class FLAG{
public $flag = "flag{this_is_a_flag}";

public function getFlag(){
return $this->flag;
}
}
?>

111.php文件:

1
2
3
4
5
<?php
include 'flag.php';
$a = new ReflectionClass('FLAG');
echo $a;
?>

image-20260324192846440

可以看到其中的方法、属性名

常用的魔术方法

https://www.php.net/manual/zh/book.reflection.php

魔术方法 作用
ReflectionClass::__construct 初始化ReflectionClass类
ReflectionClass::export 导出类
ReflectionClass::getAttributes 获取所有属性
ReflectionClass::getConstant 获取已定义的常量
ReflectionClass::getConstructor 获取类的构造函数
ReflectionClass::getMethod 获取类方法
ReflectionClass::getMethods 获取类方法的数组
ReflectionClass::getName 获取类名
ReflectionClass::getProperties 获取属性

Reflection类

魔术方法 作用
Reflection::export 导出
Reflection::getModifierNames 获取修饰符的名称

可进行XSS的类

Error类

适用版本:php7版本

Error类就是php的一个内置类用于自动自定义一个Error

内置方法:__toString() 可能存在XSS

魔术方法

魔术方法 作用
Error::__construct 初始化 error 对象
Error::getMessage 获取错误信息
Error::getPrevious 返回先前的 Throwable
Error::getCode 获取错误代码
Error::getFile 获取错误发生时的文件
Error::getLine 获取错误发生时的行号
Error::getTrace 获取调用栈(stack trace)
Error::getTraceAsString 获取字符串形式的调用栈(stack trace
Error::__toString error 的字符串表达
Error::__clone 克隆 error


php中的原生类
https://colourful228.github.io/2026/03/19/php中的原生类/
作者
Colourful
发布于
2026年3月19日
更新于
2026年3月24日
许可协议