かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

LightSwitchのHTMLClientのサンプルのほとんどでXSSの脆弱性ありそうな気がするんですが…

最近LightSwitchのHTMLClientのサンプルとかコードを色々あさってるんですが、JavaScriptで出力のカスタマイズ自由自在だぜ!!ってところになると以下のような感じのコードをよく見かけます。

/// <reference path="../GeneratedArtifacts/viewModel.js" />

myapp.Browse.ScreenContent_render = function (element, contentItem) {
    // 仮のデータ
    var dummyData = { value: 'hoge' };
    $('<h2>' + dummyData.value + '</h2>').appendTo($(element));
};

dummyDataは、本来はcontentItem.valueあたりを使うのですが、今回は簡単な例を示したいだけなのでメソッド内に静的に持たせてます。こんなカスタムコントロールのレンダリング処理のコードをよく見る。んで、実行すると、以下のような感じで、h2タグに囲まれて太く表示できる。
f:id:okazuki:20130810222037j:plain

いやでもvalueにこんな値入ってたらおしまいでしょ・・・と常に感じてる。

/// <reference path="../GeneratedArtifacts/viewModel.js" />

myapp.Browse.ScreenContent_render = function (element, contentItem) {
    // 仮のデータ
    var dummyData = { value: 'hoge<script type="text/javascript">alert("Hello XSS!!")</script>' };
    $('<h2>' + dummyData.value + '</h2>').appendTo($(element));
};

実行すると、ありがとうございますXSSです。
f:id:okazuki:20130810222216j:plain

jQueryで書くならこうしとかないとって思うんです。

/// <reference path="../GeneratedArtifacts/viewModel.js" />

myapp.Browse.ScreenContent_render = function (element, contentItem) {
    // 仮のデータ
    var dummyData = { value: 'hoge<script type="text/javascript">alert("Hello XSS!!")</script>' };
    $('<h2/>').text(dummyData.value).appendTo($(element));
};

これならvalueに変な値入れられてても平気。
f:id:okazuki:20130810222404j:plain

まとめ

XSSとか基礎すぎて、当然本番では気を付けるよね!?ってノリなのかもしれないけど、こんなノリのサンプルコードだらけなせいでXSSの脆弱性を持ったアプリが量産されないか心配。

追記

もしかしてLightSwitchの世界で閉じてるなら、勝手に変なデータ入れるとエラーにしてくれるとか淡い期待してDBからデータとってくる奴でためしたんですが、ばっちりJavaScript動きました。
f:id:okazuki:20130810223346j:plain