PHP 行事准则:allow_url_fopen 与 allow_url_include

news2025/4/9 5:26:06

文章目录

  • 参考
  • 环境
  • allow_url_fopen
      • allow_url_fopen 配置项
      • 操作远程文件
      • file 协议
  • allow_url_include
      • allow_url_include 配置项
  • allow_url_include 与 allow_url_fopen
      • 区别
      • 联系
      • 默认配置
      • 配置项关闭所导致异常
      • 运行时配置
          • ini_set()
          • 限制

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
PHP 官方filesystem.configuration.php
PHP 官方PHP Manual

环境

项目描述
PHP5.5.05.6.87.0.07.2.57.4.98.0.08.2.9
PHP 编辑器PhpStorm 2023.1.1(专业版)

allow_url_fopen

allow_url_fopen 配置项

allow_url_fopen 是 PHP 中的一个配置选项,它决定了 PHP 是否能够通过 URL (而非本地文件路径) 来打开文件。这个配置选项的值会影响到一些 PHP 中与文件操作相关的函数的行为,例如 fopen()file_get_contents() 。具体来说,当 allow_url_fopen 被设置为 On(开启)时,这些函数可以用来打开、读取、或者写入 远程文件。而当该配置项被设置为 Off(关闭)时,这些函数 只能用于操作本地文件

操作远程文件

allow_url_fopen 选项被设置为 On 时(目前,allow_url_fopen 选项在每一个 PHP 版本中都是 默认开启 的),PHP 能够访问和处理远程文件。例如,你可以使用 file_get_contents() 函数来读取一个远程网站的 HTML 内容。对此,请参考如下示例:

<?php


# 通过 file_get_contents() 函数获取
# 百度页面的 HTML 内容。
$content = file_get_contents('http://www.baidu.com');
var_dump($content);

执行效果

上述示例的部分输出内容如下:

string(9508) "<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="description" content="全球领先的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中文网页数据库,可以瞬间找到相关的搜索结果。"><link rel="shortcut icon" href="//www.baidu.com/favicon.ico" type="image/x-icon"><link rel="search" type="application/opensearchdescription+xml" href="//www.baidu.com/content-search.xml" title="百度搜索">
<title>百度一下,你就知道</title><style ...

file 协议

在 PHP 中,file 协议的使用不受 allow_url_fopen 配置项的控制。对此,请参考如下示例:

<?php


# 通过 allow_url_fopen 函数获取
# allow_url_fopen 配置项的值。
var_dump(ini_get('allow_url_fopen'));

# 尝试使用 file_get_contents 获取当前主机路径
# C:\Users\Public\Documents\index.php 中的内容
var_dump(file_get_contents('file:///C:\Users\Public\Documents\index.php'));

执行效果

由于 allow_url_fopen 配置项在 PHP 中默认是开启的,故在执行上述示例前请将 allow_url_fopen 配置关闭(可通过修改 PHP 配置文件 php.ini 实现)。
由于 allow_url_fopen 配置已被关闭,故首个 var_dump 语句的输出为 string(0) ""。在 allow_url_fopen 配置被关闭的状况下,file_get_contents 等函数仍能通过 file 协议对本机文件进行操作。

string(0) ""
string(35) "<?php


var_dump('Hello World');"

allow_url_include

allow_url_include 配置项

allow_url_include 是 PHP 的一个配置指令,与 allow_url_fopen 类似,但 allow_url_include 配置专门针对 PHP 的 includeinclude_oncerequirerequire_once 语句。当 allow_url_include 被设置为 On 时,PHP 允许通过 URL 的形式,从远程服务器 包含和执行 PHP 文件。对此,请参考如下示例:

http://192.168.1.8/target

首先,我在 IP 地址为 192.168.1.8 的服务器中准备了文件 target,在当前主机中通过浏览器访问该页面的效果如下:

在这里插入图片描述

开启 allow_url_include 选项

由于在 PHP8.0.0 版本中,allow_url_include 选项默认是关闭的,故需要通过修改配置文件来开启该选项。将 php.ini 配置文件中的:

allow_url_include = Off

修改为如下内容并对其进行保存。

allow_url_include = On

执行如下示例代码

<?php


include('http://192.168.1.8/target');

执行效果

由于 allow_url_include 配置项在 PHP7.4.0 版本被废弃,故在开启并使用到 allow_url_include 时,PHP 将输出提示信息 PHP Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0
在执行上述示例代码后,target 文件中的内容被 包含至当前文件且被作为 PHP 代码进行执行

PHP Deprecated:  Directive 'allow_url_include' is deprecated in Unknown on line 0
string(11) "Hello World"

若在执行上述示例代码前,未将 allow_url_include 配置项开启,则执行结果将为如下内容:

PHP Warning:  include(): http:// wrapper is disabled in the server configuration by allow_url_include=0 in C:\index.php on line 4
PHP Warning:  include(http://192.168.1.8/target): Failed to open stream: no suitable wrapper could be found in C:\index.php on line 4
PHP Warning:  include(): Failed opening 'http://192.168.1.8/target' for inclusion (include_path='.;C:\php\pear') in C:\index.php on line 4

allow_url_include 与 allow_url_fopen

区别

在开启 allow_url_include 配置项后,PHP 仅能够对远程文件进行读写等文件操作
在开启 allow_url_fopen 配置项后,PHP 将能够通过 include 等函数 将远程文件包含至当前文件并将其作为 PHP 代码进行执行

举个栗子

<?php


$target_url = 'http://192.168.1.8/target';

var_dump(file_get_contents($target_url));
include($target_url);

执行效果

在执行上述示例代码前,请将 allow_url_fopenallow_url_include 配置项开启。
由于被 allow_url_fopen 配置项影响的 file_get_contents() 函数仅能够对远程文件执行读写等文件操作,故 http://192.168.1.8/target 中的代码仅被执行了一次。

PHP Deprecated:  Directive 'allow_url_include' is deprecated in Unknown on line 0
string(33) "<?php


var_dump('Hello World');
"
string(11) "Hello World"

联系

allow_url_include 的生效依赖于 allow_url_fopen 配置项的开启。具体而言,当 allow_url_includeallow_url_fopen 两个配置项均被开启时,allow_url_include 才能够发挥作用。若仅有 allow_url_include 配置项被开启,则无法发挥 allow_url_include 配置项所起到的功能。

默认配置

PHP5.2 版本开始,allow_url_include 配置项的默认配置均为 Off,而 allow_url_fopen 配置项的默认配置始终为 On
在 PHP 的实际应用中,推荐将 allow_url_includeallow_url_fopen 配置项进行关闭,这两个配置项通常用于从远程服务器 获取和执行文件,但在某些情况下,它们可能会被恶意利用,导致安全漏洞和风险。

配置项关闭所导致异常

allow_url_includeallow_url_include 配置项的关闭导致 file_get_contentsinlcude 等函数无法访问远程文件而引发的问题都将使 PHP 引发 Warning 异常。Warning 异常的产生并不会导致 PHP 程序的立即终止。

运行时配置

ini_set()

除了 php.ini 文件之外,PHP 还允许 在脚本运行过程中通过 ini_set() 函数来动态修改某些配置选项的值,这些更改只在 当前脚本运行时生效,并不会影响全局配置。这为开发者提供了在单个脚本或应用的执行过程中调整配置的灵活性。

限制

在 PHP 中,不同配置项所能够采取的配置方法可能是不同的,并不是所有的选项都可以在运行时通过 ini_set() 函数来修改。ini_set() 函数允许你在脚本运行时动态地设置配置选项,但有些选项可能由于 安全或系统级别的限制 而不能通过 ini_set() 来修改。allow_url_includeallow_url_fopen 就是这样的配置项。

如果您需要查看某个配置项所 允许的配置方式,请访问由 PHP 官方提供的 ini.list.php 页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1063708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VulnHub Earth

一、信息收集 1.主机和端口扫描 nmap -sS 192.168.103.1/24 发现443端口有DNS解析&#xff0c;在hosts文件中添加DNS解析&#xff1a; 2.收集earth.local信息 发现有Previous Messages 37090b59030f11060b0a1b4e0000000000004312170a1b0b0e4107174f1a0b044e0a000202134e0a161…

Verilator: sh: 1: exec: < PATHNAME >: not found

事出有因 I assumed that I install verilator via git clone its source, so I need to set the export VERILATOR_ROOT. At first, due to laziness, I just copy the code directly to my ubuntu. so stupid I am!!! Then, I recoginzed that the pathname is not real, …

Opengl之立方体贴图

简单来说,立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面:一个有纹理的立方体。你可能会奇怪,这样一个立方体有什么用途呢?为什么要把6张纹理合并到一张纹理中,而不是直接使用6个单独的纹理呢?立方体贴图有一个非常有用的特性,它可以通过一…

HTML5+CSS3+移动web 前端开发入门笔记(一)

千古前端图文教程 千古前端图文教程 git的使用 Git是一个分布式版本控制系统&#xff0c;它的作用主要包括以下几个方面&#xff1a; 版本管理&#xff1a;Git可以跟踪文件的修改历史&#xff0c;记录每次提交的内容、时间和作者等信息。通过Git&#xff0c;开发人员可以轻…

波奇学C++:红黑树

红黑树性质&#xff1a; 1.每个结点不是红色就是黑色。 2.根节点是黑色 3.如果一个节点是红色&#xff0c;它的两个孩子必须是黑色 4.对于每个节点&#xff0c;从该结点到其所有后代叶结点的简单路径上&#xff0c;均包含相同数目的黑色结点 5.每个叶结点都是黑色的&#xff08…

主机ping不通虚拟机,虚拟机可以ping同主机

问题&#xff1a;主机ping不通虚拟机 虚拟机可以ping通主机(192.168.43.140)和外网&#xff08;www.baidu.com) 解决方法&#xff1a; 1.打开【控制面板】-->【网络和Internet】-->【网络连接】 2.选择VMnet8 右键【属性】 3.修改 IP地址&#xff08;I&#xff09;和 子…

1、内核加载模块

一、静态加载 1、新功能源码与内核源码一起编译进uImage文件内 新功能源码与Linux内核源码在同一目录结构下在linux-3.14/drivers/char/目录下编写hello.c文件&#xff0c;内容如下 #include <linux/module.h> #include <linux/kernel.h>int __init myhello_ini…

oracle OCP OCM MySQL OCP认证难吗?

好多人在初次考OCP时&#xff0c;不知道如何选择&#xff0c;本文让姚远ACE老师为大家总结一下吧&#xff01; 选择OCP认证时要注意的问题&#xff1a; 1&#xff0c;授课老师师资经验&#xff08;非常重要&#xff09; 2&#xff0c;课程大纲 3&#xff0c;试听课程 4&am…

零食食品经营小程序商城的作用是什么

零食几乎可以涵盖每个年龄阶段&#xff0c;同时又是市场中常见的零售批发商品&#xff0c;在多个场景中都有销售/购买属性&#xff0c;对消费者来说&#xff0c;购买零食的渠道多种多样&#xff0c;无论线下还是线上&#xff0c;都可随心而购。 庞大市场升级促进下&#xff0c…

医学影像归档与通讯系统(PACS)系统源码 PACS三维图像后处理技术

医学影像归档与通讯系统&#xff08;PACS&#xff09;系统源码 PACS三维图像处理 医学影像归档与通讯系统&#xff08;PACS&#xff09;系统&#xff0c;是一套适用于从单一影像设备到放射科室、到全院级别等各种应用规模的医学影像归档与通讯系统。PACS集患者登记、图像采集、…

国庆特别篇:中秋与国庆同日相迎

国庆特别篇&#xff1a;中秋与国庆同日相迎 国庆特别篇&#xff1a;中秋与国庆同日相迎 &#x1f389;摘要引言旅途风景分享 &#x1f5fa;️中秋团圆&#xff0c;返乡之路风景宜人的旅游胜地 技术探讨&#xff1a;Java中的可变参数 &#x1f680;什么是可变参数&#xff1f;使…

RabbitMQ集群搭建详细介绍以及解决搭建过程中的各种问题——实操型

RabbitMQ集群搭建详细介绍以及解决搭建过程中的各种问题——实操型 1. 准备工作1.1 安装RabbitMQ1.2 简单部署搭建设计1.3 参考官网 2. RabbitMQ 形成集群的方法3. 搭建RabbitMQ集群3.1 部署架构3.2 rabbitmq集群基础知识3.2.1 关于节点名称&#xff08;标识符&#xff09;3.2.…

《操作系统真象还原》 第 01 章 部署工作环境 学习笔记

0. 内容说明 本内容依据《操作系统真象还原》进行学习&#xff0c;在学习过程中&#xff0c;由于新版本和旧版本bochs存在参数差异&#xff0c;故此会出现一些调试错误。也记录对应的解决方案。 1. 需要的编译器 对于现代OS来说&#xff0c;主要使用 C语言 和 汇编语言 两种…

剑指offer——JZ26 树的子结构 解题思路与具体代码【C++】

一、题目描述与要求 树的子结构_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入两棵二叉树A&#xff0c;B&#xff0c;判断B是不是A的子结构。&#xff08;我们约定空树不是任意一个树的子结构&#xff09; 假如给定A为{8,8,7,9,2,#,#,#,#,4,7}&#xff0c;B为{8,9,2}&…

【智能家居项目】裸机版本——字体子系统 | 显示子系统

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 今天实现上图整个项目系统中的字体子系统和显示子系统。 目录 &#x1f004;设计思路&#x1…

无法启动此程序,因为计算机中“找不到msvcp140.dll”的解决方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个动态链接库文件&#xff0c;它是许多基于Visual Studio开发的应用程序和游戏的必要组件。当计算机上缺失msvcp140.dll文件时&#xff0c;可能会导致以下问题&#xff1a; 1. 程序无法启动&#xff0c;提示“找不到…

【多线程安全】死锁 锁竞争总结

下面有两段代码&#xff1a; public class test {private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {for (int i 0; i < 10000; i) {count;}});Thread t2 new Thread(() -> {for (i…

速通Redis基础(一):掌握Redis的字符串类型和命令

目录 字符串&#xff08;String&#xff09; 常见命令 SET GET MSET&MGET SETNX INCR INCRBY DECR DECRBY INCRBYFLOAT APPEND GETRANGE SETRANGE STRLEN Redis字符串类型命令总结 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的…

机器学习基础之《分类算法(8)—随机森林》

一、什么是集成学习方法 1、定义 集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型&#xff0c;各自独立地学习和作出预测。这些预测最后结合成组合预测&#xff0c;因此优于任何一个单分类的做出预测 谚语&#xff1a;三个臭皮匠顶个诸…

论文悦读(6)——PM操作系统之TreeSLS单级存储

TreeSLS &#xff08;SOSP23&#xff09; 1. 背景 (Background)1.1 内存-存储二级架构 (1, 2.1)1.2 单级架构 (2.2)1.3 总结 2. 动机 (Motivation)2.1 现有SLS性能低下 (2.3)2.2 现有SLS难以支持External Synchrony (1, 2.4)2.3 高速PM出现为SLS带来新的机遇与挑战 (1, 2.5) 3.…