allow_url_fopen
在php里allow_url_fopen
默认是开启allow_url_include
默认是关闭的
而且他们只能在php.ini
里设置,开始还用ini_set
试了下果然不能改
官网定义
allow_url_fopen
Whether to allow the treatment of URLs (like http:// or ftp://) as files
allow_url_include
This setting requires allow_url_fopen to be on.
官网意思是要开启allow_url_include
你也得开启allow_url_fopen
特地试了一下关闭allow_url_fopen
打开allow_url_include
好吧,官网没骗我
后来发现,好像不全是,继续看
具体作用是
Whether to allow include/require to open URLs (like http:// or ftp://) as files
就是说开了这个可以让include, include_once, require 和 require_once也都能用url和伪协议
原来官网描述这么清楚了
其他情况
但是呢
在官网上查data://
的时候,会告诉你
Attribute | Supported |
---|---|
Restricted by allow_url_fopen | No |
Restricted by allow_url_include | Yes |
———————– | ————– |
他这是告诉我用data://
只要开allow_url_include
不需要allow_url_fopen
???
实践一下
但我尝试了官网的例子,提示我
data:// wrapper is disabled in the server configuration by allow_url_fopen=0
ヾ(。`Д´。)),你骗我啊,还是要allow_url_fopen
才能使用的呀好不好
只用file_get_contents
再试验一下php://
先看php://input
<?php
ini_set('display_errors', 'On');
echo 'allow_url_fopen: '.ini_get('allow_url_fopen').'<br>'; // 0
echo 'allow_url_include: '.ini_get('allow_url_include').'<br>'; // 0
// method 1
$fp = fopen("php://input", "r");
echo fread($fp, 1024);
// method 2
echo file_get_contents("php://input");
这个php://input
什么都不需要
再看下php://filter
<?php
ini_set('display_errors', 'On');
echo 'allow_url_fopen: '.ini_get('allow_url_fopen').'<br>';
echo 'allow_url_include: '.ini_get('allow_url_include').'<br>';
echo file_get_contents("php://filter/resource=http://www.baidu.com");
要开allow_url_fopen
使用include
先都开一下
<?php
ini_set('display_errors', 'On');
echo 'allow_url_fopen: '.ini_get('allow_url_fopen').'<br>'; // 1
echo 'allow_url_include: '.ini_get('allow_url_include').'<br>'; // 1
include file_get_contents("php://input");
POST是http://www.eval.com/include/1.txt
下来都关掉
<?php
ini_set('display_errors', 'On');
echo 'allow_url_fopen: '.ini_get('allow_url_fopen').'<br>'; // 0
echo 'allow_url_include: '.ini_get('allow_url_include').'<br>'; // 0
$input = file_get_contents("php://input");
echo $input;
include $input;
POST是http://www.eval.com/include/1.txt
并不能
POST是1.txt
明显可以
感觉自己中二病犯了
其实这些不都能想的到嘛
得出来一个结论好像是确实只要用到allow_url_include
前提是你开了allow_url_fopen
另外这个php伪协议并不等同于url
,所以php://input
没有也可以用,但你要include
一个php://input
的结果,这当然就要allow_url_include
和allow_url_fopen
了
但这个data://
协议也需要allow_url_fopen
的支持有些意外
其实就是allow_url_include
是用来防护把远程的文件当做php代码执行的
而allow_url_fopen
就是为了能让url当做文件来用
以前可能确实有一个误区就是url不能用的话,php伪协议
也一定不能用,感觉他们好像是同类一样