PHP 行事准则:allow_url_fopen 与 allow_url_include

2023-10-06 16:56

本文主要是介绍PHP 行事准则:allow_url_fopen 与 allow_url_include,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 参考
  • 环境
  • 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) "<?phpvar_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

执行如下示例代码

<?phpinclude('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) "<?phpvar_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 页面。

这篇关于PHP 行事准则:allow_url_fopen 与 allow_url_include的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/153529

相关文章

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们

php中json_decode()和json_encode()

1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode — 对 JSON 格式的字符串进行编码 说明 mixed json_decode ( string $json [, bool $assoc ] ) 接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 参数 json

如何将文件夹里的PHP代码放到一个文件里

find ./dir -name "*.php" -exec 'cat' {} \; > dir.out

PHP抓取网站图片脚本

方法一: <?phpheader("Content-type:image/jpeg"); class download_image{function read_url($str) { $file=fopen($str,"r");$result = ''; while(!feof($file)) { $result.=fgets($file,9999); } fclose($file); re

PHP防止SQL注入详解及防范

SQL 注入是PHP应用中最常见的漏洞之一。事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞。 一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。这两个重要的步骤缺一不可,需要同时加以特别关注以减少程序错误。 对于攻击者来说,进行SQL注入攻击需要思考和试验,对数据库方案进行有根有据的推理非常有必要(当然假设攻击者看不到你的

PHP防止SQL注入的方法(2)

如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子: $unsafe_variable = $_POST['user_input'];mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 这是因为用户可以输入类似VALUE”); DROP TA

PHP防止SQL注入的方法(1)

(1)mysql_real_escape_string – 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count(*) as ctr from users where username ='".mysql_real_escape_string($username)."' and password='". mysql_r

Linux系统安装php开发环境

Linux系统centos6.5 PHP5.6 MySQL5.6 Nginx1.7 yum安装依赖库 yum install -y make cmake gcc gcc-c++ autoconf automake libpng-devel libjpeg-devel zlib libxml2-devel ncurses-devel bison \libtool-ltdl-devel li

PHP字符串全排列

方法一: $str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) {if($k == $m){ echo join('',$ar), PHP_EOL;}else {for($i=$k; $i<=$m; $i++) {swap($ar[$k], $ar[$i]);perm($ar