JS はデータ URL をどのように理解するのでしょうか?

JS はデータ URL をどのように理解するのでしょうか?

概要

Canvas には、キャンバスをデータ URL の形式に変換する、非常によく使用されるメソッド canvas.toDataURL() があります。
通常、データ URL は画像タイプです。
次の例を見てください。

<キャンバスid="キャンバス" 高さ="2" 幅="2"></キャンバス>

var キャンバス = document.getElementById('キャンバス');
var dataURL = canvas.toDataURL();
console.log(データURL);
/*
* データ:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAACCAYAAABytg0kAAAADklEQVQYV2NkgAJGGAMAAC0AA03DhRMAAAAASUVORK5CYII=
*/

では、data:[MIME type];base64 で始まるこのデータ URL とは一体何なのでしょうか?

データ URL の使用を開始する

  • データ URL は、データで始まる特別な URL 形式です。
  • データ URL を使用すると、コンテンツ作成者はドキュメントに小さなファイルを埋め込むことができます。
  • 以前はデータURIと呼ばれていましたが、WHATWGによって名前が変更されました。

データ URL データ URL と従来の URL の違いは何ですか?

最新のブラウザは、データ URL をナビゲーションを担当する URL ではなく、一意の不透明なオリジンとして扱います。
この文章をどう理解しますか?次の例を見てください:

// データ URL

データ:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAACCAYAAABytg0kAAAADklEQVQYV2NkgAJGGAMAAC0AA03DhRMAAAAASUVORK5CYII=

// 従来の URL

https://www.google.com

上記の結果から次のことがわかります。

データ URL は従来の URL とは異なります。従来の URL は、ブラウザのアドレス バーに入力して、ターゲット アドレスに直接移動できます。一方、データ URL はデータ URL 表現であり、URL を使用してデータを表すものと理解できます。

通常、ここでのデータは画像を指します。

ブラウザのアドレスバーに入力した後、データ URL はどのように表示されますか?

通常、この URL で表される画像を見ることができます。

<!DOCTYPE html>
<html lang="ja">
  <本文>
    <キャンバスid="キャンバス"></キャンバス>
  </本文>
  <スクリプト>
    var キャンバス = document.getElementById("キャンバス");
    var ctx = canvas.getContext("2d");
    ctx.font = "48px セリフ";
    ctx.fillText("こんにちはキャンバス", 0, 75 + 24);
    var dataURL = canvas.toDataURL();
    console.log(データURL);
  </スクリプト>
</html>

データURL構文

データ URL の 4 つの部分は何ですか?

データ:[<メディアタイプ>][;base64],<データ>

構成意味
データ:プレフィックス
[<メディアタイプ>] MIMEタイプはデータのタイプを表します
[;base64]オプションのbase64識別子
<データ>データ自体

[<mediatype>] 詳細

  • mediatype は、「image/jpeg」などの MIME タイプを表す文字列です。
  • 省略した場合、デフォルトは「text/plain;charset=US-ASCII」です。
  • canvas.toDataURL() は無視されず、デフォルトの MIMIE タイプは "image/png" です。

[;base64] と <data> の詳細

  • データがプレーンテキストの場合は、テキストを埋め込むだけです (ドキュメントの種類に応じて適切なエンティティまたはエスケープを使用します)。
  • データがプレーンテキストでない場合は、base64 としてマークし、base64 でエンコードされたバイナリ データを埋め込むことができます。

一般的なデータ URL 形式

  • シンプルなテキスト/プレーンデータ
  • シンプルなテキスト/パリンデータのBase64形式
  • HTML スニペット: 通常のタグ
  • HTMLフラグメント: jsを実行するスクリプトタグ

シンプルなテキスト/プレーンデータ

「こんにちは世界」

data:,Hello%2C%20World! // MIME タイプや base64 はなく、データとデータの間には `:,` のみがあります

引用符とスペースのパーセントエンコード (URL エンコード) に注意してください。
CSV データ ("text/csv") の場合、スプレッドシートの行を区切る行末を保持するにはパーセントエンコードが必要です。

シンプルなテキスト/パリンデータのBase64形式

「こんにちは世界」

データ:text/plain;base64,SGVsbG8sIFdvcmxkIQ==

HTML スニペット: 通常のタグ

<h1>こんにちは、世界!</h1>

データ:text/html、%3Ch1%3Eこんにちは%2C%20世界!%3C%2Fh1%3E

HTMLフラグメント: jsを実行するスクリプトタグ

<script>アラート('hi');</script>

data:text/html,<script>alert('hi');</script>

js スクリプト タグを実行します。終了スクリプト タグが必要であることに注意してください。

複数言語の文字列のBase64エンコードとデコード

  • データ URL で <data> を表すために base64 を使用するのはなぜですか?
  • base64 文字列は、64 進数を使用してバイナリ データを表します。これは ASCII 文字列です。

base64 文字列は ASCII 文字のみで構成されているため URL セーフであり、データ URL の <data> に base64 が適用されます。

Unix、JavaScript、Node、Python、PHP、Java、.NET で Base64 エンコードを実装する

[email protected]

"Zm9vQGdtYWlsLmNvbQ=="

1. Unix

デコード: echo "Zm9vQGdtYWlsLmNvbQ==" | base64 -D

エンコード: echo "[email protected]" | base64

2.JavaScript

var encodingData = window.btoa("[email protected]"); // エンコード var decodedData = window.atob("Zm9vQGdtYWlsLmNvbQ=="); // デコード console.log(encodedData,decodedData)

3.ノード

//base64 エンコーディング var b = new Buffer("[email protected]");
var s = b.toString('base64')
console.log("メールコード:"+s)
//base64 デコード var b = new Buffer("Zm9vQGdtYWlsLmNvbQ==","base64")
var s = b.toString();
console.log("メールボックスのデコード:"+s)

4. パイソン

base64をインポート
base64.b64encode("[email protected]")
base64.b64デコード("Zm9vQGdtYWlsLmNvbQ==")

5.php

<?php
$a = '[email protected]';
    $b = base64_encode($a); //エンコード echo $b;
    $c = base64_decode($b); // デコード echo $c;  
?>

6.ジャワ

文字列 str = "[email protected]";
文字列 encodeStr = 新しい文字列(Base64.encode(str.getBytes()));
System.out.println(encodeStr);
文字列 decodeStr = Base64.base64Decode(encodeStr);
System.out.println(デコードStr);

7..ネット

静的void Main(文字列[] 引数)
{
    Console.WriteLine("入力:");
    var str = Console.ReadLine();
    //暗号化バイト[] EncryptionByte = Encoding.UTF8.GetBytes(str);
    var EncryptionStr = Convert.ToBase64String(EncryptionByte);

    Console.WriteLine("暗号化結果: " + EncryptionStr);

    //復号化バイト[] DecryptionByte = Convert.FromBase64String(EncryptionStr);
    var DecryptionStr = Encoding.UTF8.GetString(DecryptionByte);

    Console.WriteLine("復号化結果: " + DecryptionStr);

}

base64 の複数言語実装の詳細を理解するには、base64 文字列エンコードとデコードの複数言語実装を確認してください。

一般的なデータ URL の問題

データ URL の作成および使用時に発生する一般的な問題をいくつか示します。

data:text/html、たくさんのテキスト...<p><a name%3D"bottom">bottom</a>?arg=val

実際、それは次のことを意味します:

たくさんのテキスト...<p><a name="bottom">bottom</a>?arg=val

  • 文法
  • HTML での書式設定
  • 長さ制限
  • 例外処理の欠如
  • 文字列クエリはサポートされていません
  • 秘密の質問

文法

データ URL の形式は非常に単純なので、データの前にコンマを追加することを忘れたり、誤ってデータを base64 形式でエンコードしたりすることが起こりがちです。

HTML での書式設定

データ URL はドキュメント内のファイルを提供しますが、そのファイルは、囲んでいるドキュメントの幅に比べて非常に幅が広​​くなる場合があります。
URL として、データには空白 (改行、タブ、またはスペース) が適切にフォーマットされている必要がありますが、base64 エンコードを使用する場合は問題が発生する可能性があります。

長さ制限

Firefox は特定のフィールドのない特定の長さのデータ URL をサポートしていますが、ブラウザは特定の最大長のデータをサポートする必要はありません。たとえば、Opera 11 では、URL の長さが 65535 に制限され、データ URL の長さは 65529 に制限されます (65529 は、base64 エンコード後の <data> の長さを示します)。

主流のブラウザはデータURLの長さを制限している

  • Chrome - 現在のドキュメントの場合は 2MB。それ以外の場合、制限は任意の BLOB のメモリ内ストレージ制限です。x64 で ChromeOS または Android でない場合は 2GB、それ以外の場合は total_physical_memory / 5 (ソース)。
  • Firefox - 無制限
  • IE ≥ 9 および Edge - 4GB

出典: データプロトコル URL サイズの制限

例外処理の欠如

無効なメディア パラメータまたは 'base64' フォーマット エラーは無視されますが、エラーは報告されません。

文字列クエリはサポートされていません

データ URL のデータ部分は不透明であるため、クエリ文字列 (<url>?parameter-data など) を使用してクエリを実行すると、URL のクエリ文字列のみがデータに含まれます。つまり、クエリが無効な場合でも、クエリはデータの一部と見なされます。

秘密の質問

フィッシングなどの多くのセキュリティ問題は、データ URL と、ブラウザの最上位レベルでのその URL への移動に関連しています。
これらの問題に対処するため、Firefox 59 以降 (リリースバージョン 58 以降) では、data:// URL へのトップレベル ナビゲーションが無効になっています。

上記はJSデータURLの詳しい内容です。JSの詳細については、123WORDPRESS.COMの他の関連記事にも注目してください!

以下もご興味があるかもしれません:
  • node.js で URL に基づいて指定された画像を返す方法
  • Node.js は URL 経由でファイルを読み取ります
  • jsは最後のデジタルファイル名であるURLページIDを取得します
  • 前のURLに戻り、インターフェースのjsコードを更新します
  • JavaScript の URL コンストラクタのプロパティについて簡単に説明します。
  • js で更新せずに URL 変更を監視するサンプル コードの詳細な説明
  • JavaScript に基づいて URL パラメータを取得する 2 つの方法
  • js は URL を 16 進数の暗号化と復号化関数に変換します
  • JSでURLを開く方法を簡単に理解する
  • JavaScriptのURLオブジェクトとは何かについて話しましょう

<<:  mysql5.6.8 ソースコードのインストールプロセス

>>:  Linux で特定のユーザーにフォルダーのすべてのコンテンツを許可するにはどうすればよいですか?

推薦する

MySQL関連のツールをいくつかお勧めします

序文:インターネット技術の継続的な発展に伴い、MySQL 関連のエコシステムはますます充実し、ますま...

HTMLでカスタムタグを使用する方法

カスタム タグは XML ファイルと HTML ファイルで自由に使用できますが、いくつか注意すべき点...

便利でシンプルなMySQL関数10個

関数0. 現在の時刻を表示するコマンド: select now()。機能: 現在の時刻を表示します。...

MySQL パーティション関数の詳細な説明と例の分析

まず、データベース パーティショニングとは何でしょうか?以前、MySQL のテーブル パーティショニ...

DockerがMySQL構成実装プロセスを開始

目次実際の戦闘プロセスまずは主なコマンドと詳細を一つずつ説明しましょう起動が成功したかどうかを確認す...

Vue はデータの変更をどのように追跡しますか?

目次背景例誤解 - コールスタックを表示するためにウォッチでブレークポイントを設定する正しいアプロー...

srcまたはcss背景画像のurl値はbase64でエンコードされたコードです

ウェブ上の一部の画像の src または CSS 背景画像 URL の後に、data:image/pn...

MySQLのユーザーアカウント管理と権限管理の詳細な説明

序文MySQL の権限テーブルは、データベースの起動時にメモリにロードされます。ユーザーが ID 認...

Reactにおけるフックの一般的な使用法

目次1. フックとは何ですか? 2. フックはなぜ現れるのでしょうか? 3. よく使われるフックは何...

例を通してMySQLパーティションテーブルの原理と一般的な操作を学びます

1. パーティションテーブルの意味パーティション テーブル定義は、任意のサイズに設定できるルールに従...

初心者向け入門チュートリアル④:サブディレクトリのバインド方法

これが何を意味するのかを理解するには、まずサブディレクトリとは何かを知る必要があります。では、サブデ...

Mysql で group_concat の長さ制限を変更する方法

MySQL には、「group_concat」という関数があります。通常の使用では問題がないかもしれ...

ミニプログラム録画機能の実装

序文ミニプログラムを開発する過程では、録音機能を実装し、録音を再生し、録音をサーバーにアップロードす...

MySQL btree インデックスとハッシュ インデックスの違い

MySQL では、ほとんどのインデックス (PRIMARY KEY、UNIQUE、INDEX、FUL...