Проверьте, является ли строка UTF-8, возвращающей \u+hex, если да, false, если нет

Для безопасности XSS я хотел бы преобразовать все символы в кодировку \u+hex. Я видел решения UTF-16, но ничего не могу найти для UTF-8.

Сначала я хочу убедиться, что все символы UTF-8. Здесь я видел много решений, но ничего не соответствовало javascript.

Как можно проверить строку на наличие UTF-8 и вернуть шестнадцатеричную кодировку \u+, если это так, но ложную, если нет?


person Community    schedule 08.03.2014    source источник
comment
Я не уверен, понимаете ли вы смысл здесь. Как гарантировать, что ввод UTF-8 защитит вас от инъекций? В этом другом вопросе вы говорите, что я хочу внедрять вещи куда угодно -- честно говоря, делать это безопасно практически невозможно (а с практической точки зрения, возможно, и пересекая).   -  person Jon    schedule 09.03.2014
comment
Строка в JS состоит из символов, а не байтов. Символы — это чисто условная вещь, тогда как байты — это числа, которые физически хранятся на диске или передаются по сети. Это означает, что для программиста нет кодирования. Вы не можете проверить строку на кодировку.   -  person T-Bull    schedule 09.03.2014
comment
@Gracchus: Возможно, я не правильно понимаю, но все это звучит очень ошибочно. Если вы вставляете HTML-контент, вам нужно превратить специальные символы в объекты HTML; если содержимое находится внутри открытого тега или значения атрибута, вам также необходимо предотвратить атаки сценариев и т. д. Ничто из этого не будет предотвращено проверками кодирования.   -  person Jon    schedule 09.03.2014
comment
@Gracchus: у меня такое чувство, что я не совсем понимаю твой вопрос. Возможно, вам следует предоставить больше контекста, то есть откуда берутся ваши строки и куда они должны идти. Кроме того, кто такой Брайан МакГинити?   -  person T-Bull    schedule 09.03.2014


Ответы (1)


function string_to_hex(input) {
    var temp = 0, output = "";
    for (var i = 0; i < input.length; i++) {
        temp = input.charCodeAt(i);
        if (temp > 0xFF) {
//      if (temp == 192 || temp == 193 || temp > 244) {
            return false;
        }
        output += "\\x" + temp.toString(16).slice(1); //lazy padding
    }
    return output;
}

Закомментированная строка не нужна, если вы не проверяете наличие недопустимых кодовых точек.

person username    schedule 08.03.2014