ここでは、Cのユーザ入力を処理する2つの例を示します。
1. scanf
このメソッドは、バッファオーバーフローによる攻撃を受けやすく、バッファオーバーフローについて何を経験するかを宣言する以上のいくつかの文字を入力してみてください。
#include
#include
int main()
{
char bStr[80];
printf("\nEnter a very very very long String value:");
scanf("%s", bStr);
printf("\nLong String value:%s \n\n",bStr);
return 0;
}
2. fgets
この方法は、文字ユーザの入力を制限することによってバッファオーバーフローを保護することができる。
#include
#include
int main()
{
char bStr[80];
printf("\nEnter a very very very long String value:");
fgets ( bStr, 80, stdin );
printf("\nLong String value:%s \n\n",bStr);
return 0;
}
しかし、上記の2つのメソッドは、通常のユーザー入力のみを処理できます。** 1000以上のユーザー入力を処理する方法はありますか?はい、 “char bStr[1000]` “またはそれ以上のサイズのように宣言することはできますが、これは動的で柔軟性がありません。
解決策
これを修正するには、 `realloc()`を使ってメモリサイズを動的に増やしてください。先に `scanf()`バッファオーバーフローがどのように見えるかを見てみましょう。あなたが宣言したものより多くを入力し、以下の結果を見てください。
以下は、Cで動的メモリ割り当て(realloc)を使用して不明なサイズのユーザー入力を処理する例です。
#include
#include
int main()
{
unsigned int len__max = 128;
unsigned int current__size = 0;
char ** pStr = malloc(len__max);
current__size = len__max;
printf("\nEnter a very very very long String value:");
if(pStr != NULL)
{
int c = EOF;
unsigned int i =0;
//accept user input until hit enter or end of file
while (( c = getchar() ) != '\n' && c != EOF)
{
pStr[i++]=(char)c;
//if i reached maximize size then realloc size
if(i == current__size)
{
current__size = i+len__max;
pStr = realloc(pStr, current__size);
}
}
pStr[i]= '\0';
printf("\nLong String value:%s \n\n",pStr);
//free it
free(pStr);
pStr = NULL;
}
return 0;
}
完了すると、プログラムは未知のサイズのユーザー入力を簡単に処理できます。