2009-04-18 57 views
17

我很困惑,在這樣的短語中的術語 「逃逸」 和 「編碼」 之間的區別:XML轉義/編碼術語

XML編碼

XML轉義

編碼的HTML

轉義網址

...

燦有人向我解釋嗎?

回答

24

Encoding描述文件的字符是如何物理寫入二進制(如Unicode或ANSI)。

Escaping指替換特殊字符(如<>)的過程中與它們XML entity當量(如&lt;&gt;)。對於URL,轉義是指用%(如%20)開頭的字符替換單個空白字符。

按語言不同逃逸,但編碼通常是廣泛接受的標準。有時這些術語被模棱兩可地使用(特別是在用於表示轉義的編碼方面),但它們被很好地定義和區分。

+3

迂腐的澄清:「unicode」不是一種編碼,而是一種字符集(UTF-8,ISO8859-1,CP850是編碼的例子)。可悲的是,Unicode和UTF-8經常被用作同義詞,而不是。 – tokland 2010-06-05 21:39:30

+0

同意「編碼」是w/r/t「字符編碼」的正確術語,但在涉及到替換字符以避免特殊解釋的過程中,這些術語不是「明確定義和明確的」。看到我的答案。 – 2013-04-20 21:08:04

6

在每一個Web應用程序,數據由像視圖層,模型層,數據庫層,等各層「應該」被獨立地開發,以滿足各種擴展性和維護要求的各種層。

現在,基本上,每一層都需要「對話」隔日,他們有在通過它可以談的語言來決定。 這被稱爲編碼。各類編碼時存在類似ASCII,UTF-8,UTF-16等 現在,如果用戶是中國人還是日本人,例如,然後他ASCII是行不通的,因此,他將與UTF-16或繼續任何其他的編碼技術都可以保證中文溝通。所以從網頁層面來說,漢字將通過業務層,然後到達數據層,並且在任何地方都會使用相同的「編碼」方案。

爲什麼?

現在假設,你的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。

0

TL; DR 這兩個術語是可互換的(如果你的意思是轉換某些字符,所以他們將被解釋爲普通的字符串數據)。這場辯論很古老。來自CWE-116: Improper Encoding or Escaping of Output

「編碼」和「轉義」術語的用法差別很大。例如,在某些編程語言中,術語互換使用 ,而其他語言提供的API使用 條款來執行不同的任務。這種重疊的用法擴展到Web, ,如「escape」JavaScript函數,其目的是聲明爲 編碼。當然,編碼和轉義的概念在幾十年前就已經在網絡上出現了。考慮到這樣的背景,CWE很難採用一致的詞彙,不會被某些 選區誤解。

搞笑的足夠的JavaScript還具有encodeURIComponent(),其specification避免完全的討論:

encodeURIComponent函數計算 URI的在 的新版本,其某些字符的每個實例被替換一個,兩個, 三個或四個轉義序列,表示 字符的UTF-8編碼。

個人我相信這是更合適的指代一般方法爲「編碼」,因爲您正在創建code要由通過通信信道(一條標記/編程代碼)發送和解釋接收器(解析器)。我認爲用&#60;這樣完全不同的東西代替<並稱之爲「逃避」是愚蠢的。