문제

나는 최근에 완성된 대학 과정에서는 C그러므로 내가 부족한 경험,물론입니다.

일부 대학의 경향이 있는 학생들을 가르치 보안 프로그래밍 또는 적어도 몇 가지 요소.가 심지어 비디오 (에서 가져온 ).

는 C,복사열,필요로하고 있는 것으로 알고 있-strcpy 또는 문자열입니다.h 능합니다.어떻게 당신이 그것을 사용하에 안전하게 모든 프로그래밍이 가능한가요?당신은 몇 가지 기능을 처리 할당을 방지하 buffer overflow?가 인증서큐어 코딩에 대한 표준 C.그것의 예를 제공하고 준수하는 솔루션:

int main(int argc, char *argv[]) {
  /* ... */
  char prog_name[128];
  strcpy(prog_name, argv[0]);
  /* ... */
}

과 그들의 대가:

int main(int argc, char *argv[]) {
  /* ... */
  char *prog_name = (char *)malloc(strlen(argv[0])+1);
  if (prog_name != NULL) {
    strcpy(prog_name, argv[0]);
  }
  else {
    /* Couldn't get the memory - recover */
  }
  /* ... */
}

에서 촬영기, 예제 2.

하지만 지금까지 나는 그것을 얻는 더 많은 도전적인,더 많은 코드,더 많은 작품입니다.왜 아무도 하나의 변경 라이브러리가?거나 적어도 이유도 없을 제공하는 안전한 대체 라이브러리 또는 기능이 올바른 방법이 있을까?

읽어 주셔서 감사합니다, wishi

도움이 되었습니까?

해결책

이것 (거의 모든 시스템에서 사용 가능)의 POSIX 기능은 다음과 같습니다. strdup(). strcpy() 새 메모리를 할당하지 않고 이미 사용하려는 버퍼가있는 경우 사용되지만 버퍼가 얼마나 큰지, 문자열이 적합한 지 더 잘 알고 있습니다. 문자열이 맞는지 모르면 strncpy() 주어진 수의 문자 만 복사합니다. 따라서 복사 금액을 버퍼 크기로 제한 할 수 있습니다.

그리고 그 외에도, 다양한 방식으로 문자열 크기를 관리하는 Sting 라이브러리가 많이 있습니다.

그리고 당신이 그것을 태그로 만들기 때문에 c ++ : std::string 그것은 당신을 위해 모든 메모리 관리를 수행하고 이러한 문제를 제공하지 않습니다.

다른 팁

그만큼 (strlcpy, strlcat) 기능 OpenBsd 일반적으로보다 낫습니다 N 기능은 안전하고 사용하기가 더 빠르고 쉽지만 비표준입니다. 그러나 BSD 라이센스가 부여되므로 모든 프로그램에 알려진 우수한 구현을 포함시킬 수 있으므로 크로스 플랫폼과 보안이 될 수 있습니다.

Windows의 경우 이식성에 신경 쓰지 않으면 *_s 함수를 사용할 수 있습니다.

사용 strncpy:

#define BUFSIZE 127
int main(int argc, char *argv[]) {
  /* ... */
  char prog_name[BUFSIZE + 1];
  strncpy(prog_name, argv[0], BUFSIZE);
  progname[BUFSIZE]= '\0';
  /* ... */
}

거기 있습니다 *n* 대부분의 버전 str* 기능.

내가 올바르게 이해한다면, 당신의 실제 질문은 API 기능이 더 안전 해지지 않는 이유입니다.

한 가지 이유는 C 라이브러리가 유산이기 때문입니다 (지금 변경하기에는 너무 늦었습니다).

그러나 주된 이유는 라이브러리가 최소화되도록 설계되어 최소한의 최소값을 수행하고 올바르게 호출되도록 사용자의 책임이기 때문입니다. 과도한 수표를 수행 한 경우, 사용자가 다른 이유가 발생하지 않을 것이라고 확신 할 수 있더라도 가격이 부름을받을 때마다 가격이 지불됩니다. 이것은 많은 API에서 매우 일반적입니다.

즉, 더 안전한 대안을 제공하는 충분한 라이브러리가 있으며 표준 라이브러리의 일부가 아닙니다. 또한 더 높은 수준의 작업을 수행하는 많은 사람들이 C ++와 함께 일하며, 이는 많은 것들에 대한 표준 클래스 라이브러리가 있습니다.

실제로,Microsoft 제공합니다 안전한 대안을 CRT 능합니다.모두 내가 알고 그들을 미워하는지와 사용하지 않는 경고를 사용하면 안된 오래된 기능이다.무언가를 원하는 경우 안전하고,어쩌면 당신은 사용해야 하는 C++.고 다음 중 하나 STL 문자열 또는 무언가 다음과 같이터 프로그램입니다.

잘,또는 당신 플랫폼니다.NET 또는 Java,일반적으로 고통을 하지 않에서 이러한 문제(앱에 충돌 할 수 있습니다,그러나 없는 방법에 코드를 삽입을 통해 응용 프로그램 buffer overflow).

편집:데이터 실행을 예방/NX 사용 가능(기본값 Vista.NET),이 되지 않는 문제에 대한 전통적인 플랫폼을 뿐입니다.

int main
(
    int argc, 
    char *argV[]
) 
{
   char prog_name[128];
   if (strlen(argV[0]) < sizeof(prog_name))
   {
       strcpy(prog_name, argV[0]);
   }
   else
   {
       printf("%s is too large for the internal buffer\n", argV[0]);
   }

   return 0;
}

어쩌면 당신은 유용한 읽기 답변을 찾을 것입니다 이 질문

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top