參考
項(xiàng)目 | 描述 |
---|---|
搜索引擎 | Bing、Google |
AI 大模型 | 文心一言、通義千問、訊飛星火認(rèn)知大模型、ChatGPT |
PHP 官方 | ini.core.php |
PHP 官方 | PHP Manual |
環(huán)境
項(xiàng)目 | 描述 |
---|---|
PHP |
5.5.0 、5.6.8 、7.0.0 、7.2.5 、7.4.9 、8.0.0 、8.2.9
|
PHP 編輯器 | PhpStorm 2023.1.1(專業(yè)版) |
PHP 偽協(xié)議
概念
在 PHP 中,偽協(xié)議(Pseudo Protocols)
也被稱為 流包裝器
,這些偽協(xié)議以 php://
開頭,后面跟著一些參數(shù),用于指定 要執(zhí)行的操作
或 需要訪問的資源
。
偽協(xié)議表明這些協(xié)議并不是一個(gè) 真實(shí)的外部協(xié)議
,例如 http
或 ftp
。PHP 偽協(xié)議的出現(xiàn)是為了提供一個(gè) 統(tǒng)一的
、簡潔的
接口來處理 不同的數(shù)據(jù)流
。這些偽協(xié)議可以被看作是一種 橋梁
,它們允許開發(fā)者 使用常規(guī)的文件操作函數(shù)來處理各種不同的數(shù)據(jù)流
。
為什么需要 PHP 偽協(xié)議?
PHP 所提供的偽協(xié)議帶來的優(yōu)點(diǎn)整理如下:
項(xiàng)目 | 描述 |
---|---|
一致性 | 開發(fā)者 不必為不同的數(shù)據(jù)流編寫特定的處理代碼 。通過使用偽協(xié)議,開發(fā)者能夠使用 熟悉的 、標(biāo)準(zhǔn)的 文件操作函數(shù)來處理各種數(shù)據(jù)。 |
靈活性 | 偽協(xié)議提供了 多種不同的方式來訪問和處理數(shù)據(jù) 。例如 ,您可以使用 php://stdin 和 php://stdout 來處理標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出;使用 php://memory 和 php://temp 來在內(nèi)存中或臨時(shí)文件中處理數(shù)據(jù)。這種靈活性允許開發(fā)人員根據(jù)具體需求選擇最合適的方式來處理數(shù)據(jù)。 |
優(yōu)化工作流 |
php://input 偽協(xié)議可以 直接讀取原始的 POST 數(shù)據(jù) ,而不需要依賴特定的全局變量,這樣可以在不同的上下文中更靈活地處理輸入數(shù)據(jù);php://temp 和 php://memory 偽協(xié)議允許在內(nèi)存中 創(chuàng)建臨時(shí)數(shù)據(jù)流 ,而 無需實(shí)際文件存儲 。這對于處理臨時(shí)數(shù)據(jù)或進(jìn)行中間數(shù)據(jù)處理非常有用,而 不會產(chǎn)生硬盤 I/O 開銷。 |
php://input
為什么需要 php://input?
php://input
是 PHP 提供的一個(gè)偽協(xié)議,允許開發(fā)者 訪問 POST 請求的原始內(nèi)容
。對于 POST 請求數(shù)據(jù),PHP 提供了 $_POST
與 $FILES
超全局變量,在客戶端發(fā)起 POST 請求時(shí),PHP 將自動處理 POST 提交的數(shù)據(jù)并將處理結(jié)果存放至 $_POST 與 $FILES 中
。既然 PHP 已經(jīng)提供了 更為高效的 $_POST 與 $FILES
,為什么還要給出 php://input
偽協(xié)議來訪問原始 POST 請求數(shù)據(jù)呢???
更靈活的數(shù)據(jù)處理
PHP 的 默認(rèn)行為
是自動解析 POST 數(shù)據(jù),并將解析結(jié)果填充至 $_POST
和 $_FILES
超全局變量中。但在現(xiàn)代的 WEB 開發(fā)中,存在許多常用的數(shù)據(jù)格式,例如 JSON
、XML
。通過 php://input
,開發(fā)者可以直接訪問這些數(shù)據(jù),然后 根據(jù)需要進(jìn)行適當(dāng)?shù)奶幚砗徒馕?/code>。
減小性能壓力
在某些情況下,可能 不需要一次性處理整個(gè) POST 數(shù)據(jù)
,或者希望以流的方式處理數(shù)據(jù)以 節(jié)省內(nèi)存
。在使用 php://input
讀取 POST 原始數(shù)據(jù)的過程中,可以使用 流處理函數(shù)進(jìn)行逐塊讀取
,而不是一次性將 POST 數(shù)據(jù)加載至內(nèi)存中。
發(fā)送 POST 數(shù)據(jù)
由于 php://input
與 POST 存在關(guān)聯(lián),為了方便后續(xù)的研究,我們需要一個(gè)工具來發(fā)起 POST 請求。推薦使用瀏覽器插件 HackBar
。
HackBar
Hackbar
是一個(gè) 瀏覽器擴(kuò)展
,該擴(kuò)展工具為安全專家、滲透測試人員和開發(fā)人員提供了一組工具,用于測試和評估 Web 應(yīng)用程序的安全性
。HackBar
可以幫助用戶識別潛在的安全漏洞,進(jìn)行滲透測試,以及執(zhí)行各種與網(wǎng)絡(luò)安全相關(guān)的任務(wù)。以下是 Hackbar 的一些 主要
特點(diǎn)和功能:
-
HTTP 請求和響應(yīng)攔截
HackBar 允許用戶查看編輯瀏覽器發(fā)送的 HTTP 請求報(bào)文及接收到的 HTTP 響應(yīng)報(bào)文
。在需要的時(shí)候,你可以通過修改 HTTP 請求報(bào)文
來實(shí)現(xiàn)對請求的精細(xì)化控制
。 -
Cookie 編輯和管理
HackBar 允許用戶輕松編輯和管理瀏覽器中的 Cookie,這對于模擬不同的用戶會話非常有用。 -
表單處理
HackBar 提供了表單提交和數(shù)據(jù)包裝功能,以幫助用戶測試應(yīng)用程序的輸入驗(yàn)證和表單處理。你可以手動構(gòu)建 POST 或 GET 請求,并查看服務(wù)器對此進(jìn)行的響應(yīng)
。 -
編碼和加密工具
HackBar 包括一些編碼和加密工具,可用于處理Base64
、MD5
、SHA1
等的相關(guān)數(shù)據(jù)。 -
XSS 攻擊測試
HackBar 提供了一些工具,用于檢測和測試跨站腳本(XSS)漏洞
。 -
SQL 注入測試
HackBar 還包括用于測試 SQL 注入漏洞
的工具,可以幫助用戶評估 Web 應(yīng)用程序的數(shù)據(jù)庫安全性。
由于微軟的 Edge
瀏覽器的插件官網(wǎng)沒有提供 HackBar
這款擴(kuò)展工具,而 Google 的 Chrome
瀏覽器的插件官網(wǎng)由需要科學(xué)上網(wǎng),所以推薦需要這款插件的朋友可以使用 Firefox
瀏覽器。
HackBar 插件的獲取
首先,打開 Firefox
瀏覽器并進(jìn)入其 插件官網(wǎng),搜索插件 HackBar
,你將得到如下類似界面。
選擇圖中 紅色箭頭指向的兩個(gè)插件中的其中一個(gè)
進(jìn)行安裝即可。
$_POST
<?php
# 超全局變量 $_POST 保持著一個(gè)關(guān)聯(lián)數(shù)組
var_dump($_POST);
# 輸出一個(gè)具有換行功能的 HTML 標(biāo)簽
echo '</br>';
# 獲取名為 X 的 POST 參數(shù)的值
var_dump($_POST['X']);
訪問上述 PHP 頁面,你將得到如下內(nèi)容:
PHP 解釋器拋出了 Notice
異常信息,這是由于我們還未提交 POST
數(shù)據(jù),導(dǎo)致 $_POST['X']
正在 嘗試訪問一個(gè)不存在的元素
從而引發(fā)了異常。
打開 HackBar 插件
右鍵
當(dāng)前頁面,得到如下類似界面:
點(diǎn)擊其中的 檢查
,得到如下類似界面:
選擇其中的 HackBar
分欄,得到如下類似界面:
通過 HackBar 插件發(fā)起 POST 請求
點(diǎn)擊 LOAD
按鈕 加載與當(dāng)前頁面相關(guān)的 URL 至輸入框中
,當(dāng)然你也可以自己輸入 URL,URL 所指向的頁面是插件將處理的頁面,不一定需要是當(dāng)前頁面的 URL。
點(diǎn)擊 Use POST method
旁邊的按鈕嘗試進(jìn)行 POST 請求,enctype
下拉框中提供了 可供選擇的 POST 請求數(shù)據(jù)的編碼方式
。
默認(rèn)選項(xiàng) application/x-www-form-urlencode
允許我們使用 同 URL 查詢字符串相同的格式編寫 POST 數(shù)據(jù)
。于是構(gòu)造如下 POST 數(shù)據(jù):
name=RedHeart&X=BinaryMoon&special_symbol=%26%25%24
點(diǎn)擊 EXECUTE
發(fā)起請求,得到如下類似界面:
基操
php://input
提供了一個(gè)方式來 讀取 POST 請求
的原始內(nèi)容。對此,請參考如下實(shí)例:
index.php
<?php
# 嘗試通過 php://input 協(xié)議獲取原始 POST 數(shù)據(jù)
$raw_data = file_get_contents('php://input');
var_dump($raw_data);
# 通過輸出 HTML 標(biāo)簽 </br> 實(shí)現(xiàn)換行功能
echo '</br>';
# 經(jīng) PHP 整理的 POST 數(shù)據(jù)
var_dump($_POST);
執(zhí)行效果
在執(zhí)行上述示例程序后,php://input
獲取了 POST 請求過程中提交的原始數(shù)據(jù),而 $_POST
則提供了一個(gè)經(jīng) PHP 處理 POST 數(shù)據(jù)后得到的關(guān)聯(lián)數(shù)組。
enable_post_data_reading
enable_post_data_reading 配置項(xiàng)
enable_post_data_reading
是 PHP 中的一個(gè)布爾配置項(xiàng),該配置項(xiàng)決定了 是否在 PHP 啟動時(shí)讀取和解析 POST 數(shù)據(jù)以填充 $_POST 與 $_FILES 超全局變量
。在 默認(rèn)情況
下,enable_post_data_reading 是 開啟
的。
為什么 PHP 要提供 enable_post_data_reading 配置項(xiàng)?
減小性能壓力
在使用 php://input
讀取 POST 原始數(shù)據(jù)的過程中,可以使用 流處理函數(shù)進(jìn)行逐塊讀取
,而不是一次性將 POST 數(shù)據(jù)加載至內(nèi)存中。而通過將 enable_post_data_reading
配置項(xiàng)關(guān)閉,則可以防止 PHP 的讀取與解析。否則,即使您通過 php://input
以流的形式逐塊讀取,PHP 也將一次性讀取并將 POST 數(shù)據(jù)解析至 $_POST
與 $_FILES
超全局變量中。
使得 php://input 能夠獲取 multipart/form-data 類型的 POST 數(shù)據(jù)
multipart/form-data
multipart/form-data
POST 請求中的一種 Content-Type
,常用于與文件上傳相關(guān)的數(shù)據(jù)傳輸。multipart/form-data
允許你將表單中的內(nèi)容編碼為多個(gè)部分的 主體(HTTP 請求體)
,每一部分通常代表一個(gè)表單字段,每個(gè)部分都包含自己的 頭部信息和數(shù)據(jù)
。
為了更好地理解 multipart/form-data
,我們可以逐步分解它:
-
multipart
multipart
意味著 POST 主體中包含多個(gè)數(shù)據(jù)部分,每個(gè)部分之間通過邊界進(jìn)行分隔。 -
form-data
form-data
表明數(shù)據(jù)來源于一個(gè)HTML 表單
。 -
邊界
當(dāng)指定multipart/form-data
作為內(nèi)容類型時(shí),會有一個(gè)boundary
參數(shù)與之關(guān)聯(lián)。boundary 參數(shù)用于指定邊界,邊界是一個(gè)隨機(jī)生成的字符串,與消息主體的任何部分沖突。 -
每個(gè)部分的大致結(jié)構(gòu)
POST 數(shù)據(jù)(HTTP 請求體)
的每個(gè)部分都有自己的一組頭部信息(HTTP 請求頭)
,后跟一個(gè)空行和數(shù)據(jù)。- 對于普通的表單字段,數(shù)據(jù)就是字段的值。
- 對于文件上傳等功能,數(shù)據(jù)是文件的描述信息及文件所包含的內(nèi)容。
舉個(gè)栗子
假設(shè)你有一個(gè)表單,其中包含一個(gè)名為 username
的文本字段和一個(gè)名為 profile_picture
的文件字段。當(dāng)用戶填寫 Alice
并上傳一張圖片后,HTTP 請求報(bào)文可能如下:
POST /submit HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"
Alice
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="profile_picture"; filename="alice.jpg"
Content-Type: image/jpeg
[raw image data here]
------WebKitFormBoundary7MA4YWxkTrZu0gW--
在上述示例中:
-
boundary
參數(shù)是----WebKitFormBoundary7MA4YWxkTrZu0gW
。 - 消息主體包含兩個(gè)部分,一個(gè)是
username
字段,一個(gè)是profile_picture
字段。 - 每個(gè)部分由邊界、一組頭部信息、空行以及數(shù)據(jù)組成。
- 消息主體的末尾存在一個(gè)
結(jié)束邊界
,它是開始邊界與兩個(gè)連字符(--)
的組合。
原因
在開啟 enable_post_data_reading
配置項(xiàng)時(shí),$_POST
、$_FILES
及 php://input
將共同發(fā)揮作用。但在 Content-Type
為 mulltipart/form-data
時(shí),php://input
將無法獲取到任何數(shù)據(jù),PHP 將客戶端發(fā)送的數(shù)據(jù) 解析存儲至
$_FILES
與 $_POST
中。
若將 enable_post_data_reading
配置項(xiàng)關(guān)閉,則 $_POST
與 $_FILES
將無法獲取到客戶端傳遞的任何 POST
數(shù)據(jù)。在 Content-Type
為 mulltipart/form-data
時(shí),php://input
將獲取到 POST 傳遞的原始數(shù)據(jù)。
不必要的 POST
php://input
的獨(dú)立性
在 PHP 中,php://input
是一個(gè)只讀流,它允許你訪問原始的 HTTP 請求體。這個(gè)特性是獨(dú)立于 HTTP 請求的方法的,意味著它不僅可以在 POST 請求中使用,也可以在 GET 或其他 HTTP 方法的請求中使用。
通常,我們將 php://input
與 POST 請求關(guān)聯(lián)起來,因?yàn)?POST 請求常用于提交表單數(shù)據(jù)或上傳文件,這些數(shù)據(jù)通常包含在請求體中。然而,php://input
的使用并不限于 POST 請求。無論是 GET、PUT、DELETE,還是其他 HTTP 方法,只要請求包含了請求體,php://input
都可以用來訪問這些數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-771955.html
GET 請求也可以攜帶請求體
值得注意的是,GET 請求通常不包含請求體,因?yàn)?GET 方法主要用于從服務(wù)器檢索數(shù)據(jù),其數(shù)據(jù)通常通過 URL 的查詢字符串傳遞。然而,技術(shù)上講,HTTP 規(guī)范并沒有禁止 GET 請求攜帶請求體,雖然這不是常見的做法。如果一個(gè) GET 請求異常地包含了請求體,那么 php://input
仍然可以用來訪問這些數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-771955.html
到了這里,關(guān)于PHP 偽協(xié)議:使用 php://input 訪問原始 POST 數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!