文章目錄
- extract函數介紹
- extract函數使用
- extract變量覆寫案例題
extract函數介紹
首先看一下函數文法:
extract(array,extract_rules,prefix)
參數 | 描述 |
---|---|
array | 必需。規定要使用的數組。 |
extract_rules | 可選。extract() 函數将檢查每個鍵名是否為合法的變量名,同時也檢查和符号表中已存在的變量名是否沖突。對不合法和沖突的鍵名的處理将根據此參數決定。 可能的值: EXTR_OVERWRITE - 預設。如果有沖突,則覆寫已有的變量。 EXTR_SKIP - 如果有沖突,不覆寫已有的變量。 EXTR_PREFIX_SAME - 如果有沖突,在變量名前加上字首 prefix。 EXTR_PREFIX_ALL - 給所有變量名加上字首 prefix。 EXTR_PREFIX_INVALID - 僅在不合法或數字變量名前加上字首 prefix。 EXTR_IF_EXISTS - 僅在目前符号表中已有同名變量時,覆寫它們的值。其它的都不處理。 EXTR_PREFIX_IF_EXISTS - 僅在目前符号表中已有同名變量時,建立附加了字首的變量名,其它的都不處理。 EXTR_REFS - 将變量作為引用提取。導入的變量仍然引用了數組參數的值。 |
prefix | 可選。請注意 prefix 僅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 時需要。如果附加了字首後的結果不是合法的變量名,将不會導入到符号表中。 字首和數組鍵名之間會自動加上一個下劃線。 |
extract函數使用
看w3school給出的執行個體代碼如下:
<?php
$a = "Original";
$my_array = array("a" => "Cat", "b" => "Dog", "c" => "Horse");
extract($my_array, EXTR_PREFIX_SAME, "dup");
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a";
?>
傳回結果為:
$a = Original; $b = Dog; $c = Horse; $dup_a = Cat
檢視上述函數介紹可以了解,此執行個體extract函數作用将鍵和值注冊成變量和值,且EXTR_PREFIX_SAME設定是如果變量沖突,就加上後面的字首也就是dup,是以變量a不變,産生新的變量dup_a被指派為cat
extract變量覆寫案例題
題目代碼如下:
<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));
if($shiyan==$content)
{
echo'ctf{xxx}';
}
else
{
echo'Oh.no';
}
}
?>
結合上述知識點可以了解,extract不帶參數會預設覆寫變量,最後是shiyan和content值相等輸出flag,構造請求如下
http://192.168.81.120/01.php?flag=&shiyan=
可以看到輸出flag
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iNwYWNyEDOjJWMwMzNxQDZzYzNjRTYwQ2M5UDM2EmNk9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)