[これはひどい]IEの引用符の解釈教科書に載らないWebアプリケーションセキュリティ(1)(1/3 ページ)

XSSにCSRFにSQLインジェクションにディレクトリトラバーサル……Webアプリケーションのプログラマが知っておくべき脆弱性はいっぱいあります。そこで本連載では、そのようなメジャーなもの“以外”も掘り下げていきます(編集部)

» 2009年02月27日 00時00分 公開
[はせがわようすけネットエージェント株式会社]

小さな話題が面白い

 皆さん、はじめまして。はせがわようすけと申します。

 「教科書に載らないWebアプリケーションセキュリティ」ということで、Webアプリケーションのセキュリティに関連する、普段あまり見掛けないような小さな話題を取り上げていきたいと思います。

 セキュアなWebアプリケーションを実現するために、開発者の方だけでなく、Webアプリケーションの脆弱性検査を行う方々にも読んでいただきたいと思っています。重箱の隅を楊枝でほじくるような小さな話題ばかりですが、皆さんよろしくお願いします。

 さて第1回は、Internet ExplorerがHTMLを解釈する際の引用符の扱いについて説明します。

属性値の引用符は1つだけじゃない

 皆さんご存じのとおり、HTMLを動的に生成するWebアプリケーションにて属性値を出力する場合には、クロスサイトスクリプティング(XSS)への対策として、

  • 属性値そのものを引用符「"」でくくる
  • 属性値に含まれる引用符「"」はエスケープして、「"」のように文字実体参照などで表す

とするのが定石だと思います。

 もちろん、引用符としてダブルクオーテーション「"」ではなくシングルクオーテーション「'」を使う場合もあるでしょうが、原則としては同じように属性値を引用符でくくることと属性値内の引用符をエスケープする、の2点につきると思います。

 ただし、2種類の引用符を混在させることは、コードを書く際にも混乱によるミスを生じかねないので、どちらかに統一するべきでしょう。

 例えば<input>要素のvalue属性を出力する場合に、

<input type="text" value=[ここに外部由来の文字列]>

という形でvalue属性を引用符でくくっていなかった場合、攻撃者は「x onmouseover=alert(/xss/.source)」のような文字列を与えます。すると、生成されるHTMLは、

<input type="text" value=x onmouseover=alert(/xss/.source)> 

のようになり、テキストボックス上でマウスカーソルを動かしたときに攻撃者のJavaScriptが実行されてしまい、XSSが成立してしまいます(ユーザーによる操作の介在なしにスクリプトを実行させる手段もありますが、それについてはここでは触れません)。

【TIPS!】

alertのカッコ内「/xss/.source」は、引用符を使わずに任意の文字列を表現する、攻撃者にしか役に立たないテクニックの1つです。


 また、value属性を引用符でくくっていても、属性値内に含まれる引用符をエスケープしていない場合、つまり、

<input type="text" value="[ここに外部由来の文字列]"> 

のような状況だと攻撃者が「x" onmouseover="alert(/xss/.source)」という文字列を与えることで、

<input type="text" value="x" onmouseover="alert(/xss/.source)">

のようなHTMLが生成され、XSSが成立してしまいます。

 繰り返しになりますが、HTMLの属性値を生成する場合には、

  • 属性値そのものを引用符でくくる
  • 属性値に含まれる引用符はエスケープして、「"」のように文字実体参照などで表す

というのが大原則です。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。