前言:累麻了!
反射類
反射類 ReflectionClass:ReflectionClass 類報告了一個類的有關信息。正如其名用于映射反射一個類的類!
new ReflectionClass('MyClass') 會創建一個 ReflectionClass 實例,代表 MyClass 這個類。
基礎用法:
1.對象字符串的表示形式?
ReflectionClass::__toString ?返回 ReflectionClass對象字符串的表示形式
<?php
class MyClass {public $name='rufeii';public function printName(){echo $this->name;}
}
$class = new ReflectionClass('MyClass');
echo $class; //這里觸發了__toString魔術方法
?>
展示了類的?定義位置、屬性、方法?等信息。
Class [ class 類名 ] {
? 文件位置 @@ 路徑 行號范圍
? - 常量 [數量] { 具體常量... }
? - 靜態屬性 [數量] { 具體靜態屬性... }
? - 靜態方法 [數量] { 具體靜態方法... }
? - 普通屬性 [數量] { 具體屬性... }
? - 方法 [數量] { 具體方法... }
}
2.獲取類的名稱
(new ReflectionClass("class?"))->getName() // 獲取類名稱
<?php
class MyClass {public $name='rufeii';public function printName(){echo $this->name;}
}
$class = new ReflectionClass('MyClass');
echo $class->getName(); // MyClass
?>
3.獲取屬性名稱和屬性值?
<?php
class MyClass {public $name='rufeii';public $age=19;public function printName(){echo $this->name;}public function printAge(){echo $this->age;}
}
$class = new ReflectionClass('MyClass');
$properties = $class->getProperties();foreach ($properties as $property) {$name = $property->getName();$value = $property->getValue(new MyClass());echo "$name: $value\n";
}
?>
獲取值用到了ReflectionProperty類的方法getValue(),是因為ReflectionClass::getProperty ?#返回值是一個數組,是一個類所以還可以用來調用方法。
4.讀取類的方法和參數
<?php
class MyClass {public $name='rufeii';public $age=19;public function printName($parameter1){echo $this->name;echo $parameter1;}public function printAge($parameter2){echo $this->age;echo $parameter2;}
}
$class = new ReflectionClass('MyClass');
$a=$class->getMethods();
foreach($a as $method)
{echo $method->getName()."(";$params=$method->getParameters();foreach($params as $param){echo $param->getName().")<br>";}
}
?>
操作文件的類
目錄遍歷類
DirectoryIterator? ? ??利用版本PHP5, PHP7, PHP8
FilesystemIterator? ? ??利用版本,PHP 5且>= 5.3.0, PHP 7, PHP 8
GlobIterator? ? ? ? ? ? ?PHP 5 且>= 5.3.0, PHP 7, PHP 8
1.?DirectoryIterator
怎么去遍歷文件目錄,使用里面的__tostring()魔術方法
<?php
$dir=new DirectoryIterator("../");
foreach ($dir as $fileinfo) {echo $fileinfo."<br>";
}
?>
輸出的第一個文件是.
第二個文件..
所以如果不用循環的話出來的就是.
當然也可以用glob://協議去作為一個偽文件系統訪問接口去繞過open_basedir這個安全配置項(rce里面有個需要繞過open_basedir的)
<?php
$dir=new DirectoryIterator("glob:///*");
foreach($dir as $a){echo $a->__toString().' ';
}
?>
2.FilesystemIterator
<?php
$dir=new FilesystemIterator("../");
foreach ($dir as $fileinfo) {echo $fileinfo."<br>";
}
?>
與DirectoryIterator不同的是沒有了前面兩個沒有的東西了(.和..),那么如果我們不用循環的話,直接輸出的話,有可能也是可以獲取敏感文件的!比如web99--web114(php特性篇)-CSDN博客?這里的web109!
那么這里也是可以用glob://協議的
3.GlobIterator
GlobIterator ?繼承于DirectoryIterator而且自帶了glob,那么就可以直接使用linux的通配符
<?php$dir=new GlobIterator("../*");
foreach($dir as $a){echo $a->__toString().' ';
}
?>
那么這里同樣是沒有.和..的,所以也可以利用直接輸出$dir,說不定有用!?
文件讀取的類
SplFileObject
<?php
$content=new SplFileObject('/flag');
foreach($content as $content){echo $content." ";
}
?>
總結
簡單的水了一下,后續有機會在慢慢補吧!