2011-03-02 4 views
1

나는 항목 예약을 위해 C/CGI 웹 응용 프로그램을 작성했습니다. 내 고객은 승인 된 사용자가 데이터를 삭제하고 변경할 수있는 '관리'기능을 추가하고 데이터를 추가 할 수없는 사용자는 데이터 만 추가 할 수 있도록 요청했습니다. 대부분의 로그인 구현보다 개념 상 훨씬 간단합니다. 암호 만 있고 사실상 'anonymous'와 'admin'의 두 상태 만 있습니다.단일 로그인을위한 최소한의 세션 관리가 필요하십니까?

나는 세션 관리가 session_start()과 같은 간단한 PHP 배경에서 왔습니다. 바로 $_SESSION으로 놀 수 있습니다. 물론 C/CGI에는 이와 비슷한 것이 없다. CGI 라이브러리 의존성을 추가하는 것을 피하고 싶습니다 (이미 glib에 의존하고, libmysqlclient를 혼동하고, 세션 관리에 대해 자세히 알고 싶습니다).

C/CGI에서 암호 기반 세션 관리를 수행하는 가장 간단한 방법은 여러 사용자, 많은 양의 세션 데이터 또는 복잡한 작업없이 간단하게 수행 할 수있는 방법은 무엇입니까?

답변

2

세션은 서버 측 유지 상태를 의미합니다. 당신은 사용자가 없기 때문에 당신이 더 쉽게 원한다고 생각합니다. 이 경우 만료일이있는 서명 된 쿠키로 처리 할 수 ​​있습니다. 이 튜토리얼은 파이썬으로 작업을 수행하는 방법을 보여줍니다 :

http://webpython.codepoint.net/cgi_cookie

+0

어떻게 것 I '기호'그와 내가 클라이언트가 로그인이 허가되어 있는지 확인하려면 어떻게해야합니까?비밀번호의 암호화 해시를 쿠키 키에 저장 하시겠습니까? 이 방법은 흥미 롭습니다. 나는 이런 식으로 뭔가를 간단하게 선호합니다. –

+0

@Delan 암호 해시는 자주 변경되지 않으므로 쉽게 해킹 당할 수 있습니다. 그것은 날짜와 플러스 일부 응용 프로그램 상태 플러스 소금처럼 뭔가의 해시 것입니다. 클라이언트가 올바르게 서명되고 만료되지 않은 쿠키를 보낸 경우 그는 로그인하여 권한을 부여받습니다. –

+0

@Delan 더 나은 해시는 쿠키에 저장된 타임 스탬프 + 고정 시간 간격 (n 일 + x 시간 + y 분 + z 초) + 소금입니다. 개인적이고 쉽게 만들고 확인하는 것이 좋습니다. –

1

먼저 브라우저에서 상태를 유지하는 방법을 결정해야합니다. 세션 쿠키를 사용하거나 각 페이지에서 세션 토큰을 전달 하시겠습니까? 쿠키 방식을 사용하는 경우 페이지 및 양식을 변경할 필요가 없지만 쿠키 관리가 아직 없으면 추가해야합니다 (session + httpOnly 쿠키 사용에주의하십시오).

서버에서 상태에 관한 데이터를 얻는 방법 : 이미 데이터베이스를 사용하고 있다면 "SESSION_ID"와 "EXPIRATION_DATE"열이있는 "SESSION"테이블과 "SESSION_ID"열이있는 "SESSION_DATA"라는 두 번째 테이블을 추가 할 수 있습니다. , "핵심 가치". 세션이 생성 할 수없는 경우

int session_createNewSession(long& session_id, long duration) 
int session_setValue(long session, char[] key, char[] value) 
int session_getValue(long session, char[] key, char[] value) 
int session_abandonSession(long session) 

이 함수는 오류 코드를 반환하거나 값을 얻을/설정 할 수 없습니다

이제 "그냥"몇 가지 간단한 기능을 만들어야합니다. 또한 오래된 세션을 삭제하기 위해 데이터베이스에서 정기적으로 실행되는 작업을 생성해야합니다. 이제이 곳에서 세션 시스템을 가지고

가, 나머지는 매우 간단합니다 :

  • 검사에 의해 수신 된 데이터를 처리하여 CGI에서
  • 가 로그인/암호가 맞다면 로그인 양식을 만듭니다 (비록 DB에서 암호를 저장하지 않습니다 접속이 OK 인 경우)
  • 을 소금에 절인 해시를 저장
), 세션에서 사용자 ID를 저장 (또는 경우에, 당신은 단지 "IsAdmin"값을 절약 할 수

당신은 실제로 간단하게 할 수 있습니다 : 단지 session_createNewSession (long & session_id, int isAdmin)이 충분할 수 있지만 (단 하나의 데이터베이스 테이블 만 있으면) 클라이언트가 아마도 시간이 지남에 따라 더 많은 기능을 요청할 것입니다.

마지막주의 사항 : session_id가 들여 쓰여진 필드가 아닌 임의의 필드임을주의하십시오. 그렇지 않으면 다른 사람의 세션을 도용하는 것이 매우 간단합니다.

관련 문제