php基礎:常見函數

內建函數

文章目錄

  • 內建函數
    • 1、文件操作函數:
    • 2、代碼執行函數:
    • 3、反序列化函數:
    • 4、數據庫操作函數:
    • 5、類型轉換與比較函數:
    • 6、其他常見函數:

1、文件操作函數:

  • include(): 導入并執行指定的 PHP 文件。例如:include('config.php'); 會導入并執行 config.php 文件中的代碼。

  • require(): 類似于 include(),但如果文件不存在,則會產生致命錯誤。

  • include_once(), require_once(): 與 includerequire 類似,但只導入文件一次。

  • 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、反序列化函數:

  • unserialize():從已存儲的表示中創建 PHP 的值。

  • serialize():生成值的可存儲表示。通常與unserialize配合使用。

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")trueis_numeric("123a")falseis_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")-1strcmp("b", "a")1strcmp("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")123intval("abc")0

  • strval():把變量轉換為字符串類型。如strval(123)會返回 字符串"123"。

  • floatval():獲取變量的浮點數值。轉換時可能存在精度丟失問題。例如floatval("3.14abc")會返回 3.14。

  • ==:松散比較。比較兩個值是否相等,不比較類型。存在類型比較漏洞,可能導致不同類型的值被判定為相等。例如0 == "abc"的結果為 true。

  • ===:嚴格比較。比較兩個值是否相等且類型相同。

6、其他常見函數:

  • isset():檢測變量是否已聲明且非nullisset($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,一經查實,立即刪除!

相關文章

教程:PyCharm 中搭建多級隔離的 Poetry 環境(從 Anaconda 到項目專屬.venv)

核心思維&#xff1a;為什么需要 “多級隔離”&#xff1f; 在復雜項目中&#xff0c;環境沖突是最棘手的問題&#xff08;比如系統 Python 版本不同、依賴包版本沖突&#xff09;。通過 “Anaconda 虛擬環境 → 項目 Poetry 環境 → 工具級隔離” 的三層架構&#xff0c;實現…

Rollup vs Webpack 深度對比:前端構建工具終極指南

前端工程領域始終面臨一個根本選擇&#xff1a;如何在模塊化編碼規范與工程化構建效率之間取得最佳平衡。Rollup與Webpack分別代表著兩種不同維度的解決方案&#xff0c;本文將揭示它們的真實應用場景與核心差異。 一、核心差異全景圖&#xff08;附最新對比&#xff09; 核心能…

Module Federation 和 Native Federation 的比較

前言 Module Federation 是 Webpack 5 引入的微前端架構方案&#xff0c;允許不同獨立構建的應用在運行時動態共享模塊。 Native Federation 是 Angular 官方基于 Module Federation 理念實現的專為 Angular 優化的微前端方案。 概念解析 Module Federation (模塊聯邦) Modul…

Easy Excel

Easy Excel 一、依賴引入二、基本使用1. 定義實體類&#xff08;導入/導出共用&#xff09;2. 寫 Excel3. 讀 Excel 三、常用注解說明&#xff08;完整列表&#xff09;四、進階&#xff1a;自定義轉換器&#xff08;Converter&#xff09; 其它自定義轉換器沒生效 Easy Excel在…

iOS 26 攜眾系統重磅更新,但“蘋果智能”仍與國行無緣

美國西海岸的夏天&#xff0c;再次被蘋果點燃。一年一度的全球開發者大會 WWDC25 如期而至&#xff0c;這不僅是開發者的盛宴&#xff0c;更是全球數億蘋果用戶翹首以盼的科技春晚。今年&#xff0c;蘋果依舊為我們帶來了全家桶式的系統更新&#xff0c;包括 iOS 26、iPadOS 26…

AI高考志愿助手應用架構設計并上線實施運行

環境: AI高考志愿助手 問題描述: AI高考志愿助手應用架構設計并上線實施運行 業務需求:開發一個AI升學助手,功能是幫助用戶模擬填報高考志愿等功能,數據是歷年各專業的錄取分數線表格。數據確認: 近3年約100多萬條數據,原始數據是excel表格數據。解決方案: 一、項…

深入淺出掌握 Axios(持續更新)

在了解ajax和axios之前&#xff0c;我們先觀察一下他們是什么英文的縮寫 ajax 的名字為 asynchroanous JavaScript and XML 而axios的名稱來源于英文單詞“axis”與“I/O”的結合&#xff0c;并非直接縮寫自某個特定短語。 先導知識 在本文我們簡單的介紹一下ajax后著重講解…

windows10下搭建nfs服務器

windows10下搭建nfs服務器 有參考這篇博客 Windows10搭建NFS服務 - fuzidage - 博客園 下載 NFS Server這個app 通過網盤分享的文件&#xff1a;nfs1268 (1).exe 鏈接: https://pan.baidu.com/s/1rE4h710Uh-13kWGXvjkZzw 提取碼: mwa4 --來自百度網盤超級會員v5的分享 下載后…

npm符號鏈接

前言 最近在寫一個快應用項目&#xff0c;demo中依賴了本地文件&#xff0c;package.json如下&#xff1a; 此時 node_modules 下出現了 mysdk&#xff0c;復制整個項目&#xff0c;但是copy的項目中的node_modules并未出現該文件&#xff0c;導致報錯。 解決方案 觀察 pa…

SQL 中 IDENTITY 列的特殊處理.

SQL 處理中,遇到提示: "消息 544,級別 16,狀態 1,第 3 行 當 IDENTITY_INSERT 設置為 OFF 時,不能為表 BM 中的標識列插入顯式值。" 即當 SQL Server 表中的 ??標識列(Identity Column)?? 插入顯式值,但未啟用 IDENTITY_INSERT 選項。由此報錯,以下是詳…

網絡安全等級保護中關于SSL證書的整改如何處理?

SSL證書在網絡安全等級保護&#xff08;等保&#xff09;體系中扮演著至關重要的角色&#xff0c;是實現多個等保核心要求&#xff08;尤其是三級及以上&#xff09;的關鍵技術手段之一。其重要性主要體現在以下幾個方面&#xff1a; 滿足“身份鑒別”要求&#xff08;等保要求…

Docker容器化打造elasticsearch8.18.2集群企業實戰(含kibana+證書認證)

主機信息 主機配置4Core8GB硬盤大于80GB 主機名IP地址角色10-0-17-12310.0.17.123es-node110-0-17-15810.0.17.158es-node2kibana-15610.0.17.156kibana 一、環境準備 1. 安裝 Docker 這里就不介紹如何安裝docker了&#xff0c;本文docker版本為20 2. 主機名與網絡與內核配置…

JAVA語言的學習(Day_1)

寫一個項目并運行&#xff1a; 第一步&#xff1a;新建一個.txt文本。右擊點開用Notepad打開&#xff0c;并編輯。 編輯并保存后&#xff0c;可以在文件的查看中&#xff0c;顯示出文件的類型&#xff08;eg: .txt / .java)。將txt文本的.txt類型改為.java。 之后在下面的截…

JS 原型與原型鏈詳解

JavaScript 原型與原型鏈詳解 文章目錄 JavaScript 原型與原型鏈詳解一、基礎概念類1.1 什么是原型&#xff1f;JavaScript 中如何訪問一個對象的原型&#xff1f;1.2 構造函數、實例對象和原型對象之間的關系是什么&#xff1f;1.3 prototype 和 **proto** 的區別是什么&#…

DEVICENET轉MODBUS TCP網關連接DeviceNet數字遠程IO模塊配置案例

設備與網絡架構&#xff0c;主控設備&#xff1a;支持Modbus TCP協議的PLC&#xff08;如西門子S7-1200&#xff09;。網關設備&#xff1a;開疆智能Modbus TCP轉DeviceNet網關KJ-DVCZ-MTCPS&#xff08;需支持DeviceNet從站功能&#xff09;。目標設備&#xff1a;DeviceNet數…

Ubuntu下使用PyTurboJPEG加速圖像編解碼

目錄 一、概述 二、安裝PyTurboJPEG 三、測試 一、概述 在計算機視覺領域&#xff0c;圖像編解碼是繞不開的基礎環節。雖然 OpenCV 能解決大部分圖像處理問題&#xff0c;但在性能要求嚴苛的場景下存在短板。本文將介紹基于 libjpeg-turbo 的高效 JPEG 編解碼庫 PyTurboJPE…

MCU、MPU、GPU、Soc、DSP、FPGA、CPLD……它們到底是什么?

MCU、MPU、GPU、Soc、DSP、FPGA、CPLD…… 這些簡稱在各大論壇、會議、發布會中屢見不鮮&#xff0c;看到簡稱&#xff0c;雖然也能說出大概&#xff1b; 但要問具體是什么&#xff1f;用在什么場景&#xff1f;又有什么區別……好像還是差點意思&#xff1b;本篇文章就記錄一…

Django RBAC項目后端實戰 - 03 DRF權限控制實現

項目背景 在上一篇文章中&#xff0c;我們完成了JWT認證系統的集成。本篇文章將實現基于Redis的RBAC權限控制系統&#xff0c;為系統提供細粒度的權限控制。 開發目標 實現基于Redis的權限緩存機制開發DRF權限控制類實現權限管理API配置權限白名單 前置配置 在開始開發權限…

[網頁五子棋][用戶模塊]數據庫設計和配置(MyBatis)、約定前后端交互接口、服務器開發

文章目錄 數據庫數據庫設計配置 MyBatis1. Spring 配置2. 創建實體類3. 創建 Mapper 接口4. 使用 MyBatis 約定前后端交互接口登錄接口注冊接口獲取用戶信息 服務器開發loginregistergetUserInfo完整代碼 數據庫 數據庫設計 完成注冊登錄以及用戶分數管理 使用數據庫來保存上…

Qt/C++學習系列之列表使用記錄

Qt/C學習系列之列表使用記錄 前言列表的初始化界面初始化設置名稱獲取簡單設置 單元格存儲總結 前言 列表的使用主要基于QTableWidget控件&#xff0c;同步使用QTableWidgetItem進行單元格的設置&#xff0c;最后可以使用QAxObject進行單元格的數據讀出將數據進行存儲。接下來…