Home > DBCLS > ウェブサービスの立ち上げとXSS対策

ウェブサービスの立ち上げとXSS対策

  • 2011-04-27 (水) 23:13
  • DBCLS

mesoがDBCLSに着任してまずやろうとしていることは、転写産物=RNAベースで、塩基配列、文献、プローブ、siRNA、等々を整理した統合データベースをつくることだ。従来のデータベースの多くは何でもゲノムにマッピングするという発想だったが、biologistはどちらかというと遺伝子や転写産物を単位にものごとを考えているはずなので、転写産物に知識をマッピングするほうが自然だろう。しかも、それをフリーワードや塩基配列からサクサク検索できるサイトをつくれば有用に違いない。

プロトタイプができたらここで紹介する予定だが、今日はグループのメンバーに作成途中のwebを回覧したところ、即座にXSSを仕掛けられて脆弱性が露見するという情けないことがおきたので対策を施すことにした。

XSSとは

XSS(クロスサイトスクリプティング)とは何か。例を挙げると、ウェブの入力フォームに、お名前:「<script>alert(“うへへ”)</script>」のようないじわるな文字列を入力すると、返ってきたHTMLに含まれる「ようこそ、○○さん」のところが「ようこそ、<script>alert(“うへへ”)</script> さん」になりJavaScriptとして解釈されてしまう、こういった脆弱性を突く行為だ。悪用されれば深刻な被害が出かねないので対策が必須である。詳しくは、今回参考にした「@IT: クロスサイトスクリプティング対策の基本」などを参照してほしい。

mesoの作成しているページには早速 @iNut たんがあやしいクエリをsubmitしたところ、下記のようにJavaScriptのalert()が実行されて奇妙なポップアップが表示された。

駄目だこれは(=_=。ちなみに@iNut様のブログ、Chateau Togo によると、うちのグループのスタンダードは、

僕がこの牧場で教わったことは3つありますー
一つ、書いたコードは恥を承知で晒せ。
一つ、コマンドの使い方が分からなければmanを読め。
一つ、フォームを見たらとりあえずXSSを打ち込め。

ということらしい。meso涙目。

XSS対策

XSS対策をする場所は基本的に2箇所。入力データのチェックと、HTML出力前のチェックだ。下記の特殊文字をHTMLの実態参照に置き換えるか、消去してしまえば、タグとして解釈されなくてすむ。これをサニタイズ(無害化)する、と言うらしい。

HTMLのタグとして解釈される可能性がある文字:

  • 「<」→ &lt;
  • 「>」→ &gt;
  • 「&」→ &amp;

タグ中で<a href=”hoge”>のような属性値の開始・終了に使われる文字:

  • 「’」→ &#39;
  • 「”」→ &quot;

ただ、上記のような置き換えを考える前に、本当にそんな文字を受け付ける必要があるのか? を検討するべきだろう。たとえば郵便番号は半角数字3桁+4桁と決まっているので、それ以外の文字列は入力の時点でチェックしてはねるのが先決だ。入力のチェックを厳しくすることは、XSS以外の脆弱性(オーバーフロー等)の対策にもなる。

なお、ここに書いたことはあくまで基本なのでこれだけでは対策として不十分だが、何もしないのと比べると大幅にリスクを減らすことができるだろう。詳しくは「XSS 対策」でググってさらに調べるべし。

実験用のコードとサービス用のコードは違う

とりあえず上記+αの対策で@iNutさんの意地悪クエリには対処できた。しかしこんどは @chalkless さんから、あるクエリを投げるとDBのほぼ全件が返ってくるとか、長いクエリを投げるとオーバーフローするといった指摘をいただいた。meso涙がとまらない。

あたりまえのことだが、実験のために書くコードと、サービス提供のためのコードは違うのである。すべての条件分岐と、すべてのパラメータをチェックし、どんな入力を与えても(あるいは与えなくても)エラーで落ちないように書かなければいけない。たとえばperlのサブルーチンなどでよく出てくる、

my $query = $_[0] ;

というところは、

my $query = $_[0] || ‘デフォルト値’ ;

# 注)$_[0]がundef, 空白, ゼロだと「偽」が返るので || (or) の右項が評価され、
# $queryに ‘デフォルト値’ が入る。

などと書いておかないとundefとか空白だった場合にしぼうするだろうし、状況によって成功しないかもしれない文を実行するときには、

eval(実行したい文) or print_error(‘○○できませぬ!’) ;

# 注)evalの中身の文がコケてもプログラム自体は止まらずevalがゼロを返す。

のように「保険をかける」書き方が必要になってくる。また直接的な対策ではないが、デバッグしやすいコードを書く(例えばサブルーチン化を徹底する等)ことも、セキュリティ対策に寄与するだろう。(このへんの考え方は、メガバンクの勘定系システムをやっていたココ殿から昔レクチュアしていただいたことがある。銀行システムは超ガチガチで大変だったらしいけど・・・)

セキュリティ対策がある程度できたら、作成中のサイトをこの場で紹介したい。

Trackbacks:0

Trackback URL for this entry
/archives/21/trackback
Listed below are links to weblogs that reference
ウェブサービスの立ち上げとXSS対策 from mesoの実験ノート

Home > DBCLS > ウェブサービスの立ち上げとXSS対策

Search
Feeds
Meta

Return to page top