2010-09-08 5 views
1

J'ai reconnu que, selon le contexte dans lequel je veux utiliser certains paramètres, il y a au moins 4 types de codage nécessaires pour éviter l'exécution de code corrompu:Comment gérer les différents types de codage dans le javascript

  1. Codage Javascript lors de la construction d'un code javascript, par ex.

    var a = "what's up ?" 
    var b = "alert('" + a + "');" 
    eval(b); // or anything else that executes b as code 
    
  2. codage d'URL en utilisant une chaîne de caractères en tant que paramètre dans l'URL, par exemple

    var a = "Bonnie & Clyde"; 
    var b = "mypage.html?par=" + a; 
    window.location.href = b; // or anything else that tries to use b as URL 
    
  3. codage HTML en utilisant une chaîne de caractères en tant que source HTML de certains éléments, par exemple,

    var a = "<script>alert('hi');</script>"; 
    b.innerHTML = a; // or anything else that interprets a directly 
    
  4. codage de l'attribut HTML en utilisant une chaîne de caractères en tant que valeur d'un attribut, par exemple,

    var a = 'alert("hello")'; 
    var b = '<img onclick="' + a + '" />'; // or anything else that uses a as a (part of) a tag's attribute 
    

Alors que dans le behind ASP.NET Je suis conscient des façons de coder la chaîne dans les 4 cas (par exemple à l'aide DataContractJsonSerializer, HttpUtility.UrlEncode, HttpUtility.HtmlEncode et HttpUtility.HtmlAttributeEncode), il serait tout à fait intéressant de savoir s'il y a des utilitaires que je pourrais utiliser directement de javascript pour encoder/décoder des chaînes dans ces 4 cas.

+0

Dans le cas 3, essayez-vous d'éviter l'exécution du JavaScript? –

+0

exactement, je veux le code à afficher à la page dans ce cas –

Répondre

1

Vous pouvez utiliser la fonction javascript escape(..) pour certaines de ces fonctions.

e: fait oublier! désolé, c'est une fonction obsolète - encodeURI(), decodeURI() etc sont la voie à suivre! Détails here.

fonctions escape et unescape ne le font pas fonctionner correctement pour les caractères non-ASCII et ont été désapprouvés. Dans JavaScript 1.5 et versions ultérieures, utilisez encodeURI, decodeURI, encodeURIComponent et decodeURIComponent.

Les fonctions escape et unescape permettent d'encoder et de décoder les chaînes. La fonction d'échappement renvoie le codage hexadécimal d'un argument dans le jeu de caractères ISO Latin. La fonction unescape renvoie la chaîne ASCII pour la valeur de codage value.encoding hexadécimale spécifiée.

+0

en fait, je crois que encodeURIComponent() couvrirait exactement le cas 2 .. seulement 3 cas à gauche :) –

3

Cas n ° 2 peuvent être traitées à l'aide encodeURIComponent(), comme danp suggested.

Cas 3 won't execute the script in most browsers. Si vous voulez que la sortie du document à être <script>...</script>, vous devez modifier le contenu du texte de l'élément à la place:

var a = "<script>alert('hi');</script>"; 
if ("textContent" in b) 
    b.textContent = a; // W3C DOM 
else 
    b.innerText = a; // Internet Explorer <=8 

Cas 1 et 4 ne sont pas vraiment codant pour des problèmes, ils sont les questions d'assainissement. L'encodage des chaînes passées à ces fonctions provoquerait probablement une erreur de syntaxe ou aboutirait simplement à une valeur de chaîne qui n'est affectée à rien.La désinfection consiste généralement à rechercher certains motifs et soit à autoriser l'action, soit à l'interdire - il est plus sûr d'avoir une liste blanche qu'une liste noire (cela semble terrible!).

Internet Explorer 8 a une fonction intéressante appelée window.toStaticHTML() qui supprimera tout contenu de script d'une chaîne HTML. Très utile pour désinfecter le code HTML avant de l'insérer dans le DOM. Malheureusement, il est propriétaire de sorte que vous ne trouverez pas cette fonction dans d'autres navigateurs.

+0

Re cas 3 Je crois que l'objectif du PO est de ne pas éviter l'exécution de JavaScript mais simplement avoir le code html (voir son commentaire à la question). –

+0

@Crescent: Ahh, je vois - merci pour la clarification. –

Questions connexes