이 글에서는 주로 PHP에서 지원하는 프로토콜과 캡슐화 프로토콜에 대한 관련 정보를 샘플 코드를 통해 자세히 소개합니다. PHP가 필요한 모든 사람이 학습하거나 사용할 수 있는 참고 자료가 될 것입니다. 아래에서 함께 배워보세요.
머리말
오늘날의 웹 프로그램 개발 기술은 ASP.NET, PHP, JSP, Perl, AJAX 등 정말 수백 가지의 사고 방식을 가지고 있습니다. 앞으로 웹 기술이 어떻게 발전하든 웹 프로그램 간 통신을 위한 기본 프로토콜을 이해하는 것은 웹 애플리케이션의 내부 작동 방식을 이해하는 데 도움이 되기 때문에 중요합니다.
PHP에는 fopen(), copy(), file_exists() 및 filesize()와 같은 파일 시스템 기능을 위한 다양한 URL 스타일 래퍼 프로토콜이 내장되어 있습니다. 이러한 패키징 프로토콜 외에도 stream_wrapper_register()를 통해 사용자 정의 패키징 프로토콜을 등록할 수도 있습니다.
참고: 캡슐화된 프로토콜을 설명하는 데 사용되는 URL 구문은cheme://... 구문만 지원합니다. Scheme:/ 및 Scheme: 구문은 지원되지 않습니다.
php 프로토콜 유형
file:// — 로컬 파일 시스템에 액세스
http:// — HTTP(s) 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 개체 파일 등을 포함할 수 있습니다.
file:// 프로토콜
file:// - Allow_url_fopen의 영향을 받지 않는 로컬 파일 시스템에 액세스합니다.
php:// 프로토콜
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()와 같은 일체형 파일 함수에 유용합니다.매개변수
Name | Description |
---|---|
resource=a4e9d082d88e35bf04d33cc1b1dbd17f | 이 매개변수는 필수입니다. 필터링하려는 데이터 스트림을 지정합니다. |
read=d6dcec333b5b6f545b4a96006cf8e622 | 이 매개변수는 선택사항입니다. 하나 이상의 필터 이름을 파이프 문자로 구분하여 설정할 수 있습니다. |
write=7de79e01b749671974df3f75edb1317d | 이 매개변수는 선택사항입니다. 하나 이상의 필터 이름을 파이프 문자로 구분하여 설정할 수 있습니다. |
8a98115743ade9be4377c4f682709849 | 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!