例:
if($('#' + untrusted_js_code).length) > 0
....`
通常、「untrusted_js_code」はアイテムの ID を表す単純な文字列にする必要があります。変数の値は iframe (trough postMessage) から取得されるため、信頼されていません。そして、そのアイテムが現在のページに存在するかどうかを確認してから、それを処理します。
例:
if($('#' + untrusted_js_code).length) > 0
....`
通常、「untrusted_js_code」はアイテムの ID を表す単純な文字列にする必要があります。変数の値は iframe (trough postMessage) から取得されるため、信頼されていません。そして、そのアイテムが現在のページに存在するかどうかを確認してから、それを処理します。
はい、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 は要素を見つけられず、アクションを実行しません。
はい、古いバージョンのjQueryを使用している場合、これは特定の場合に可能です。これはバージョン1.6.3で修正されました(これがコミットです)。対応するバグレポートも参照してください。
コミットには、問題を明確にするテストケースが含まれています。
jQuery( '#<img id="check9521" src="no-such-.gif"' +
'onerror="jQuery._check9521(false)">' ).appendTo("#qunit-fixture");
1.6.3より前のバージョンのjQueryでは、onerror
コードが実行されていました。
ただし、特定の例(長さをチェックするだけ)にはこの問題はありません。
他の人が言っているほど明確ではありません。信頼できないコードはXSSを実行できませんが(balphaが指摘しているように、十分に新しいバージョンのjQueryがある限り)、ユーザーのブラウザーをハングさせたり、コードに予期しない入力を受け取ったりする可能性があります。
たとえば、untrusted_js_code
だった場合:input
、翻訳は次のようになります。
$("#:input")
jQueryはとを無視して#
に一致するよう:input
です。真剣に、コンソールを開いて、このページでそのコードを実行してください。(これは疑似クラスでのみ機能するようです。)
悪意のあるパーティは、:not(.asdf):not(.asdf)
処理に数秒(または数分...)かかる計算集約型のセレクター(非常に単純化して数万回)を提供する可能性があります。
(また、ブラウザーのバグの可能性があるため、ユーザーのWebブラウザーをクラッシュさせるセレクターを構築できる可能性があります。)
このステートメントでは、セレクターに基づいてクエリを実行するよう jQuery に要求しています。文字列がセレクタであるため、害はありません。