1

信頼できないソースからの JavaScript 文字列が onclick タグ内に埋め込まれていますが、この文字列をエンコードする正しい方法がわかりません。HTML を単純化すると、次のようになります。

<input type="button" onclick="alert([ENCODED STRING HERE]);"
    value="Click me" />

エンコードする方法がいくつか含まれているMicrosoft AntiXss ライブラリを使用します。テキストは HTML/XML 属性に埋め込まれているため、AntiXss.XmlAttributeEncodeメソッドを使用した XML 属性のエンコードが適切と思われます。ただし、これは JavaScript の一部でもあります。したがって、 AntiXss.JavascriptEncodeメソッドを使用した JavaScript エンコーディングも適切と思われます。

テキストが正しく表示されるようにしながら、セキュリティリークを公開しないようにするには、どれを選択する必要がありますか?


更新: 私が現在使用している回避策はXmlAttributeEncode、このテキストを使用して、これをタグのカスタム属性内に配置することです。その後、JavaScript を使用してこのタグから読み取ります。基本的には次のようになります。

<input type="button" onclick="alert(this.getAttribute('comment');"
    value="Click me" comment="[XML ATTRIBUTE ENCODED TEXT HERE]" />

これは完全に機能し、問題を解決しますが、XML 属性内で JavaScript を正しくエンコードする方法についてはまだ非常に興味があります。

4

3 に答える 3

5

正解は、テキストを二重にエンコードすることです。最初に でJavascriptEncode、次に でXmlAttributeEncode。この背後にある理論的根拠は、xml/html 属性内のすべてを XML 属性でエンコードする必要があるということです。ブラウザーのパーサーはこれを xml 属性として解釈し、そのようにデコードします。ブラウザーは、このデコードされたテキストを JavaScript インタープリターに提供するため、セキュリティ リークを防ぐために JavaScript で適切にエンコードする必要があります。

ブラウザーはこのテキストも二重にデコードするため (2 つの別個のインタープリターが関与するため)、この二重のエンコードによって無効な結果が生じることはありません。正しいエンコーディングの例を次に示します。

string unsafeText = "Hello <unsafe> ');alert('xss');alert('";
string javaEncoded = AntiXss.JavascriptEncode(unsafeText, false);
ENCODED_STRING = AntiXss.XmlAttributeEncode(javaEncoded);

<input type="button" onclick="alert('[ENCODED_STRING]');"
    value="Click me" />

これを行う唯一の正しい方法はダブル エンコーディングですが、通常は JavaScript エンコーディングのみを使用すると正しい結果が得られることに注意してください。ここでの制約は、属性のテキストが引用符で囲まれていることです。

JavaScript エンコーディングは、HTML/XML 属性エンコーディングと同じホワイト リスト (スペース文字を除く) を使用します。それらの違いは、安全でない文字がどのようにエンコードされるかです。Javascript はこれらを \xXX および \uXXXX (\u01A3 など) としてエンコードしますが、XML 属性はそれらを &#XX; としてエンコードします。と &#XXXX; ( A3; など)。JavaScript エンコーディングでテキストをエンコードする場合、XML 属性エンコーダーによって再度エンコードされる残りの文字は、スペース文字とバックスラッシュ文字の 2 つだけです。これらの 2 文字は、属性のテキストが引用符で囲まれていない場合にのみ問題になります。

ただし、このシナリオで XML 属性エンコーディングを使用しただけでは、正しい結果が得られないことに注意してください。

于 2010-06-22T13:21:08.653 に答える
2

たぶん、base64エンコーディングを試してみるべきでしょう。HTMLに無効なデータが含まれることはなく(エンコードされた文字列を一重引用符で囲むとすぐに)、JavaScriptでデコードできます。

于 2010-06-08T11:56:36.420 に答える
2

onclick ハンドラーを別の<script>タグにインストールします。

<input type="button" id="clickMeButton" value="Click me" />

...

<script type="text/javascript">
...
document.getElementById('clickMeButton').onclick = function () {
   alert([ENCODED STRING HERE using AntiXss.JavascriptEncode]);
}
...
</script>
于 2010-06-08T10:23:44.400 に答える