Cでユーザ入力を認識できないようにする方法

Cで不明なサイズのユーザー入力を処理する方法

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つの方法では、通常のユーザー入力how about i want to handle user input with 1000 or even more charactersのみを処理できますか? はい、「char bStr[1000]」またはそれ以上のサイズのように宣言できますが、これは動的で十分な柔軟性がありません。

溶液

これを修正するには、realloc()を使用してメモリサイズを動的に増やします。 まず、上記の `scanf()`バッファオーバーフローがどのように見えるかを見てみましょう。宣言した内容よりも多く入力するだけで、以下の結果が表示されます。

image

以下の例では、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;
}

image

完了しました。プログラムは未知のサイズのユーザー入力を簡単に処理できます。