c-lang:セーフティプログラミング
引数のチェック
渡される引数をすべてチェックするようにしておくことで、多くのセキュリティに関する問題を回避できます。
関数が受け取る引数の数、型が正確である
引数は、バッファサイズの制限内である
環境変数で渡される引数のチェック
main()関数が受け取る引数のチェック
終端の NULL もバッファサイズに含まれている
標準関数
任意の文字列を扱う場合、バッファサイズをチェックしない関数は使わない。
gets(line) → fgets(line, sizeof(line), stdin)
strcpy() → strncpy()
strcat() → strncat()
sprintf() → snprintf()
strlen() は、文字列の終端の NULL 文字が見つかることが確かでない限り利用を避ける。
また、fscanf(), scanf(), vsprintf(), realpath(), getopt(), getpass(), streadd(), strecpy(), strtrns() などの関数の利用には十分に注意を払う。
syslog()関数も、引数の長さをチェックするバージョンのものを利用する。
Miller氏と de Raadt氏が開発した strlcpy() と strlcat() を利用するとよい。
また、AT&T が作成し現在 Avaya Inc. のプロジェクトである libsafe を利用するのもよい。
スタティックな領域へのポインタを結果として返すような関数の利用も注意する。
全ての文字列を動的に割り当てる GNU のプログラミングガイドラインで推奨されている方法で、固定長のバッファを用いずに、全ての文字列を動的に割り当てる方法がある。
これの実装として Forrest J. Cavalier III 氏による「Libmib Allocated String Functions」 がある。