SDL (Security Development Lifecycle)
SDL은 보안을 위해 검사하는 기능으로 개발을 할 때 보안에 취약한 문제가 있는 함수를 사용하게 되면
오류로 표시해주는 기능입니다.
컴파일이 안 되는 건 아니지만 신경 쓰여서 경고문을 안 보고 싶어 집니다.
이전 글 scanf에서 설명한 것같이 전처리 문을 적어 보안 취약점을 배제하는 시큐어 코딩을 하던지,
설정에서 끄던지, 프로젝트 만들 때 체크 해제를 해줌 됩니다.
여러 가지 중 편한 방법 선택하시면 됩니다.
설정하는 법은 이전 글을 참고해주세요.
https://pk7912.tistory.com/134
단 문자열 입출력 함수 gets, puts는 버퍼 오버플로우(Buffer Overflow)의 가능성이 높아서 오류로 컴파일 안될 수 있습니다.
💡 Buffer Overflow
버그의 일종. 또는 이를 이용한 공격 방법. 프로그램이 실행될 때 입력받는 값이 버퍼를 가득 채우다 못해 넘쳐흘러 버퍼 이후의 공간을 침범하는 현상.
쉽게 말해 양동이(버퍼)에 물(값)을 받을 때(입력받기) 물을 너무 많이 받아 바닥에 흘러넘쳐버리는 것이라고 생각하면 된다.
주로 프로그램이 사용자에게 데이터(주로 문자열)를 입력받을 때 사용자가 말을 곧이곧대로 듣지 않고 이미 준비된 버퍼보다 더 많은 양의 데이터를 입력할 때 발생하나,
해커가 임의로 프로그램의 메모리의 값을(주로 스택) 변조할 때에도 쓰인다
주로 이 문제는 스택에서 발생하기 때문에 '스택 오버플로(Stack Overflow)'라고도 부른다
해결방법은 gets_s, puts_s로 바꿔주던지 SDL을 끄던지 해야 합니다.
위 scanf 해결방법과 일치합니다.
gets(str);
gets_s(str,sizeof(배열)); // 입력받는 문자열
puts(str);
puts_s(str,sizeof(배열)); // 출력하는 문자열 - \\0이 나올때까지 출력
_s를 붙이고 포인터나 배열의 길이를 추가 인자로 받습니다..
Tip) scanf_s나 getchar가 먼저 나온 후 puts_s를 사용하게 될 경우에는
scanf_s나 getchar에서의 쓰레기 개행 문자가 버퍼에 남기 때문에
문제가 발생하니 이럴 때는 gets_s를 사용하기 전에 버퍼를 비워줘야 합니다.
#include <stdio.h>
void Overflow();
int main()
{
char pin[5];
char name[5];
fputs("pin_num : ", stdout); // 출력
fgets(perID, sizeof(perID), stdin); // 최대 크기 7 byte를 키보드로 부터 입력 받음.
Overflowr(); // 입력 버퍼를 비우기. 그냥 읽어들임. 반환없이.
fputs("이름 입력: ", stdout); // 출력
fgets(name, sizeof(name), stdin); // 최대 5byte를 입력 받음.
printf("pin_num : %s \n", pin);
printf("이름: %s \n", name); return 0; }
void Overflow()
{ while (getchar() != '\n');
}
// 문자열의 끝 '엔터키'가 들어올때까지 계속 실행됨.
// 즉, 버퍼의 값을 사용하지 않고 그냥 버림.
해결방법 요약
- 프로젝트 속성에서 SDL 검사 항목 체크 해제
- _s를 사용하거나
- #define _CRT_SECURE_NO_WARNING,
- #pragma warning(disable : 4996)
'Compiler > VISUAL_STUDIO' 카테고리의 다른 글
Visual Studio) scanf 에러 해결 방법 (0) | 2022.05.02 |
---|
댓글