allow_url_fopen

Author Avatar
Aryb1n 7月 17, 2017

在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_includeallow_url_fopen

但这个data://协议也需要allow_url_fopen的支持有些意外

其实就是allow_url_include是用来防护把远程的文件当做php代码执行的
allow_url_fopen就是为了能让url当做文件来用

以前可能确实有一个误区就是url不能用的话,php伪协议也一定不能用,感觉他们好像是同类一样