Spotify Apps Api - encodeURI / побег - PullRequest
0 голосов
/ 26 февраля 2012

Кажется, есть ошибка при использовании JavaScript-функций encodeURI / escape и encodeURIComponent. Пример:

escape( 'The Frames' )             // The            0.000000rames
encodeURI( 'The Frames' )          // The            0.000000rames
encodeURIComponent( 'The Frames' ) // The            0.000000rames

Комментарии показывают вывод. Выполнение этого кода вне Spotify в любом браузере работает должным образом (замена пробела на + или% 20).

Могут ли другие подтвердить, что это ошибка? Или я тут что-то не так делаю ...? Есть ли место, чтобы сообщать об ошибках в Spotify Apps?

РЕДАКТИРОВАТЬ: Очевидно, приведенные выше примеры работают так, как они должны. Однако включение их в alert () покажет испорченную строку, хотя на самом деле все в порядке.

1 Ответ

2 голосов
/ 26 февраля 2012

Из рекомендаций :

Кодированные строки

Чтобы приложения не использовали строки потенциально небезопасными способами, все строки, предоставляемые API-интерфейсами Spotify, кодируются так, чтобы случайное неправильное использование не приводило к уязвимостям внедрения. Если приложение не декодирует эти строки, используя два метода, описанных ниже, строки будут отображаться как мусор для пользователя. Единственное исключение - URI, которые никогда не кодируются и, следовательно, не требуют декодирования. В документации API указано для каждого метода, какие строки должны быть декодированы или нет. В строки JavaScript были добавлены два метода: decodeForText () и decodeForHTML () . Если строка предназначена для безопасного использования, например, для установки innerText или создания текстового узла с помощью document.createTextNode (), следует использовать decodeForText (). Он вернет необработанную неэкранированную строку, поэтому убедитесь, что она никогда не вставляется ни в какой контекст, где будет интерпретироваться как HTML. Если строка предназначена для перехода во innerHTML или в любой фрагмент кода, который будет интерпретироваться как HTML, необходимо использовать decodeForHTML (). Это гарантирует, что <и> закодированы как <и> и т. Д. Например:

getElementById('song-title').innerHTML = track.title.decodeForHTML(); getElementById('song-title').innerText = track.title.decodeForText(); getElementById('song-title').appendChild(document.createTextNode(track.title.decodeForText()));

Приложения, которые не используют эти методы, а) не смогут отображать метаданные или любые другие данные из API Spotify, и б) будут отклонены в процессе загрузки. Также убедитесь, что вы правильно избегаете небезопасных строк HTML, откуда бы они ни исходили, например, с ваших внутренних серверов.


И исходный код, если вам интересно:

String.prototype.decodeForText = function() {
    var result = "";
    for (var i = 0; i < this.length; ++i) {
        if (this.charAt(i) !== "&") {
            result += this.charAt(i);
            continue;
        } else if (this.substring(i, i + 5) === "&amp;") {
            result += "&";
            i += 4;
            continue;
        } else if (this.substring(i, i + 4) === "&lt;") {
            result += "<";
            i += 3;
            continue;
        } else if (this.substring(i, i + 4) === "&gt;") {
            result += ">";
            i += 3;
            continue;
        } else if (this.substring(i, i + 6) === "&quot;") {
            result += "\"";
            i += 5;
            continue;
        } else if (this.substring(i, i + 6) === "&apos;") {
            result += "'";
            i += 5;
            continue;
        } else if (this.substring(i, i + 8) === "&equals;") {
            result += "=";
            i += 7;
            continue;
        }
    }
    return result;
};

String.prototype.decodeForHTML = function() {
    return this;
};

String.prototype.decodeForLink = function() {
    return encodeURI(this.decodeForText());
}

String.prototype.encodeToHTML = function() {
    var result = "";
    for (var i = 0; i < this.length; ++i) {
        if (this.charAt(i) === "&") {
            result += "&amp;";
        } else if (this.charAt(i) === "<") {
            result += "&lt;";
        } else if (this.charAt(i) === ">") {
            result += "&gt;";
        } else if (this.charAt(i) === "\"") {
            result += "&quot;";
        } else if (this.charAt(i) === "'") {
            result += "&apos;";
        } else if (this.charAt(i) === "=") {
            result += "&equals;";
        } else {
            result += this.charAt(i);
        }
    }
    return result;
}
}(this));
...