ホーム » スタッフ » 斉藤徹 » ファイル処理演習と安全な入力

2012年7月
« 6月   8月 »
1234567
891011121314
15161718192021
22232425262728
293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

ファイル処理演習と安全な入力

ファイル処理に関する説明が終わったので、 ファイル処理の演習を行う。 演習にあたって、バッファオーバフローの危険性やその対応方法などの説明も行う。

演習とファイル入出力

演習は、ファイルの入出力であることから、あらかじめ作っておいたデータファイルを 読み込み、何らかの加工を加えてファイルに出力とする。 データは、名前+点数5科目、名前+身長体重、名前+生年月日より、 出席番号に応じて課題に取り組む。

ファイル入力+出力の処理の大まかは、以下のとおりになるだろう。

FILE* fp_in ;
FILE* fp_out ;
if ( (fp_in = fopen( "..." , "rt" )) != NULL ) {
if ( (fp_out = fopen( "..." , "wt" )) != NULL ) {
while( fscanf( fp_in , .... ) != ... ) {
fprintf( fp_out , .... ) ;
}
fclose( fp_out ) ;
}
fclose( fp_in ) ;
}

安全な入力

ファイルの説明にあたり、scanf() の %s , %d の入力の仕組みとして、 「基本は空白があれば読み飛ばし、空白を見つけるまでをデータとして格納」 といった説明を、ファイルポインタ(FILE*という意味でなく、ファイル上の読み書き位置の意味)を交えながら解説する。

char  str[ 10 ] ;
scanf( "%s" , str ) ;

安全な入力対策として、上記のような入力は、10文字以上のデータを与えた場合、 危険であることを説明する。 特に、文字配列が局所変数であれば、近辺にある"関数からの戻り番地"も破壊される 可能性がある。さらに配列をはみ出す領域に、悪意のあるプログラム(機械語)を配置し、 関数戻り番地をそのプログラムに合わせることができれば、悪意のあるプログラムを 起動できることを説明する。(一般的にバッファオーバフローと呼ばれる)

このため、バッファオーバフローを起こさないためにも、入力文字制限の 可能な fgets() を使用するなどのテクニックも紹介する。

FILE* fp ; // 何らかのファイル
char buff[ 100 ] ;
while( fgets( buff , sizeof( buff ) , fp ) != NULL ) {
char name[ 100 ] ;
int  data ;
if ( sscanf( buff , "%s%d" , name , &data ) == 2 ) {
// name,dataを使った処理
}
}