かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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