Как бороться с различными видами кодирования в JavaScript - PullRequest
1 голос
/ 08 сентября 2010

Я понял, что в зависимости от контекста, в котором я хочу использовать некоторые параметры, существует как минимум 4 вида кодирования, которые необходимы для предотвращения выполнения поврежденного кода:

  1. Javascriptкодирование при построении кода JavaScript, например,

    var a = "what's up ?"
    var b = "alert('" + a + "');"
    eval(b); // or anything else that executes b as code
    
  2. кодирование URL при использовании строки в качестве параметра в URL, например,

    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. HTML-кодировка при использовании строки в качестве источника HTML какого-либо элемента, например

    var a = "<script>alert('hi');</script>";
    b.innerHTML = a; // or anything else that interprets a directly
    
  4. HTML-кодировка атрибута при использовании строки в качестве значения атрибута, например,

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

В коде ASP.NET я знаю способы кодирования строки во всех 4 случаях (например, с помощью DataContractJsonSerializer, HttpUtility.UrlEncode, HttpUtility.HtmlEncode и * 1028).*), было бы весьма интересно узнать, есть ли какие-нибудь утилиты, которые я мог бы использовать непосредственно из javascript для кодирования / декодирования строк в этих 4 случаях.

Ответы [ 2 ]

3 голосов
/ 08 сентября 2010

Случай 2 может быть обработан с использованием encodeURIComponent () , как предложено danp .

Случай 3 не будет выполнять скрипт в большинстве браузеров . Если вы хотите, чтобы вывод документа был <script>...</script>, вам следует вместо этого отредактировать текстовое содержимое элемента:

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

Случаи 1 и 4 на самом деле не являются проблемами кодирования, это проблемы санитарии. Кодирование строк, передаваемых этим функциям, может вызвать синтаксическую ошибку или просто привести к строковому значению, которое никому не назначается. Дезинфекция обычно включает в себя поиск определенных шаблонов и либо разрешение действия, либо его запрещение - безопаснее иметь белый список, чем черный (это звучит ужасно!).

Internet Explorer 8 имеет интересную функцию под названием window.toStaticHTML () , которая удаляет любое содержимое сценария из строки HTML. Очень полезно для очистки HTML перед вставкой в ​​DOM. К сожалению, это частная собственность, поэтому вы не найдете эту функцию в других браузерах.

1 голос
/ 08 сентября 2010

Вы можете использовать функцию javascript escape(..) для некоторых из этих целей.

е: на самом деле забудь! извините, это устаревшая функция - encodeURI(), decodeURI() и т. д. - это путь вперед! Подробности здесь .

функции escape и unescape не работать правильно для не-ASCII символов и были объявлены устаревшими. В JavaScript 1.5 и выше, используйте encodeURI, decodeURI, encodeURIComponent и decodeURIComponent.

Функции escape и unescape позволяют Вы кодируете и декодируете строки. escape-функция возвращает шестнадцатеричное кодирование аргумента в набор латинских символов ISO. функция unescape возвращает ASCII строка для указанного шестнадцатеричного Значение кодирования. Значение кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...