항상 avr만을 하다 2440임베디드 리눅스 프로젝트에 참여하게 되었습니다.

제가 맡은 분야는 웹서버 및 OLED 디바이스 드라이버 부분 입니다.

여기서는 웹서버 포팅 후 사용자 인증 시스템 제작에 관한 부분 입니다.

펌웨어만을 하다가 cgi 라는 서버사이드프로그램은 처음 만져보아 막막하였습니다.;;

html 이야 기본은 알고 있었지만 cgi 라 하여 생소하였습니다.

임베디드 리눅스 상에 perl 이나 php asp 와 같은 서버사이드프로그램들은 대부분 포팅되어 있지 않아

어쩔수 없이 apache 기반에 cgi를 사용하게 되었습니다.

몇몇의 사이트 검색 결과 boa webserver 에 php를 붙여 사용하신다는 분도 kelp 에서 본 기억이 있긴 합니다만 열악한 환경상의 임베디드 기반 시스템에 db 및 php 스크립트와 같은 덩치큰(?) 프로그램을 사용하기엔 힘이 듭니다;;

 

리눅스 상의 cgi 는 c를 기반으로 프로그래밍 하게 됩니다.

컴파일 역시 arm linux gcc를 이용하여 하게 됩니다.

 

================

2009년 2월 9일 추가

================

웹서버로 apache 를 선택하였습니다.

그 이유는 쉬운 포팅과 cgi의 기본 지원을 들 수 있습니다. 물론 gohead webserver 와 자주 사용되는 boa webserver 도 있지만 대중적으로 사용되는 apache webserver에 한표를 두었습니다.

webserver porting을 마친 후 바로 cgi 프로그래밍에 들어갔습니다.

우선 apache의 환경 설정 부분에서 cgi- script를 사용 가능하도록 수정 후 index.html 을 제작하여

로그인 부분 ui를 꾸몄습니다.

그 후 폼으로부터 입력된 id와 password 를 파싱하는 login.cgi 를 제작하였습니다.

로그인 될 아이디와 패스워드는 임베디드보드 안에 따로 디비를 두기에 공간이 충분치 않아 account.dat 파일을

제작하여 보관하도록 하였습니다. 다음 부분은 로그인 부분의 소스 입니다.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000        //login retry
#define RNUM 30         //retry number
#define TRUE 1
#define FALSE 0


int main(int argc, char *argv[])
{

                FILE *fp;

                int fd;         //file description
                int i;
                int index = 0;
                int len1, len2, len;
                char std[10][16];
                char *tmp;
                char *id;
                char *password;
                char *buf;
                char *str1, *str2;

                printf("Content-type:text/html\n\n");
                len = atoi(getenv("CONTENT_LENGTH"));
                str1 = (char*)malloc(20);
                str2 = (char*)malloc(20);
                buf = (char*)malloc(len);
                int tryNum =RNUM;
                int lFlag=0;
                fread(buf, 1, len, stdin);

                int ab = 0;
                //printf("len=%d<br>", len);
                //printf("buf=%s<br>", buf);
                tmp = (char*)strtok(buf, "&=");
                str1 = (char*)strtok(NULL, "&=");

                tmp = (char*)strtok(NULL, "&=");
                str2 = (char*)strtok(NULL, "&=");

                printf("ID : %s<br>", str1);
                printf("PW : %s<br>", str2);
                printf("<html><head>PLANETINT LOGIN SYSTEM</head>");
                printf("<body>");
                fp = fopen("../account.dat", "rt");
                if(fp == NULL) {
                        printf("<h2>DB ERROR</h2>\n");
                        return;
                }
   while(feof(fp) == 0)
                {
                        fscanf(fp,"%s", &std[index][0]);
                //      printf("<h2>account info %s</h2>", std[index]);

                        index++;
                }


                index=0;
                while(tryNum > 0)
                {
                if(!strcmp(str1,std[index]) && !strcmp(str2,std[index+1]))
                    {
                        printf("<h2> login success </h2>");
                        lFlag = TRUE;

                        printf("<h2>account id info %s</h2>", std[index]);
                        printf("<script language=\"javascript\">\n");
                        printf("location.href=\"../index.html\"\n");
                        printf("</script>\n");
                        break;
                    }
                else
                    {

                        printf("<h2>tryNum: %d</h2>", tryNum);
                        tryNum--;
                        lFlag = FALSE;
                        index++;
                        printf("<h2>account pw info %s</h2>", std[index]);
                    }
                }
                if(!lFlag)
                {
                        printf("<h2> login false </h2>");
                }


                printf("</body></html>");

                fclose(fp);
}

 

소스를 보면 아시겠지만 폼으로부터 전달되는 아이디와 패스워드를 파싱하여 str1 / str2 에 저장한 후

어카운트 파일을 모두 읽어와 저장한 부분과 매치되는지 반복문을 이용하여 전체 탐색하도록 한 부분 입니다.

중간 중간 디버깅을 위한 printf문이 들어가 있네요 ㅎㅎ 로그인 완료시 자바스크립을 이용하여 다른창으로 이동하도록 location 을 넣었습니다.

 

로그인 소스를 살펴보시면 아시다시피 버그가 눈에 뛸 것 입니다 ㅎㅎㅎ

이부분은 차 후 어드민 로그인 단 한계정만을 사용할 것이기에 귀찮아서 수정하지 않을꺼랍니다 ㅡㅡ;;;

 


+ Recent posts