c로 만드는 cgi에서 파일다루기

부활의 이미지

호스팅 받는 곳에서 cgi를 사용하려는데 파일다루기가 되지 않네요.
간단하게 서버의 파일을 복사하는 예제가지고 시험을 해 보았는데 터미널에서
할 때는 잘 되던 것이 웹에서 파일 불러서 실행하니 계속 500에러가 뜹니다.
회사에 말해보니 cgi에 제한 걸어 놓은 것은 없다고 하는데, 왜 실행되지 않을
까요?
소스코드는 이렇습니다. 매운 간단한거.

#include<stdio.h>
#include<stdlib.h>

int main()
{
  int c;
  FILE *in, *out;

  printf("Content-type: text/html\n\n");

  printf("<html><body>\n");

  printf("file copy start<br>\n");

  in=fopen("file.in", "r");
  if(in==NULL)
  {
    printf("in file open error");
    exit(-1);
  }
  out=fopen("file.out", "w");

  while((c=fgetc(in)) != EOF)
  {
   fputc(c,out);
  }

  printf("filecopy end\n");
  return 1;
}

위에서 in=fopen(...)에서 걸립니다. 저것 전까지는 제대로 수행되구요.
이상하게 다른 것을 실행해도 fopen에서 파일을 얻어내지 못하네요.
도대체 무엇이 문제일까요?

dotri의 이미지

in = fopen( ...
이 라인에서 문제가 발생한다고 그러셨는데요
그걸 어떻게 확인하셨는지 모르겠네요.
일단 어느 문장에서 문제가 생기더라도 웹에서는 무조건 500 에러페이지가 보일것이고..
쉘에서 실행시킬때 문제가 생겼다면 정확히 어디에서 문제가 생겼는지 파악하기 쉬울텐데요.

부활의 이미지

적당한 곳에 exit나 printf를 넣어서 확인을 합니다.
계속 실행되다가 다음 명령 뒤에 exit를 넣었는데 500이 뜨면 그것이 문제인
것을 알 수 있습니다. 저는 cgi에서 에러 확인을 이렇게 합니다.

pynoos의 이미지

directory가 nobody에 의해 씌여질 수 있는 permission인지 확인해보세요.

shell에서 돌릴 때와 web에서 돌리때의 큰 차이는 permission입니다.

부활의 이미지

directory 퍼미션을 777로 바꾸니 실행되네요.
감사합니다. 퍼미션.. 퍼미션..
음, 그런데 777은 왠지 불길한 느낌이 솟아오르네요. 꼭 누군가가 장난칠 것
같은...
아무런 문제 없을까요? 777? 불길한 숫자로 밖에 보이지 않네요.
호스팅을 받는 상황이라서 어쩔 수도 없고...

어쨌든 답변 감사합니다.
감사하는 의미에서 애기가 예쁘네여. 꼭 답변 때문이 아니라...^^

choissi의 이미지

cgi 개발을 하다가 알수 없는 오류가 나면 난감한데
요즘은 단독 모드로 아파치 하나만 띄어서 디버거를 돌립니다.

아래의 링크를 한번 참조해 보시죠..

디버깅 아니더라도.. 시스템 콜 트레이스를 걸어봐도
도움이 됩니니다.

http://www.ezdoum.com/write.php?rid=02/08/17/6349113&where=stories.php?story=02/08/17/3254153&cmode=&comment_sort=asc&p=1

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

pynoos의 이미지

당근! 문제 있지요...

1,2만원으로 호스팅 받는 상황에서 다른 login 사용자에게 홈페이지 구조가 어느 정도 알려지는 것은 감수 해야합니다.

directory permission 들은 701로 하고
file도 php나 shell script는 어쩔수 없지만
c로 만든 것이면, 701로 넣어 주세요.

cgi가 파일에 써야하는 경우라면 따로 그 파일에 대해서는 606 속성을 넣어야하겠죠.

php, shell script들은 그 자체로 실행 파일이 아니며, 다른 실행파일에 의해 읽*혀*져야하므로 어쩔 수 없이 php는 604, shell script는 705 속성을 지닐 수 밖에 없습니다.

중요한 것은 cgi file은 다른 사람에 의해 읽지는 못하되 실행만 가능하게(--x) 하시고,
cgi file이 사용하시는 file의 이름이 공개되지 않게 하시면 어느정도 예방은 됩니다.

cdpark의 이미지

cgi 프로그램에 suid를 거는 소극적인 방법과, 아예 아파치에서 cgi를 수행할 때 suexec를 통하도록 하는 적극적인 방법이 있습니다.

sangheon의 이미지

pynoos wrote:
당근! 문제 있지요...

1,2만원으로 호스팅 받는 상황에서 다른 login 사용자에게 홈페이지 구조가 어느 정도 알려지는 것은 감수 해야합니다.

directory permission 들은 701로 하고
file도 php나 shell script는 어쩔수 없지만
c로 만든 것이면, 701로 넣어 주세요.

cgi가 파일에 써야하는 경우라면 따로 그 파일에 대해서는 606 속성을 넣어야하겠죠.

php, shell script들은 그 자체로 실행 파일이 아니며, 다른 실행파일에 의해 읽*혀*져야하므로 어쩔 수 없이 php는 604, shell script는 705 속성을 지닐 수 밖에 없습니다.

중요한 것은 cgi file은 다른 사람에 의해 읽지는 못하되 실행만 가능하게(--x) 하시고,
cgi file이 사용하시는 file의 이름이 공개되지 않게 하시면 어느정도 예방은 됩니다.

카페24에서 제공하는 호스팅은 아파치 모듈을 이용해서 600, 700 파일도
아파치에서 다룰 수 있도록 해뒀더군요.

덕분에 다른 사용자가 들어와서 파일 읽을까봐 걱정할 필요가 없어 좋았습니다.

--

Minimalist Programmer

pynoos의 이미지

그렇다면 그것은 사용자의 home에 접근할 때는 권한이 su 된다는 얘기 같군요.

맞나요?

apache에 그런 모듈이 있다면 가능할 것 같은데.. 자세한 사항을 메모해주시면..

명랑한 apaching 이 될 것 같습니다.

hanbak의 이미지

mod_become 이라는 모듈을 쓰면 가능은 합니다만..

절대 권장사항은 아닙니다.

아파치는 절대적으로 안전하다 라는 믿음이 있다면 쓰셔도 상관은 없을듯 싶습니다.

헌데 저 같은 경우도 어쩔수 없이 쓰기는 합니다. 왜냐하면 PHP 에서 사용자 들에게 suid 제한을 줄수 있는 유일한 해결책 이기 때문이죠..

http://www.snert.com/Software/mod_become/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.