2012-02-25 17 views
0

JavaScript関数encodeURI/escapeとencodeURIComponentを使用するとバグが発生しているようです。例:Spotify Apps Api-encodeURI/escape

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

コメントは出力を示します。このコードをSpotifyの外で、期待どおりに動作するブラウザで実行します(スペースは+または%20で置き換えます)。

これはバグであることを他の人が確認できますか?あるいは私はここで何か間違っているのですか? Spotify Appsのバグを報告する場所はありますか?

編集:明らかに上記の例は、想定されているとおりに動作します。しかし、alert()にそれらを組み込むことは、実際にはOKですが、間違った文字列を表示します。 guidelinesから

答えて

2

エンコードされた文字列

アプリケーションは偶然の誤用がないように、SpotifyはAPIでは与えられたすべての文字列がエンコードされ、潜在的に危険な方法で文字列を使用していないことを確認するために、注射脆弱性を引き起こす。アプリケーションが以下の2つの方法を使用してこれらの文字列をデコードしない場合、文字列はユーザ​​ーにガベージとして表示されます。これに対する唯一の例外は、決してエンコードされないため、デコードを必要としないURIです。 APIドキュメントには、各メソッドの文字列をデコードする必要があるかどうかが記述されています。 JavaScript文字列には、decodeForText()およびdecodeForHTML()という2つのメソッドが追加されています。 document.createTextNode()を使用してinnerTextを設定またはテキストノードを作成するなど、安全に文字列を使用する場合は、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()));

アプリケーションでは、a)のメタデータを表示することができたり、他ではありません:それは、たとえばなど> <と>が<としてエンコードされていることを確認しますSpotify APIのデータ、およびb)アップロードプロセスで拒否されます。また、安全でない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)); 
+0

さて、私はその部分を逃しました。しかし、これは私の特別なケースでは何も解決していないようです。リテラルの "The Frames"を試してみると、あなたが何をしていても、それをエスケープするときに混乱します(decodeForText()と組み合わせても) –

+0

http:// i .imgur.com/NpU36.png –

+0

あなたはまったく正しいです。しかし、どういうわけか、Spotifyはあなたがアラート()にそれを置くと、ストリングを壊しますので、警告します(エスケープ( 'The Frames'))。まだ失敗します。しかし、これは私の「問題」が解決されたことを意味します。ありがとう。 –

関連する問題