前言
當今web程序的開發技術真是百家爭鳴,ASP.NET, PHP, JSP,Perl, AJAX 等等。 無論Web技術在未來如何發展,理解Web程序之間通信的基本協議相當重要, 因為它讓我們理解了Web應用程序的內部工作。
PHP 帶有很多內置 URL 風格的封裝協議,可用于類似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系統函數。 除了這些封裝協議,還能通過 stream_wrapper_register() 來注冊自定義的封裝協議。
Note: 用于描述一個封裝協議的 URL 語法僅支持 scheme://... 的語法。 scheme:/ 和 scheme: 語法是不支持的。
php協議類型
- file:// — 訪問本地文件系統
- http:// — 訪問 HTTP(s) 網址
- ftp:// — 訪問 FTP(s) URLs
- php:// — 訪問各個輸入/輸出流(I/O streams)
- zlib:// — 壓縮流
- data:// — 數據(RFC 2397)
- glob:// — 查找匹配的文件路徑模式
- phar:// — PHP 歸檔
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音頻流
- expect:// — 處理交互式的流
PHP.ini
- allow_url_fopen :on 默認開啟 該選項為on便是激活了 URL 形式的 fopen 封裝協議使得可以訪問 URL 對象文件等。
- allow_url_include:off 默認關閉,該選項為on便是允許 包含URL 對象文件等
file://協議
file:// — 訪問本地文件系統,不受allow_url_fopen與allow_url_include的影響
使用方法
file:// [文件的絕對路徑和文件名]
http://127.0.0.1/code/1.php?file=file:///E:\phpStudy\WWW\code\phpinfo.php
php://協議
php:// — 訪問各個輸入/輸出流(I/O streams)
不需要開啟allow_url_fopen,僅php://input、 php://stdin、 php://memory 和 php://temp 需要開啟allow_url_include。
php://stdin, php://stdout 和 php://stderr
php://stdin、php://stdout 和 php://stderr 允許直接訪問 PHP 進程相應的輸入或者輸出流。
php://stdin 是只讀的, php://stdout 和 php://stderr 是只寫的。
php://stdin
<?php while($line = fopen('php://stdin','r')) {//open our file pointer to read from stdin echo $line."\n"; echo fgets($line);//讀取 } ?>
php://stdout
<?php $fd = fopen('php://stdout', 'w'); if ($fd) { echo $fd."\n"; fwrite($fd, "test"); fwrite($fd, "\n"); fclose($fd); } ?>
php://stderr
<?php $stderr = fopen( 'php://stderr', 'w' ); echo $stderr."\n"; fwrite($stderr, "uknow" ); fclose($stderr); ?>
php://filter
最常使用的一個偽協議,一般可以利用進行任意文件讀取。
php://filter 是一種元封裝器, 設計用于數據流打開時的篩選過濾應用。 這對于一體式(all-in-one)的文件函數非常有用,類似 readfile()、 file() 和 file_get_contents(), 在數據流內容讀取之前沒有機會應用其他過濾器。
參數
名稱 | 描述 |
---|---|
resource=<要過濾的數據流> | 這個參數是必須的。它指定了你要篩選過濾的數據流。 |
read=<讀鏈的篩選列表> | 該參數可選。可以設定一個或多個過濾器名稱,以管道符分隔。 |
write=<寫鏈的篩選列表> | 該參數可選。可以設定一個或多個過濾器名稱,以管道符分隔。 |
<;兩個鏈的篩選列表> | 任何沒有以 read= 或 write= 作前綴 的篩選器列表會視情況應用于讀或寫鏈。 |
<?php include($_GET['file']) ?>
http://127.0.0.1/code/1.php?file=php://filter/read=convert.base64-encode/resource=./phpinfo.php
php://input