C/C++でBOF(バッファオーバーフロー)を引き起こさないようにするための方法を表にまとめました。
※{}で囲ってある部分については、適当な整数に置き換える
BOFを引き起こす可能性がある関数 | 代替案/対策 |
---|---|
gets( dest ) | fgets( dest , sizeof( dest ) , stdin ) |
strcpy( dest , src ) | memset( dest , 0 , sizeof( dest ) ) -> strncpy( dest , src , sizeof( dest ) - 1 ) |
strcat( dest , src ) | strncat( dest , src , sizeof( dest ) - strlen( dest ) - 1 ) |
sprintf( dest , ”%s” , data ) | sprintf( dest , ”%.{B}s” , data ) snprintf( dest , sizeof( dest ) , ”%.{B}s” , data ) ({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1) |
scanf( "%s” , dest ) | scanf( ”%.{B}s” , dest ) ({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1) |
sscanf( str , "%s” , data ) | sscanf( str , ”%.{B}s” , data ) ({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1) |
fscanf( fp , "%s” , data ) | fscanf( fp , ”%.{B}s” , data ) ({B}+フォーマット指定子で指定されていない部分の文字数=destの要素数-1) |
getchar() fgetc( fp ) getc( fp ) |
使用する際にバッファ境界チェックを行う。 |