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 で特定のユーザーにフォルダーのすべてのコンテンツを許可するにはどうすればよいですか?

推薦する

Dockerが新しいイメージをロードした後にリポジトリとタグ名が両方ともnoneになる問題を解決する

次のコマンドを使用できます: docker tag [イメージID] [名前]:[バージョン]例えば...

JavaScript で長い画像のスクロール効果を実装する

この記事では、JavaScriptの長い画像スクロールの具体的なコードを参考までに共有します。具体的...

MYSQL メタデータ ロック (MDL ロック) MDL ロックの問題分析

1. はじめにMYSQL の MDL ロックは常に頭痛の種でした。ロックについて話すとき、通常は I...

HTMLページでチェックボックスを操作する方法

チェックボックスは Web ページで非常によく使用されます。e コマースの Web サイトでもプラッ...

Linux で Squid プロキシ サーバーを構築するための完全な手順

序文この記事では、Linux で Squid プロキシ サーバーを設定することに関する関連コンテンツ...

Vue3の一般的なAPIの使用方法の紹介

目次ライフサイクルの変化反応的な参照vue2.x では ref を使用して要素タグを取得します。vu...

ブラウザでのjsのイベントループイベントキューの詳細な説明

目次序文スタックと2つのキューを理解する実行プロセス簡単な例より難しい例要約する序文以下の内容はブラ...

Dockerコンテナ内の設定ファイルの変更の実装

1. コンテナに入るdocker run [オプション] イメージ名 [起動コンテナに渡されるコマン...

タブバーのいくつかの実装方法(推奨)

タブ: カテゴリ + 説明タグバー: カテゴリ => ユーザーに現在地と目的地を知らせる1. ...

Linux クラウド サーバーに JDK と Tomcat をインストールするための詳細な手順 (推奨)

JDKをダウンロードしてインストールするステップ 1: まず、公式 Web サイト http://...

JS 矢印関数に適さないシナリオは何ですか?

目次概要オブジェクトにメソッドを定義するオブジェクトリテラルオブジェクトプロトタイプ動的コンテキスト...

AWS無料サーバーアプリケーションとネットワークプロキシ設定チュートリアルの詳細な説明

目次予防必要条件AWSアカウントを申請する仮想マシンの申請と有効化仮想マシンを申請するセキュリティグ...

CSS3はシームレスなスクロールと手ぶれ防止を実現します

質問画像とテキストのシームレスなスクロールは、一般的に携帯電話では良い効果をもたらしますが、一部のモ...

CSSで検索ボックスを非表示にする機能を実装します(アニメーション順方向と逆方向のシーケンス)

上部のメニュー バーに検索ボックスを配置するのは一般的なシナリオですが、検索機能がそれほど頻繁に使用...

入力が正しいにもかかわらず、MySQL 8.0 でアクセスが拒否される問題を解決する

最近、MySQL を学び始めました。インストールはスムーズに進み、インターネット上の既成のチュートリ...