2009-04-18 19 views

Respuesta

24

Encoding describe cómo los caracteres del archivo se escriben físicamente en binario (como en Unicode o ANSI).

Escaping se refiere al proceso de sustitución de caracteres especiales (tales como < y >) con su XML entity equivalente (como &lt; y &gt;). Para las direcciones URL, el escapado se refiere a la sustitución de caracteres con cadenas que comienzan por %, como %20 para un solo espacio en blanco.

El escape difiere según el idioma, pero las codificaciones generalmente son estándares ampliamente aceptados. Algunas veces los términos se usan de manera ambigua (particularmente con la codificación utilizada para referirse al escape), pero están bien definidos y son distintos.

+3

Una aclaración pedante: "unicode" no es una codificación sino un juego de caracteres (UTF-8, ISO8859-1, CP850 son ejemplos de codificaciones). Lamentablemente, Unicode y UTF-8 se utilizan a menudo como sinónimos, mientras que no lo son. – tokland

+0

Acordó que "codificación" es el término correcto w/r/t "codificación de caracteres", pero estos términos no están "bien definidos y son distintos" cuando se trata del proceso de sustitución de caracteres para evitar una interpretación especial. Ver mi respuesta –

+0

En cuanto a lo que ha preguntado Yaron, tenga en cuenta que en el.NET Framework tiene estos dos métodos, que hacen casi lo mismo: 'HttpUtility.UrlPathEncode' y' Uri.EscapeUriString'. – Andrew

6

En cada aplicación web, los datos constan de varias capas como la capa de vista, capa de modelo, capa de base de datos, etc. Se supone que cada capa debe desarrollarse independientemente para satisfacer diversos requisitos de escalabilidad y mantenimiento.

Ahora, básicamente, cada capa necesita "hablar" entre sí, y tienen que decidir sobre un idioma a través del cual pueden hablar. Esto se llama codificación. Existen varios tipos de codificaciones, como ASCII, UTF-8, UTF-16, etc. Ahora, si el usuario es chino o japonés, por ejemplo, entonces para él ASCII no funcionaría, por lo tanto, seguiría adelante con UTF-16 o cualquier otra técnica de codificación que garantice la comunicación en chino. Entonces, desde la capa web, los caracteres chinos pasarían a través de la capa empresarial, y luego a la capa de datos, y en todas partes, se usará el mismo esquema de "codificación".

¿Por qué?

Supongamos ahora que su capa web envía datos en UTF-16, admitiendo el idioma chino, pero la capa de la base de datos acepta, solo ASCII, ¡entonces la capa de la base de datos se confundiría con respecto a qué está hablando! solo comprende caracteres ingleses, no entenderá el resto. Esto era sobre Codificación.

Escapar:

Hay un cierto conjunto de datos llamados "metadatos", que tienen un significado especial desde la perspectiva de los navegadores. Por ejemplo, <> son metadatos desde la perspectiva de los navegadores. El analizador de navegadores sabe que se deben interpretar todos los datos contenidos en estos <>. Ahora los atacantes usan esta técnica para confundir a los navegadores. Por ejemplo:

<input type="text" value="${name} /> 

si puedo reemplazar el nombre con

name="/><script>alert(document.cookie)</script> 

continuación, el código resultante como el navegador ve Será

<input type="text" value=""/><script>alert(document.cookie)</script> /> 

Medios, ahora es necesario instruir al navegador que sea lo que sea que puse en el name="" debe ser "escapado", o debe considerarse solo como datos. Así que hay varias funciones que codifican/escapan <> como su equivalente html %3C%3E, por lo que ahora el navegador sabe que esto debe tratarse de manera diferente. Básicamente escapar significa escapar de su significado real (hablando en términos generales).

<input type="text" value="${fn:escapeXML(name)} /> 

usando JSTL.

0

TL; DR Ambos términos son intercambiables (si lo que quieres decir es convertir algunos caracteres para que se interpreten como datos de cadena simple). Este debate es antiguo. De CWE-116: Improper Encoding or Escaping of Output:

El uso de los términos "codificación" y "escape" varía ampliamente. Para el ejemplo , en algunos lenguajes de programación, los términos se utilizan indistintamente, mientras que otros idiomas proporcionan API que usan los términos para diferentes tareas. Este uso superpuesto se extiende a la Web, , como la función de "escape" de JavaScript cuya finalidad es la codificación . Por supuesto, los conceptos de codificación y escape son anteriores a la web por décadas. Dado este contexto, es difícil para CWE adoptar un vocabulario coherente que no será malinterpretado por alguna circunscripción .

suficiente Cómicamente JavaScript también tiene encodeURIComponent(), y su specification evita el debate en su totalidad:

La función encodeURIComponent calcula una nueva versión de un URI en el que cada instancia de ciertos caracteres se sustituye por uno, dos, tres o cuatro secuencias de escape que representan la codificación UTF-8 del carácter .

Personalmente creo que es más apropiado para referirse al proceso general como "codificación", como se va a crear una code para ser transmitida a través de un canal de comunicaciones (un pedazo de código de marcado/programación) e interpretada por una receptor (el analizador). Creo que es una tontería reemplazar < con algo completamente diferente como &#60; y llamarlo "escapar".

+0

Por ejemplo, en .NET Framework tiene estos dos métodos, que hacen casi lo mismo: 'HttpUtility.UrlPathEncode' y' Uri.EscapeUriString'. – Andrew

Cuestiones relacionadas