首頁 > 軟體

PHP檔案上傳利用的常見函數總結大全

2022-03-02 13:00:13

前言

收集了幾個在檔案上傳利用中常見的函數。

對這些函數的深入理解應該有助於檔案上傳利用的順利進行。

1. deldot

deldot函數為upload-lab中一個常見的函數,它實際為一個自定義函數,定義於common.php中,函數定義如下:

function deldot($s){
	for($i = strlen($s)-1;$i>0;$i--){
		$c = substr($s,$i,1);
		if($i == strlen($s)-1 and $c != '.'){
			return $s;
		}

		if($c != '.'){
			return substr($s,0,$i+1);
		}
	}
}

即從字串的尾部開始,從後向前刪除點.,直到該字串的末尾字元不是.為止。

因此對於如下輸入,

echo deldot("hello world")."n";
echo deldot("hello world.")."n";
echo deldot("hello world....")."n";
echo deldot("hello.world.")."n";

輸出為

hello world
hello world
hello world
hello.world

2. in_array

in_array(mixed $needle, array $haystack, bool $strict = false): bool

其中第一個引數$needle為待搜尋的值,$haystack為被搜尋的陣列,第三個引數決定是否進行型別比較。

第三個型別預設為false,即不考慮型別是否相同。

對於如下輸入:

if(in_array("AAA",$arr,false)) echo 1;
if(in_array("aaa",$arr,false)) echo 2;
if(in_array("AAA",$arr,true)) echo 3;
if(in_array("aaa",$arr,true)) echo 4;

輸出

13

3. intval

intval(mixed $value, int $base = 10): int

intval 函數用於獲取變數的整數值。

第一個引數$value為要獲取整數值的變數,可以為字串、數值和陣列。
第二個引數$base指定了轉換所使用的進位制,當且僅當要轉換的變數為字串時有效。

當第二個引數為0時,會檢測變數的格式來決定使用的轉換進位制。

  • 當存在前置的0x或0X時,使用16進位制。
  • 當存在前置的0時,使用8進位制。
  • 否則使用10進位制。

intval函數返回的數值為一個int型別的數值。當轉換不成功時,返回0。

特別要注意,使用該函數返回的值有上限。當轉換的數值大於php的整數範圍時,返回的結果為整型數值的取值上限。

echo intval("111");
echo "n";
echo intval("111a");
echo "n";
echo intval("0x333");
echo "n";
echo intval("888",8);
echo "n";
echo intval("122",3);
echo "n";
echo intval("11111111111111111111111111111111111");
echo "n";
echo intval("2222222222222222222222222222222");

輸出為

111
111
0
0
17
9223372036854775807
9223372036854775807

4. strrchr

strrchr(string $haystack, mixed $needle): string

strrchr函數在字串$haystack中查詢$needle,並將最後一次查詢到的$needle及其後面的字串返回。如果沒有在該字串中查詢到$needle,則返回false。

注:

  • 如果第二個引數不是不是單個字元,則只使用該字串的第一個字元進行查詢匹配。
  • 如果第二個引數是一個數值,則將該數值轉換為對應的ASCII碼進行匹配。
$S = "hhhahahaha2333";
echo strrchr($S,'h')."n";
echo strrchr($S,'hwweraer')."n";
echo strrchr($S,104)."n";
if(strrchr($S,'k') == false) echo "false";

ha2333
ha2333
ha2333
false

5. strtolower

strtolower(string $string): string

將字串$string中的各個英文字元轉換為小寫並返回。

$S = "HaHaHaHa,Hello!!";
echo strtolower($S);

hahahaha,hello!!

6. strrpos

strrpos(string $haystack, string $needle, int $offset = 0): int

返回字元$needle最後一次出現的位置。

在php4中,$needle只能為單個字元。如果$needle中存在多個字元,僅使用第一個字元做匹配。

和strrchr相似,如果$needle是一個數值,則使用該數值對應的ASCII碼字元進行匹配。

從php5開始,$needle可以為多個字元。

從php5開始,strrpos新增一個引數$offset,可以指定從$haystack的哪兒位置開始進行匹配。

返回匹配的下標位置,沒有匹配到時返回false。

注意:

  • 因為返回值可能為零,所以在判斷返回值是否為false的時候必須使用全等於符號===。
  • 該函數區分大小寫。與該函數相似的函數有:
    • stripos:查詢首個出現的位置,不區分大小寫。
    • strpos:查詢首個出現的位置,區分大小寫。
    • strripos:查詢最後一個出現的位置,不區分大小寫。
    • 即出現“i”則為不區分大小寫,出現"rr"則為查詢最後一個。
$s = "Phpphphpphpp";
echo strrpos($s,"php");
echo strrpos($s,"h");
echo strrpos($s,"P");
if(strrpos($s,"PHP") === false) echo "No exist";

輸出:

890No exist

注:測試使用的PHP版本為5.3.3。

在PHP4中結果可能不一樣。

7. str_ireplace

str_ireplace(
    mixed $search,
    mixed $replace,
    mixed $subject,
    int &$count = ?
): mixed

str_ireplace函數用於對陣列中的元素或字串中的子串進行替換。

第一個引數$search為需要替換的內容(子串或陣列),第二個引數$replace為替換成的內容(字串或陣列),第三個引數$subject為被替換的字串。

  • 如果$search和$replace都為字串,那麼將會把$subject中匹配的子串$search替換為$replace。
  • 如果$search和$replace都為陣列時,將會進行對映替換。如果$replace的值的個數少於 search 的個數,多餘的替換將使用空字串來進行。
  • 如果$search為陣列而$replace為字串,則對於$subject中出現的每一個search的元素,都會使用$replace做替換。

$count可以用於限定替換次數。

注:

  • 替換從左到右進行。
  • 該函數替換不區分字母大小寫。(另外一個函數str_replace區分大小寫)
<?php
echo str_ireplace("php","","hello.php")."n";
echo str_ireplace("pHP","","hello.Php")."n";
echo str_ireplace("php","","hello.phPHpp")."n";
echo str_ireplace("php","p","hello.phphp")."n";
echo str_ireplace("php",""."phpphpphpphpphp.php",3)."n";
echo str_ireplace(array("php","html"),"","hello.php.html")."n";
echo str_ireplace(array("php","html"),array("1","2"),"hello.php.html")."n";
echo str_ireplace(array("php","html","css"),array("1","2"),"hello.php.css.html")."n";
echo str_ireplace(array("php","html","css"),"1","hello.php.css.html")."n";
foreach (str_ireplace(array("php","html","css"),array("1","2","3"),array("hello.html","hello.css","hello.html")) as $it){
    echo "$it ";
}
?>

hello.
hello.
hello.Hpp
hello.php
3
hello…
hello.1.2
hello.1…2
hello.1.1.1
hello.2 hello.3 hello.2

8. strstr

strstr(string $haystack, mixed $needle, bool $before_needle = false): string

查詢字串$needle在$haystack中首次出現的位置,並將$needle及其之後的字串返回。

PHP5起新增第三個引數$before_needle,如果$before_needle取值為true,則返回$needle前面的部分。

$s = "123phpphp.php";
echo strstr($s,"php")."n";
echo strstr($s,"php",true)."n";

phpphp.php
123

9. substr

substr(string $string, int $offset, ?int $length = null): string

返回字串$string中的子串。

$offset指定子串首個字元在$string中的下標位置,$length指定擷取的子串長度。

$length的取值:

  • $length為預設取值時,函數會將$offset至$length的字串擷取並返回。
  • $length取正數時,會從$offset開始將最多$length個字元擷取返回出來。
  • $length取0時,返回一個空字串。
  • $length取負數時,會將$offset至字串$string倒數第$length前的字元返回出來。
$s = "123456789";
echo substr($s,1,3)."n";
echo substr($s,1,-1)."n";
echo substr($s,1)."n";
echo substr($s,1,0)."n";

234
2345678
23456789

10. trim

trim(string $str, string $character_mask = " tnrx0B"): string

去除字串$str的首尾的空白字元。

當第二個引數保持預設時,去除的字元為:

  • " " 空格
  • “t” 製表符
  • “n” 換行符
  • “r” 回車符
  • “” 空位元組符
  • “x0B” 垂直製表符
$s = "n   1   23456789tn123456789r";
echo trim($s);

1 23456789
123456789

附PHP 檔案上傳處理

  • $_FILES["file"]["name"] 使用者端提交檔案的原名稱
  • $_FILES["file"]["type"] 瀏覽器提供的檔案的 MIME 型別,如 gif 圖片為 image/gif 。不過此型別在 PHP 端並不檢查,因此不要想當然認為有這個值
  • $_FILES["file"]["size"] 已上傳檔案的大小,單位為位元組
  • $_FILES["file"]["tmp_name"] 檔案被上傳後在伺服器端儲存的臨時檔名
  • $_FILES["file"]["error"] 和該檔案上傳相關的錯誤程式碼,為0則表示上傳成功

參考資料

PHP官方

總結

到此這篇關於PHP檔案上傳利用的常見函數的文章就介紹到這了,更多相關PHP檔案上傳常見函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com