この記事では、主に PHP でサポートされているプロトコルとカプセル化プロトコルに関する関連情報をサンプル コードを通じて詳しく紹介します。PHP を必要とするすべての人にとって、学習の参考となる価値があります。以下に従ってください。一緒に学びましょう。
はじめに
今日の Web プログラム開発テクノロジーは、ASP.NET、PHP、JSP、Perl、AJAX など、まさに百家争鳴です。 Web テクノロジーが将来どのように発展しても、Web プログラム間の通信の基本プロトコルを理解することは、Web アプリケーションの内部動作を理解できるようになるため重要です。
PHP には、fopen()、copy()、file_exists()、filesize() などのファイル システム関数用の URL スタイル ラッパー プロトコルが多数組み込まれています。 これらのパッケージング プロトコルに加えて、stream_wrapper_register() を介してカスタム パッケージング プロトコルを登録することもできます。
注: カプセル化されたプロトコルを記述するために使用される URL 構文は、scheme://... 構文のみをサポートします。スキーム:/ およびスキーム: 構文はサポートされていません。
phpプロトコルタイプ
file:// — ローカルファイルシステムにアクセスします
http:// — HTTP URLにアクセスします
ftp:// — FTPにアクセスします) ) URL
php:// — 個々の入出力ストリーム (I/O ストリーム) にアクセスします
zlib:// — 圧縮ストリーム
data:// — データ (RFC 2397)
glob:// — 一致するファイル パス パターンを検索します
phar:// — PHP アーカイブ
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — オーディオ ストリーム
expect:// — インタラクティブ ストリームの処理
PHP.ini
allow_url_fopen: on デフォルトでは、このオプションは URL をアクティブにするためにオンになっています。 fopen カプセル化プロトコルの形式により、URL オブジェクト ファイルなどへのアクセスが可能になります。
allow_url_include: off はデフォルトでオフになっています。このオプションがオンの場合、URL オブジェクト ファイルなどの組み込みが許可されます。ローカル ファイル システムにアクセスします (allow_url_fopen の影響を受けません)。
php:// — 各入力/出力ストリーム (I/O ストリーム) にアクセスします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://stdout
http://127.0.0.1/code/1.php?file=file:///E:\phpStudy\WWW\code\phpinfo.php
php://filter
最も一般的に使用される疑似プロトコル。通常、任意のファイルを読み取るために使用できます。 php://filter は、データ ストリームが開かれたときにアプリケーションをフィルタリングするために設計されたメタラッパーです。 これは、ストリームのコンテンツが読み取られる前に追加のフィルターを適用する機会がない、readfile()、file()、file_get_contents() などのオールインワン ファイル関数に役立ちます。パラメータ
名前 | 説明 |
---|---|
resource=<フィルタリングされるデータストリーム> | このパラメータは必須です。フィルタリングするデータ ストリームを指定します。 |
read=<チェーンフィルタリストの読み取り> | このパラメータはオプションです。 1 つ以上のフィルター名をパイプ文字で区切って設定できます。 |
write=<チェーンフィルタリストの書き込み> | このパラメータはオプションです。 1 つ以上のフィルター名をパイプ文字で区切って設定できます。 |
<両方のチェーンのフィルタ リスト> | 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
php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
allow_url_fopen :off/on
allow_url_include:on
zip://, bzip2://, zlib://协议
zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;
zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。
allow_url_fopen :off/on
allow_url_include:off/on
使用方法
zip://archive.zip#dir/file.txt
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
测试
先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。
由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。
http://127.0.0.1/code/1.php?file=zip://E:\phpStudy\WWW\code/1.zip%231.txt
data://协议
data://协议必须双在on才能正常使用;
allow_url_fopen :on
allow_url_include:on
http://127.0.0.1/code/1.php?file=data://text/plain,<?php phpinfo()?> http://127.0.0.1/code/1.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
glob://协议
glob:// — 查找匹配的文件路径模式
<?php $it = new DirectoryIterator($_GET['file']); foreach($it as $f) { printf("%s", $f->getFilename()); echo'</br>'; } ?>
expect://协议
expect:// — 处理交互式的流
该封装协议默认未开启
为了使用 expect:// 封装器,你必须安装 » PECL 上的 » Expect 扩展。
用法
expect://command
附:HTTP协议是无状态的和Connection: keep-alive的区别
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间
总结
Reference
PHP
php伪协议实现命令执行的七种姿势
以上がPHP でサポートされているプロトコルとカプセル化プロトコルの概要 (推奨)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。