[[프로그래밍_NOTE]]/C , C++

gets() 안전한 사용법

갑빠돌격기 2008. 8. 25. 13:56

// 문제가 될수 있는 소스 //////////////////////
#include<stdio.h>

void main()
{
 char Name[5];
 char Addr[5];
 char TelNo[5];

 printf("이름 : ");
 gets(Name);
 printf("주소 : ");
 gets(Addr);
 printf("전화 : ");
 gets(TelNo);

 printf("이름 : %s\n", Name);
 printf("주소 : %s\n", Addr);
 printf("전화 : %s\n", TelNo);
}

// 결과 화면 //////////////////////////////

사용자 삽입 이미지





















    ※ gets() 는 버퍼 오버플로우 검사를 하지 않기때문에
        사용자가 배열의 크기를 알고 있지 못하다면,
        다른 배열의 영역을 침범하기 쉽다.


// 문제를 수정한 소스 //////////////////////
#include<stdio.h>
#include<malloc.h>
#include<string.h>

void main()
{
 char *Name;
 char *Addr;
 char *TelNo;

 char temp[1024];

 printf("이름 : ");
 gets(temp);
 Name = (char*)malloc(sizeof(temp)+1);
 strcpy(Name , temp);

 printf("주소 : ");
 gets(temp);
 Addr = (char*)malloc(sizeof(temp)+1);
 strcpy(Addr , temp);

 printf("전화 : ");
 gets(temp);
 TelNo = (char*)malloc(sizeof(temp)+1);
 strcpy(TelNo , temp);

 printf("이름 : %s\n", Name);
 printf("주소 : %s\n", Addr);
 printf("전화 : %s\n", TelNo);
}