文章目录
- 参考
- 环境
- DATA URL
- 概念
- 结构
- DATA URL 的优缺点
- 优点
- 缺点
- DATA URL 与图片
- 获取图片的 Base64 编码结果
- 在 HTML 中应用 DATA URL 以展示图片
- DATA URL 与 allow_url_fopen 及 allow_url_include 配置项
- allow_url_fopen 配置项
- allow_url_include 配置项
- allow_url_fopen 与 allow_url_include
- 区别
- 联系
- 默认配置
- DATA URL 与 allow_url_fopen 及 allow_url_inlcude
参考
项目 | 描述 |
---|---|
搜索引擎 | Bing、Google |
AI 大模型 | 文心一言、通义千问、讯飞星火认知大模型、ChatGPT |
MDN Web Docs | Data URL |
PHP 官方 | filesystem.configuration.php |
PHP 官方 | PHP Manual |
环境
项目 | 描述 |
---|---|
PHP | 5.5.0 、5.6.8 、7.0.0 、7.2.5 、7.4.9 、8.0.0 、8.2.9 |
PHP 编辑器 | PhpStorm 2023.1.1(专业版) |
DATA URL
概念
DATA URL
是一种 URL 方案,它 允许我们在 URL 中直接嵌入数据,而不是指向数据所在的位置
。DATA URL
在网页开发中尤其有用,因为它允许我们将小型数据(例如小图标或简短文本)直接嵌入到 HTML、CSS 或 JavaScript 文件中,而不需要通过 网络连接
从服务器中获取资源。
结构
DATA URI 的一般结构如下:
data:[<mime type>][;charset=<charset>][;base64],<encoded data>
其中:
项目 | 描述 |
---|---|
<mime type> | DATA URL 携带数据的 MIME 类型。例如:image/png 、text/plain 等。 |
<charset> | 当 DATA URL 携带数据的数据类型是文本类型时,可以指定文本所使用的字符集。若未指定文本类型使用的编码方式,默认使用 UTF-8 字符集编码。 |
base64 | 标识 DATA URL 的携带数据是使用 Base64 进行编码的。 |
<encoded data> | DATA URL 的携带数据,需要使用 DATA URL 声明的编码方式进行编码。 |
举个栗子
-
一个简单的 DATA URI,包含纯文本:
data:text/plain;charset=UTF-8,Hello%20World!
-
使用 Base64 编码的 PNG 图片:
data:image/png;base64,iVBORw...(此处为图片的实际编码数据)
DATA URL 的优缺点
优点
- 减少 HTTP 请求
小尺寸图片、文本等数据直接嵌入在 URL 中
,不需要通过网络连接从服务器中获取。有利于降低服务器压力
,提高HTTP 请求的效率(HTTP 连接的建立与维护所耗费的资源多用于大型资源)
,从而提高网页的加载速度。 - 离线访问
通过在 URL 中内联资源可以使网页变得更加独立
,能够在离线情况下访问,而不依赖于外部资源的可用性。
缺点
- 占用空间增大
Base64 编码使用的字符集是 URL 兼容的
,这意味着它不包含 URL 特殊字符,如问号、斜杠、等号等。因此图片等二进制资源常使用Base64
进行编码以方便资源的传输。但 Base64 编码通常会导致数据占用空间增大约33%
,这意味着资源在 DATA URL 中占用的内存空间会比原始资源更大,可能导致性能下降(对于小型图片,将其内嵌至 URL 中能减少 HTTP 请求,提高页面加载速度)
。 - 无法被缓存
如果多个页面或资源使用相同的数据
,使用 DATA URL 将导致数据在每个页面或资源中都被重复,而不是被缓存。 - 可读性和管理
大量的 DATA URL 可能会导致源代码难以阅读和管理
。
DATA URL 与图片
获取图片的 Base64 编码结果
我们将通过使用 PHP
来获取图片的 Base64 编码结果。在下述示例中,我们使用 file_get_contents()
函数获取图片的二进制内容,再通过 base64_encode()
函数将二进制内容编码为 Base64 文本。
<?php
# 获取同目录下的 beer.png 图片的二进制数据
$binary_data = file_get_contents('./beer.png');
# 获取 beer.png 的大小
var_dump(strlen($binary_data));
# 尝试使用 Base64 将二进制数据进行编码
$result = base64_encode($binary_data);
# 将 Base64 编码结果进行输出
var_dump($result);
执行效果
由上述示例的执行结果可知,原图片所占据空间大小为 4492
字节,在通过 Base64 进行编码后,占据空间为 5992
字节。图片在进行 Base64 编码前与编码后相差 1500
字节,编码后图片约为原始图片的 133%
int(4492)
string(5992) "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"
在 HTML 中应用 DATA URL 以展示图片
在 HTML 中,img
标签用于展示图片资源。在 img 标签中,src
属性用于指定图片资源的 来源(通常是指向服务器本地的某一图片资源,在浏览器加载到此时,需要向服务器请求该资源)
。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DATA URL</title>
</head>
<body>
<!-- 通过使用 DATA URL 来展示图片 -->
<img alt="Beer" src="data:image/png;base64,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"/>
</body>
</html>
执行效果
访问上述 HTML 页面,得到如下界面:
DATA URL 与 allow_url_fopen 及 allow_url_include 配置项
allow_url_fopen 配置项
allow_url_fopen
是 PHP 中的一个配置选项,它决定了 PHP 是否能够通过 URL (而非本地文件路径)
来打开文件。这个配置选项的值会影响到一些 PHP 中与文件操作相关的函数的行为,例如 fopen()
和 file_get_contents()
。具体来说,当 allow_url_fopen
被设置为 On
(开启)时,这些函数可以用来 读取
或 写入
远程文件
。而当该配置项被设置为 Off
(关闭)时,这些函数 只能用于操作本地文件
。
allow_url_include 配置项
allow_url_include
是 PHP 的一个配置指令,与 allow_url_fopen
类似,但 allow_url_include
配置专门针对 PHP 的 include
、include_once
、 require
及 require_once
语句。当 allow_url_include
被设置为 On
时,PHP 允许通过 URL 的形式,从远程服务器 包含和执行
PHP 文件。
allow_url_fopen 与 allow_url_include
区别
在开启 allow_url_fopen
配置项后,PHP 仅能够对远程文件进行读写等文件操作
。
在开启 allow_url_include
配置项后,PHP 将能够通过 include
等函数 将远程文件包含至当前文件并将其作为 PHP 代码进行执行
。
举个栗子
<?php
$target_url = 'http://192.168.1.8/target';
var_dump(file_get_contents($target_url));
include($target_url);
执行效果
在执行上述示例代码前,请将 allow_url_fopen
与 allow_url_include
配置项开启。
由于被 allow_url_fopen
配置项影响的 file_get_contents()
函数仅能够对远程文件执行读写等文件操作,故 http://192.168.1.8/target
中的代码仅被执行了一次。
由于 allow_url_include
在 PHP7.4.0
版本中已被废弃,故在 PHP8.0.0
版本中执行上述代码时,PHP 将输出 PHP Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0
以表明 PHP 不推荐使用该配置项。
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_include
与 allow_url_fopen
两个配置项均被开启时,allow_url_include
才能够发挥作用。若仅有 allow_url_include
配置项被开启,则无法发挥 allow_url_include
配置项所起到的功能。
默认配置
自 PHP5.2
版本开始,allow_url_include
配置项的默认配置均为 Off
,而 allow_url_fopen
配置项的默认配置始终为 On
。
在 PHP 的实际应用中,推荐将 allow_url_include
与 allow_url_fopen
配置项进行关闭,这两个配置项通常用于从远程服务器 获取和执行文件
,但在某些情况下,它们可能会被恶意利用,导致安全漏洞和风险。
DATA URL 与 allow_url_fopen 及 allow_url_inlcude
DATA URL 中的数据被 PHP 认为是远程文件,故在使用 file_get_contents
、include
等函数时需要注意 PHP 的配置项 allow_url_fopen
与 allow_url_include
的开启情况。
举个栗子
<?php
include('data:text/plain,<?php var_dump("Hello WOrld");');
执行效果
在执行上述示例代码时,仅开启了 allow_url_fopen
配置项。但 include
、require
等函数在处理远程文件时还需要 allow_url_include
配置项的开启。因此,PHP 抛出了如下异常信息。
PHP Warning: include(): data:// wrapper is disabled in the server configuration by allow_url_include=0 in C:\index.php on line 4
PHP Warning: include(data:text/plain,<?php var_dump("Hello WOrld");): Failed to open stream: no suitable wrapper could be found in C:\index.php on line 4
PHP Warning: include(): Failed opening 'data:text/plain,<?php var_dump("Hello WOrld");' for inclusion (include_path='.;C:\php\pear') in C:\index.php on line 4
通过修改 PHP 提供的配置文件 php.ini
将 allow_url_include
配置项开启后,再次执行上述示例代码得到如下内容:
string(11) "Hello WOrld"
PHP Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0
嵌入 DATA URL 中的 PHP 代码被成功执行,故输出了 string(11) "Hello WOrld"
。