php基礎:常見函數
內建函數
文章目錄 內建函數 1、文件操作函數: 2、代碼執行函數: 3、反序列化函數: 4、數據庫操作函數: 5、類型轉換與比較函數: 6、其他常見函數:
1、文件操作函數:
include()
: 導入并執行指定的 PHP 文件。例如:include('config.php');
會導入并執行 config.php
文件中的代碼。
require()
: 類似于 include()
,但如果文件不存在,則會產生致命錯誤。
include_once()
, require_once()
: 與 include
和 require
類似,但只導入文件一次。
fopen()
: 打開一個文件或 URL。例如:$file = fopen("test.txt", "r");
會以只讀模式打開 test.txt
。
file_get_contents()
: 讀取文件的全部內容到一個字符串。例如:$content = file_get_contents("test.txt");
file_put_contents()
: 將一個字符串寫入文件。例如:file_put_contents("test.txt", "Hello World!");
2、代碼執行函數:
system()
:執行外部程序并顯示輸出。可能被用于執行系統命令。
exec()
:執行一個外部程序。返回命令執行結果的最后一行。如exec("ls -la")
可列出當前目錄的詳細內容。
shell_exec()
:通過 shell 環境執行命令,并將完整的輸出以字符串的形式返回。例如shell_exec("cat /etc/passwd")
可讀取系統密碼文件。
passthru()
:執行外部程序并顯示原始輸出。如passthru("uname -a")
可顯示系統信息。
eval()
: 執行字符串中的 PHP 代碼。例如:eval('$x = 5;');
會設置變量 $x
的值為 5。
3、反序列化函數:
4、數據庫操作函數:
mysql_query()
:執行一條 MySQL 查詢。例如mysql_query("SELECT * FROM users WHERE username = '$_GET[username]'")
。mysqli_query()
:執行一條 MySQL 查詢。與mysql_query
類似,但支持 MySQLi 擴展。如mysqli_query($conn, "SELECT * FROM users")
可查詢用戶表。PDO::query()
:執行一條 SQL 語句。使用 PDO 預處理語句可有效防止 SQL 注入。例如$pdo->query("SELECT * FROM users")
可查詢用戶表。mysql_fetch_array()
:從結果集中取得一行作為關聯數組或數字數組。如$row = mysql_fetch_array($result)
可獲取查詢結果。
5、類型轉換與比較函數:
is_numeric()
:檢查變量是否為數字或數字字符串。is_numeric("123")
→ true
;is_numeric("123a")
→ false
;is_numeric("1e3%26cat")
→ true
("1e3"
→ 1000,是合法數字開頭,后面內容被忽略,此方法用于繞過)。
//繞過
is_numeric() 要求字符串必須以數字、正負號(+/-)或小數點開頭。
結尾加空白符(%0a、%0b、%0c、%0d、%09)如果出現在字符串結尾,is_numeric() 會忽略它們并返回 true(只要前面是合法數字)。例如 "123%0a" 解碼后是 "123\n",is_numeric() 會忽略 \n,只檢查 "123"。科學計數法(如 "1e3")即使包含 e 或 E,is_numeric() 仍返回 true,但中間不能有空白符例如 "1e%0a3" 會返回 false(因為 e 和 3 被換行符隔開)。//說明%0a → 換行符(\n)%0b → 垂直制表符(\v)%0c → 換頁符(\f)%0d → 回車符(\r)%09 → 水平制表符(\t)
//示例
$input = $_GET['num'];
if (is_numeric($input)) {system("echo " . (int)$input);
} else {die("Invalid input!");
}//payload
num=1e2&cat+/etc/passwd注入失敗,&符號被URL解析為參數分隔符,導致失敗,PHP解析為:$_GET['num'] = "1e3"$_GET['cat'] = "/etc/passwd"(但代碼未使用該參數,不影響邏輯)num=1e2%23cat+/etc/passwd$_GET['num'] = "1e3&cat+/etc/passwd" is_numeric("1e3&cat+/etc/passwd"),開頭 "1e3" 是合法數字 → 返回 true。(int)"1e3&cat+/etc/passwd"轉換時遇到 & 停止,取 1(因為 e 不是數字字符)system()執行 → echo 1&cat+/etc/passwd實現代碼注入
strcmp()
:比較兩個字符串(區分大小寫)。strcmp("a", "b")
→ -1
;strcmp("b", "a")
→ 1
;strcmp("a", "a")
→ 0
;若參數非字符串(如傳入數組),返回NULL
//繞過
strcmp()要求參數必須是字符串類型。傳入數組類型時(如$_GET['pass']=array()),函數返回NULL。在弱類型比較(==)時,NULL == 0 成立,導致驗證繞過。//說明
此漏洞存在于PHP 5.x版本,PHP 7+會直接報Warning但仍返回NULL。防御方法:1. 使用===嚴格比較2. 先檢查參數類型is_string()
//示例
if (strcmp($_POST['password'], $real_password) == 0) {echo "Login success!";
}//payloadPOST: password[]=1//修復代碼if (is_string($_POST['password']) && strcmp($_POST['password'], $real_password) === 0) {echo "Login success!";}
intval()
:將變量轉換為整數類型。在轉換時會忽略非數字字符。如intval("123abc")
→ 123
;intval("abc")
→ 0
。
strval()
:把變量轉換為字符串類型。如strval(123)
會返回 字符串"123"。
floatval()
:獲取變量的浮點數值。轉換時可能存在精度丟失問題。例如floatval("3.14abc")
會返回 3.14。
==
:松散比較。比較兩個值是否相等,不比較類型。存在類型比較漏洞,可能導致不同類型的值被判定為相等。例如0 == "abc"
的結果為 true。
===
:嚴格比較。比較兩個值是否相等且類型相同。
6、其他常見函數:
isset()
:檢測變量是否已聲明且非null
。isset($undefined)
→ false
;若檢測數組鍵值,需明確指定,如isset($_GET["key"])
,常用于繞過未初始化變量的錯誤。assert()
:檢查表達式是否為真(PHP < 8.0)。assert("1==1")
→ true
;若參數可控,可能直接執行代碼(如assert("system('ls')")
)。substr()
:截取字符串的一部分。 $part = substr("HelloCTF", 5); // 返回"CTF"
trim()
:去除字符串首尾空白字符。trim(" abc ")
→ "abc"
;但無法移除中間空格file_exists()
:檢查文件是否存在。file_exists("/etc/passwd")
→ true
;可用于探測敏感文件路徑,但本身不讀文件內容。filter_var()
:過濾變量。filter_var("a@b.com", FILTER_VALIDATE_EMAIL)
→ "a@b.com"
;但某些畸形輸入可能繞過校驗(如換行符注入)。phpinfo()
:輸出 PHP 的配置信息。preg_replace()
: 執行正則表達式搜索和替換。例如:$newStr = preg_replace("/apple/i", "orange", $str);
會將 $str
中的 “apple” 替換為 “orange”。/i
匹配時不區分大小寫preg_match()
:執行正則匹配。preg_match("/^[a-z]+$/", "abc")
→ 1
;若正則表達式可控,可能觸發ReDoS或繞過過濾。die()
:輸出一條消息并退出當前腳本。例如die("Database connection failed!")
會顯示錯誤信息并終止腳本。exit()
:輸出一條消息并退出當前腳本。與die()
類似。如exit("Invalid input!")
會顯示錯誤信息并終止腳本。
本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84710.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84710.shtml
如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!