15

例:

if($('#' + untrusted_js_code).length) > 0
  ....`

通常、「untrusted_js_code」はアイテムの ID を表す単純な文字列にする必要があります。変数の値は iframe (trough postMessage) から取得されるため、信頼されていません。そして、そのアイテムが現在のページに存在するかどうかを確認してから、それを処理します。

4

4 に答える 4

14

2012 年 10 月 22 日現在、jQuery 1.8.2:

はい、XSS 攻撃は可能です。

var input = "<script>alert('hello');</script>"
$(input).appendTo("body");

デモを参照してください。jQuery チームはこれを認めており、jQuery 1.9 で対処する計画があるようです。

jQuery 1.8 以降、$.parseHTMLユーザー入力が html であることが予想される場合に使用します。

var input = "<script>alert('hello');</script>"
$($.parseHTML(input)).appendTo("body");​

デモを参照してください。アラートはありません。


ただし、OPが説明する場合は、次のとおりです。

var untrusted_js_code = 'alert("moo")';
$('#' + untrusted_js_code).show();

これに翻訳されます:

$('#alert("moo")').show();

これは jQuery によって CSS セレクターとして解釈されます。これは、文字列の前にある # のおかげで、html とは対照的にインライン JS コードを持つことができないため、比較的安全です。上記のコードは、その ID で DOM 要素を検索するよう jQuery に指示するだけであり、その結果、jQuery は要素を見つけられず、アクションを実行しません。

于 2012-06-23T13:33:32.860 に答える
9

はい、古いバージョンのjQueryを使用している場合、これは特定の場合に可能です。これはバージョン1.6.3で修正されました(これがコミットです)。対応するバグレポートも参照してください。

コミットには、問題を明確にするテストケースが含まれています。

jQuery( '#<img id="check9521" src="no-such-.gif"' +
        'onerror="jQuery._check9521(false)">' ).appendTo("#qunit-fixture");

1.6.3より前のバージョンのjQueryでは、onerrorコードが実行されていました。

ただし、特定の例(長さをチェックするだけ)にはこの問題はありません。

于 2012-06-23T13:58:46.020 に答える
2

他の人が言っているほど明確ではありません。信頼できないコードはXSSを実行できませんが(balphaが指摘しているように、十分に新しいバージョンのjQueryがある限り)、ユーザーのブラウザーをハングさせたり、コードに予期しない入力を受け取ったりする可能性があります。

たとえば、untrusted_js_codeだった場合:input、翻訳は次のようになります。

$("#:input")

jQueryはとを無視して#に一致するよう:inputです。真剣に、コンソールを開いて、このページでそのコードを実行してください。(これは疑似クラスでのみ機能するようです。)

悪意のあるパーティは、:not(.asdf):not(.asdf)処理に数秒(または数分...)かかる計算集約型のセレクター(非常に単純化して数万回)を提供する可能性があります。

(また、ブラウザーのバグの可能性があるため、ユーザーのWebブラウザーをクラッシュさせるセレクターを構築できる可能性があります。)

于 2012-06-23T13:54:31.567 に答える
2

このステートメントでは、セレクターに基づいてクエリを実行するよう jQuery に要求しています。文字列がセレクタであるため、害はありません。

于 2012-06-23T13:36:11.687 に答える