次のようなフレーズでの「エスケープ」と「エンコード」という用語の違いについて、私は混乱しています。
Xml エンコーディング
XML エスケープ
エンコードされた HTML
エスケープされた URL
...
誰かが私にそれを説明できますか?
次のようなフレーズでの「エスケープ」と「エンコード」という用語の違いについて、私は混乱しています。
Xml エンコーディング
XML エスケープ
エンコードされた HTML
エスケープされた URL
...
誰かが私にそれを説明できますか?
エンコーディングは、ファイルの文字が物理的にバイナリでどのように書き込まれるかを記述します(UnicodeまたはANSIのように)。
エスケープ<
とは、特殊文字(およびなど>
)を同等のXMLエンティティ<
(およびなど)に置き換えるプロセスを指します>
。URLの場合、エスケープとは、単一の空白%
など、文字を、で始まる文字列に置き換えることを指します。%20
エスケープは言語によって異なりますが、エンコーディングは通常広く受け入れられている標準です。用語があいまいに使用されることもありますが(特に、エスケープを意味するために使用されるエンコーディングでは)、明確に定義され、明確に区別されます。
すべての Web アプリケーションでは、データはビュー レイヤー、モデル レイヤー、データベース レイヤーなどのさまざまなレイヤーで構成されています。各レイヤーは、さまざまなスケーラビリティと保守性の要件を満たすために、個別に開発されることが "想定" されています。
さて、基本的に、すべての層はお互いに「話す」必要があり、話すことができる言語を決定する必要があります。これをエンコーディングと呼びます。ASCII、UTF-8、UTF-16 など、さまざまなタイプのエンコーディングが存在します。たとえば、ユーザーが中国人または日本人の場合、ASCII は機能しないため、UTF-16 またはその他の方法を使用します。中国語でのコミュニケーションを保証する他のエンコード技術。そのため、漢字は Web レイヤーからビジネス レイヤーを通過し、データ レイヤーに渡され、どこでも同じ「エンコーディング」スキームが使用されます。
なんで ?
ここで、Web レイヤーが中国語をサポートする UTF-16 でデータを送信するとしますが、データベース レイヤーは ASCII のみを受け入れ、データベース レイヤーは何を話しているのか混乱します。それは英字のみを理解し、残りは理解できません。これはエンコーディングについてでした。
エスケープ :
ブラウザの観点から特別な意味を持つ「メタデータ」と呼ばれる特定のデータ セットがあります。たとえば<>
、ブラウザの観点からのメタデータです。ブラウザのパーサーは、これらの内部に含まれるすべてのデータ<>
が解釈されることを認識しています。現在、攻撃者はこの手法を使用してブラウザを混乱させています。例えば :
<input type="text" value="${name} />
名前を
name="/><script>alert(document.cookie)</script>
次に、ブラウザが認識する結果のコードは次のようになります
<input type="text" value=""/><script>alert(document.cookie)</script> />
つまり、ブラウザに、入力したものname=""
はすべて「エスケープ」するか、データのみと見なすように指示する必要があります。<>
そのため、html に相当するものとしてエンコード/エスケープするさまざまな関数がある%3C%3E
ため、ブラウザはこれを別の方法で処理する必要があることを認識しています。基本的にエスケープとは、実際の意味をエスケープすることを意味します (大まかに言えば)。
<input type="text" value="${fn:escapeXML(name)} />
JSTLを使用。
TL;DR両方の用語は交換可能です (文字を変換してプレーンな文字列データとして解釈することを意味する場合)。この議論は古い。CWE -116 より: 出力の不適切なエンコードまたはエスケープ:
「エンコーディング」と「エスケープ」という用語の使用法は大きく異なります。たとえば、一部のプログラミング言語では、これらの用語は同じ意味で使用されますが、他の言語では、さまざまなタスクに両方の用語を使用する API が提供されています。この重複する使用法は、目的がエンコーディングであると述べられている「エスケープ」JavaScript 関数など、Web にまで及びます。もちろん、エンコードとエスケープの概念は、Web より何十年も前から存在しています。このような状況を考えると、一部の有権者によって誤解されない一貫した語彙を CWE が採用することは困難です。
滑稽なことに、JavaScript にも がencodeURIComponent()
あり、その仕様は議論を完全に回避します。
encodeURIComponent 関数は、特定の文字の各インスタンスが文字の UTF-8 エンコードを表す 1、2、3、または 4 つのエスケープ シーケンスに置き換えられた URIの新しいバージョンを計算します。
個人的には、通信チャネル (マークアップ/プログラミング コードの一部) を介して送信され、受信者 (パーサー) によって解釈されるコードを作成しているため、一般的なプロセスを「エンコード」と呼ぶ方が適切だと思います。<
まったく違うものに置き換えて、<
それを「エスケープ」と呼ぶのはばかげていると思います。