今回はサーバーの攻撃手法についてです。サーバーを攻撃しましょう、という話ではなく、こういった攻撃があるので気を付けましょう、気に留めておいてください、という話です。
例えばウェブサイトに文字を入力する箇所があるとしましょう。ネットショッピングやサービスへのログインなどでは必ず入力する箇所(テキストボックス)がありますね。
そのテキストボックスは●●と数字を入力すると、「●●才です。」とただ表示するだけのものだとしましょう。24と数字を入力すれば「24才です。」と表示する。
世界には色々な人がいまして、ここに文字を入力したりする。
【数字を入力して下さい】→【天】→【天才です。】としてみたり、
【数字を入力して下さい】→【まだまだ青二】→【まだまだ青二才です。】としてみたり。
【数字を入力して下さい】→【昔々あるところにおじいさんとおばあさんが住んでいました。おじいさんは山へ芝刈りに、おばあさんは川へ洗濯に行きました。おばあさんが川で洗濯をしていると、川上から大きな桃がどんぶらこ、どんぶらこと流れてきたとき、おばあさんはちょうど80】などと、とんでもない入力をしたりします。
テキストボックスには数値しか入れてほしくないので、そもそものプログラムとして、数値以外は受け付けないというプログラムにしないといけません。数値以外を入力したときはエラーメッセージを表示させて「数字を入力してください」のような表示を設ける。
また、数値の上限下限を設けて、それ以外をはじく。
先ほどの物語のくだりは、お遊びではなく、意図的にエラーを起こしサーバーを乗っ取るなどという攻撃手法となります。プログラムは入力された箇所を「変数」という文字に置き換えますが、この「変数」はプログラム時に桁を決めておきます(整数型や長整数型など)。それを超えた値が入った場合、サービスが停止したり、予期せぬ動作をすることがあります。場合によってはサーバー内部への侵入を許しかねません。予めそのような不測の動作を狙ってテキストボックスなどに特殊な入力をすることをインジェクション攻撃(コマンドインジェクション攻撃)、といいます。
予め想定された値以外をはじく、という処理をバリデーションといいます。(特にこの場合は数値でないものをはじく場合に使います)そのほかに、エクセルなどにあるように「=、イコール」であるとか、「$、ドルマーク・ダラーマーク」であるとかは特殊な意味を持ちますので、プログラムによって持っている特殊な意味を持つ記号を全角に変換するとか、別の文字に置き換えることも必要になります。これをエスケープや、サニタイジングと言います。色々なインジェクション攻撃がありますが、バリデーションやサニタイジングを含めたセキュアプログラミングを行うことで、これらの攻撃を予防することが可能です。