トップへ > Web Program Lab.> 掲示板をつくろう(データのサニタイズ)
ウェブ・プログラムの研究所 Web Application Programming Lab.
一つ前にもどる 目次にもどる 次のページへ
●データのサニタイズ(衛生化?健全化?)

掲示板に限らずプログラム設計で非常に重要になりつつあることの一つに、データのサニタイジングがあります。データの健全化?とでもいったらいいのでしょうか。(英訳なら「sanitise - 衛生化」かもしれませんが、、、)

掲示板などのプログラムは全く見知らぬ不特定多数から入力を受け付けるのですが、とんでもない量の書込みをされてしまうことも想定できなくはありません。

例えば、10メガバイトのホームページスペースしかないところに、10メガ以上のデータを一度に書き込まれてしまうと、ホームページそのものがパンクしてしまいます。

それだけならまだしも、意図していない入力をされたことにより、データやプログラムが誤動作し、サーバーそのものがおかしくなってしまうことも考えられます。

前回データの設計をするときにカンマを別の文字に置き換えましたよね?これもある意味データのサニタイジングなのですが、実はこれ以外にも不具合を引き起こす様々な問題があり、利用者から入力される文字を事前にチェックして安全にする必要があるのです。(詳細にはセキュリティという項目で別に検討したいと思います。)

そこで、データ設計で必要なデータの型を決めたら、プログラムとして実装する場合には、その決めた型以外のデータは受け取らない、という処理を必ず組み込む必要があるのです。


●データの長さをチェックする

まず、気になるのはデータのサイズ、つまり長さです。先ほども書きましたが、不特定多数からある程度自由にデータを受け取るわけですから、どんなサイズを送信されるかわかりません。また、データ設計を行いましたが、そこで決めた文字数以上入力されると、意図したデザインにならないこともあります。

例えば、掲示板で名前の項目を考えた場合、あまりにも長い名前を入力されても表示するときにデザインが崩れてしまったり、不必要にデータが増大し、困ってしまいます。

このように、名前は通常考えても10文字までかな、、、と設計図上はそうしても、それを実際に10文字以上入力できないような仕組みにしておかないと、それ以上書き込まないとも限りません。そこで、それ以上入力させないようにプログラムを作る必要があるのです。

■クライアント(ユーザーのパソコン)で制限
HTMLを書いていて普通思いつくのは、INPUTタグの「 maxlength 」属性です。


 [ HTMLレベルで入力制限した例 ]

 <input type="textbox" maxlength="10">


このINPUTタグの「 maxlength 」を指定すれば、HTML上はそのテキストボックスに10文字以上文字列を入れることが不可能になります。(全角、半角問わずに10文字なのですが、、、)

ただ、これでは全く意味をなしません。この最大10文字までという制限は、HTML上のみ、つまり、利用者のパソコンにページとしてダウンロードされたHTMLで10文字以上書き込めないだけの話です。

わざわざそんなことする人がいるかどうかは別として、自分で投稿用のフォームを作って、「 maxlenght 」を指定せずに、そのURLのプログラムあてに送信されると、プログラムは10文字以上でも受け付けてしまいます。また、GETでURLとして直接送信された場合はHTMLレベルでの長さチェックそのものができなくなります。

■サーバーでの制限
そこで、このように文字制限をする場合には、端末側で実行されるHTML、JavaScript、JAVAなどのクライアントサイドプログラムだけではなく、必ずCGIなどを利用してサーバーサイドプログラム内でチェックする必要があるということです。

Perlの場合ですと、「Content_length」という環境変数で入力されたデータそのもののサイズを測って必要以上に入力された場合には受け付けない。また、個々に分離されたデータについても、それぞれ長さのチェックを行い、想定値以外の場合にはエラーにしてしまうという処理をする必要があるのです。


 [ サーバー側での制限 ]

01: if ($ENV{'REQUEST_METHOD'} eq "POST") {
02:   if ($ENV{'CONTENT_LENGTH'} > 3000) { exit; }
02:   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
03: } else {
04:   $buffer = $ENV{'QUERY_STRING'};
05: }


$ENV{'CONTENT_LENGTH'}」という入力された文字の長さをチェックできる環境変数を使って、大きすぎる文字列の書き込み制限をしています。(exitではなく、エラー処理をすべきですが、、、)

また、各変数に渡すべきデータも、ハッシュに取り込んだ段階で個別に必要なものはチェックするべきだと思います。


 [ プログラム内での制限 ]

  if (length($FORM{'name'}) > 20) { &error("文字が長すぎます"); }


*$FORM{name}という変数の文字数が20以上なら、エラーとなるような処理です。



●不要な文字を無効にする

データの設計(カンマの無効化)のところでも検討しましたが、入力された文字に不具合を起こすような文字を含んでいる場合に備えて、これらの文字を全て無効化するような処理をします。

データが壊れる程度なら自分のプログラムに不具合が生じる範囲で済みますが、不正な文字の入力によりもっと深刻な被害が発生する場合もあります。ですから、外部から入力を受付ける段階で、必ずチェックする必要があります。

最善の策は「使用する文字列しか受付けない」ことです。例えば、英字の小文字しか入力として利用していないなら、プログラムの中でそれ以外の文字は全て無効にしてしまう、、、とかですね。

ただ、掲示板になると日本語を打ってもらう必要もありますし、ある程度自由に文字列を書き込ませる必要もあるため、このあたりの調整が難しいのでしょう。下記に、掲示板として一般的に無効化するべき文字列とその代替文字を列挙してみましたので、必要に応じて使ってみてください。

 [ 置換または削除されるべき文字列 ]

項目名 変換まえ >> 変換あと
改行(通常) \n または \r 無効(削除)
改行(内容の中) \n <BR> (表示に改行を反映させるため)
アンパサンド & &amp;
大なり、小なり > < &gt; &lt; (タグの無効化)
ダブルクォート " &quot;
シングルクォート ' &#039;
ファイル操作関係 ../ 無効(削除)


 [ その他、置換できる文字 (必要に応じて)]
文字を直接入力する変わりに「&#043;」というように入力することで、下記のような文字を表示できます。下の青い「■」には縦の二桁の数字を、赤い「■」には横の一桁の数字を入れて3桁で「&#043;」というような文字を作ってください。
&#■■;
03   ! " # $ % & '
04 ( ) * + , - . / 0 1
05 2 3 4 5 6 7 8 9 : ;
06 < = > ? @ A B C D E
07 F G H I J K L M N O
08 P Q R S T U V W X Y
09 Z [ \ ] ^ _ ` a b c
10 d e f g h i j k l m
11 n o p q r s t u v w
12 x y z { | } ~  
13 ƒ ˆ Š
14 Œ  Ž  
15 ˜ š œ  ž Ÿ
16   ¡ ¢ £ ¤ ¥ ¦ § ¨ ©
17 ª « ¬ ­ ® ¯ ° ± ² ³
18 ´ µ · ¸ ¹ º » ¼ ½
19 ¾ ¿ À Á Â Ã Ä Å Æ Ç


こうしてきれいになった状態で初めてファイルに書き込むことができるようになります。このことをサニタイズといいます。(この入力された文字についてのセキュリティは別途詳細な検討をしたいと思います。)


●タグの入力を許可するべきか?

掲示板の書き込みに「タグ」を許すかどうかというのは意見が分かれるところですが、個人的にはタグは不要だと思っています。

データのサニタイズのところでも書きましたが、タグに利用する「<」「>」は置換するべき文字としてあげました。データファイルの区切り(セパレーター)として「<>」というのを利用しているような掲示板もあるので、それはそれで無効化する意味はあると思いますが、タグを不要とする理由は他にもあります。

タグを許可するということは、自分のホームページの中のコンテンツをある程度自由に相手に触らせることを許すことを意味します。そこにタグが挿入される場合、正しく記述してもらえれば何の問題も発生しないのですが、書き込みを失敗したときに問題が発生したりします。

簡単なところで、ありがちなのはタグの閉め忘れです。FONT タグで色を指定して、タグを閉め忘れたために、掲示板の他の記事全てがその色になってしまった、、、というような場合ですね。

利用者が悪意なく間違えるならまだ許せますが、意図的にこれを行う悪意ある利用者もいます。特に最近よく聞く「クロスサイトスクリプティング攻撃」などは、このようなタグの入力を許してしまうシステムの不具合によって引き起こされることが多いのです。(これは、自分だけでなく他人にも迷惑をかける可能性があります。)

このような理由から、一部のタグを許可するならOKなのでは??という意見もあるかと思いますが、不完全な処理なら(少なくとも私は責任もって完璧ですとはいえないので)禁止すべき、というのが私の考えです。




(2004/3/3 by あいまい)
一つ前にもどる 目次にもどる 次のページへ

トップへ > Web Program Lab.> 掲示板をつくろう(データのサニタイズ)
copyright(C) 2001-2004 all rights reserved
『ウェブ・プログラムの実験場!』

by あいまいモード・コム(www.iMYmode.com)