DATA URL:嵌入 URL 中的数据资源

文章目录

  • 参考
  • 环境
  • 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

参考

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

环境

项目 描述
PHP 5.5.05.6.87.0.07.2.57.4.98.0.08.2.9
PHP 编辑器 PhpStorm 2023.1.1(专业版)

DATA URL

概念

DATA URL 是一种 URL 方案,它 允许我们在 URL 中直接嵌入数据,而不是指向数据所在的位置DATA URL 在网页开发中尤其有用,因为它允许我们将小型数据(例如小图标或简短文本)直接嵌入到 HTML、CSS 或 JavaScript 文件中,而不需要通过 网络连接 从服务器中获取资源。

结构

DATA URI 的一般结构如下:

data:[][;charset=][;base64],

其中:

项目 描述
DATA URL 携带数据的 MIME 类型。例如:image/pngtext/plain 等。
当 DATA URL 携带数据的数据类型是文本类型时,可以指定文本所使用的字符集。若未指定文本类型使用的编码方式,默认使用 UTF-8 字符集编码。
base64 标识 DATA URL 的携带数据是使用 Base64 进行编码的。
DATA URL 的携带数据,需要使用 DATA URL 声明的编码方式进行编码。

举个栗子

  1. 一个简单的 DATA URI,包含纯文本:

    data:text/plain;charset=UTF-8,Hello%20World!
    
  2. 使用 Base64 编码的 PNG 图片:

    data:image/png;base64,iVBORw...(此处为图片的实际编码数据)
    

DATA URL 的优缺点

DATA URL:嵌入 URL 中的数据资源_第1张图片

优点
  1. 减少 HTTP 请求
    小尺寸图片、文本等数据 直接嵌入在 URL 中,不需要通过网络连接从服务器中获取。有利于 降低服务器压力,提高 HTTP 请求的效率(HTTP 连接的建立与维护所耗费的资源多用于大型资源),从而提高网页的加载速度。
  2. 离线访问
    通过在 URL 中内联资源可以使网页变得 更加独立,能够在离线情况下访问,而不依赖于外部资源的可用性。
缺点
  1. 占用空间增大
    Base64 编码使用的字符集是 URL 兼容的,这意味着它不包含 URL 特殊字符,如问号、斜杠、等号等。因此图片等二进制资源常使用 Base64 进行编码以方便资源的传输。但 Base64 编码通常会导致数据占用空间增大约 33%,这意味着资源在 DATA URL 中占用的内存空间会比原始资源更大,可能导致性能下降(对于小型图片,将其内嵌至 URL 中能减少 HTTP 请求,提高页面加载速度)
  2. 无法被缓存
    如果多个页面或资源使用 相同的数据,使用 DATA URL 将导致数据在每个页面或资源中都被重复,而不是被缓存。
  3. 可读性和管理
    大量的 DATA URL 可能会 导致源代码难以阅读和管理

DATA URL 与图片

获取图片的 Base64 编码结果

我们将通过使用 PHP 来获取图片的 Base64 编码结果。在下述示例中,我们使用 file_get_contents() 函数获取图片的二进制内容,再通过 base64_encode() 函数将二进制内容编码为 Base64 文本。




# 获取同目录下的 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 URLtitle>
head>
<body>
    
    <img alt="Beer" src="data:image/png;base64,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"/>
body>
html>

执行效果

访问上述 HTML 页面,得到如下界面:

DATA URL:嵌入 URL 中的数据资源_第2张图片

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 的 includeinclude_oncerequirerequire_once 语句。当 allow_url_include 被设置为 On 时,PHP 允许通过 URL 的形式,从远程服务器 包含和执行 PHP 文件。

allow_url_fopen 与 allow_url_include

区别

在开启 allow_url_fopen 配置项后,PHP 仅能够对远程文件进行读写等文件操作
在开启 allow_url_include 配置项后,PHP 将能够通过 include 等函数 将远程文件包含至当前文件并将其作为 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 中的代码仅被执行了一次。

由于 allow_url_includePHP7.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) "
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 配置项进行关闭,这两个配置项通常用于从远程服务器 获取和执行文件,但在某些情况下,它们可能会被恶意利用,导致安全漏洞和风险。

DATA URL 与 allow_url_fopen 及 allow_url_inlcude

DATA URL 中的数据被 PHP 认为是远程文件,故在使用 file_get_contentsinclude 等函数时需要注意 PHP 的配置项 allow_url_fopenallow_url_include 的开启情况。

举个栗子




include('data:text/plain,);

执行效果

在执行上述示例代码时,仅开启了 allow_url_fopen 配置项。但 includerequire 等函数在处理远程文件时还需要 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, for inclusion (include_path='.;C:\php\pear') in C:\index.php on line 4

通过修改 PHP 提供的配置文件 php.iniallow_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"

你可能感兴趣的:(安全,后端,DATA,URL,data,协议,Base64,PHP,PHP,配置项)