c言語における不安全ライブラリ関数

2610 ワード


安全でないライブラリ関数
CとC++は境界検査を自動的に行うことができず,境界検査の代価は効率である.一般的に、Cは多くの場合効率を重視している.しかしながら、効率を得る代価として、Cプログラマーはバッファオーバーフローの問題を回避するために十分に警戒しなければならない.
C言語標準ライブラリの多くの文字列処理とIOストリーム読み出し関数は、バッファオーバーフローの原因となります.これらの関数を理解し、プログラミングに注意する必要があります.
一、文字列処理関数
strcpy()
strcpy()関数は、ソース文字列をバッファにコピーします.コピーする文字の数が指定されていません.ソース文字列がたまたまユーザーから入力され、サイズを特に制限していない場合は、バッファオーバーフローが発生する可能性があります.
strncpyを使用して同様の目的を達成することもできます:strncpy(dst,src,dst_size-1);srcがdstより大きい場合、この関数はエラーを放出しません.最大サイズに達すると、文字のコピーを停止するだけです.注記strncpy()の-1が呼び出されます.srcがdstより長い場合は、dst配列の末尾に空の文字を置くスペースを残します.でも!strncpy()も完全に安全ではなく、事を台無しにする可能性もあります.「セキュリティ」の呼び出しが終了していない文字列を残したり、微妙な違いが発生したりすることがあります.
strcpy()がオーバーフローしないことを確認する別の方法は、 , strlen() である.
dst = (char *)malloc(strlen(src));   
strcpy(dst, src); 

strcat()
strcat()関数はstrcpy()によく似ています.文字列をバッファの末尾にマージすることができます.同様の、より安全な代替方法strncat()もあります.可能であればstrncat()を使用し、strcat()を使用しないでください.
sprintf()、vsprintf
関数sprintf()およびvsprintf()は、テキストをフォーマットし、バッファに格納するための汎用関数です.strcpy()動作を直接模倣することができます.すなわち、sprintf()およびvsprintf()の使用はstrcpy()の使用と同様に、プログラムにバッファオーバーフローをもたらしやすい.
sprintf()の多くのバージョンには、この関数を使用するより安全な方法があります.フォーマット文字列自体の各引数の精度を指定できます.sprintfは「*」を用いて、もともと幅や精度を指定する定数数が必要な位置を占有し、実際の幅や精度は他の印刷された変数と同様に提供することができる.
  :  
sprintf (usage, "USAGE: %*s
", BUF_SIZE, argv[0]);

二、文字読取関数
gets()
gets()は決して使用しないでください.この関数は、標準入力からユーザーが入力したテキストの行を読み込み、EOF文字または改行文字に遭遇するまでテキストの読み込みを停止しません.すなわち、gets()は境界チェックをまったく実行しません.したがって、gets()を使用すると、常にバッファがオーバーフローする可能性があります.
代替方法として、方法fgets()を使用することができる.gets()と同様のことをすることができるが、読み込み文字数を制限するためのサイズパラメータを受け入れるため、バッファオーバーフローを防止する方法が提供される.
getchar()、fgetc()、getc()、read()
これらの関数をループで使用する場合は、バッファ境界を確認します.
scanf()シリーズ:sscanf()、fscanf()、vfscanf()、vscanf()、vscanf()
scanfシリーズの関数も設計が悪い.宛先バッファにもオーバーフローが発生する可能性があります.同様に,設定幅でもこの問題を解決できる.
getenv()
システム呼び出しgetenv()を使用する最大の問題は、特別な環境変数が特定の長さであるとは仮定できないことです.
三、安全バージョンのコードライブラリを使用する
マイクロソフトは、バッファオーバーフローの危険があるAPIに対して、開発したセキュリティバージョンのライブラリを使用して代替します.SafeCRTはVisual Studio 2005よりサポートを開始しています.コードに無効な危険なCRT関数が使用されている場合、Visual Studio 2005がコンパイルされると、開発者にSafe CRTに代わるより安全であることを考慮するように警告情報が報告されます.
  • 文字列コピーに関するAPI:strcpy、wcscpyなどの代替Safe CRT関数:strcpy_s
  • 文字列結合に関するAPI、例えばstrcat、wcscatなどの代替Safe CRT関数:strcat_s
  • sprintfに関するAPI例えばsprintf,swprintfなどの代替Safe CRT関数:snprintf_s _snwprintf_s

  • 他にも無効なAPIにはscanf,strtok,gets,itoaなどがあります.」n」シリーズの文字列処理関数、例えばstrncpyなども無効になっている列