CGI & Socket

Hallo,

ich habe mit C (cgi-Funktionen) ein Web-Applikation mit einem Login Bereich geschrieben.

beim starten des tools kommt index.cgi, das das Login Formular mit submit und 2 links lädt. Erst nach dem login darf der user den dritt link anschauen.

das funktionniert so: wenn username und passwort richtig eingegeben sind, dann sitze ich ein global variable auf true und lade ich neu mein formular
beim neuen laden frage ich ob die variable auf true ist, dann aktiviere ich das dritt link

Problem: Aber wenn das Fenester gesslosen und neu geoffnet, kann der user auf dem dritten link trotzdem anklicken ohne login.
Oder
wenn ander user auf dem server greift, hat er die möglichkeit auf dem dritten link zu greifen:
so sieht die CGI Funktion, die das login lädt:

static int LoginCgi(int htmlSock, int ContentLength, char *pArgs )
{
struct DATA data;
static const char *bodyfmt1 = „“;

char htmlbuf[MAX_RESPONSE_SIZE];

data.id = CTRL_stop_live_video_mode_E;
MBX_post( &MBX_CTRL_IN, &data, 0 );

html(„titele\r\n“);
html("");
html("");
html("");
html("");
sprintf( htmlbuf, bodyfmt1);
html( htmlbuf );
if(!productionStatus && !adjustmentStatus){ // 2 global variable
sprintf( htmlbuf, bodyfmt2);
html( htmlbuf );
}
sprintf( htmlbuf, bodyfmt3);
html( htmlbuf );
html(" „);
html(“");
/**********************************************************************/
/* user info */
/**********************************************************************/
html("");
html("");
html(" Username „);
sprintf( htmlbuf, serialfmt, User.username);
html( htmlbuf );
html(“ ");

/**********************************************************************/
/* login form */
/**********************************************************************/
html("");
if(!productionStatus && !adjustmentStatus){

html("");
html(" Enter your username and password „);
html(“");
html(„Username:“);
html("");
html("");
html("");
html(„Password:“);
html("");
html("");
html("");
html("");
html("");
html("");
}
/**********************************************************************/
/* logout button */
/**********************************************************************/
else{
html("");
}
html("");
html("");
html("");
html(" „);
html(“");
html("");
return 1;
}

die Action des Formular wird zu login_action.cgi weitergeleitet:

// Page Creation Macro
#define html(str) httpSendClientStr(htmlSock, (char *)str)

Bool productionStatus = FALSE;
Bool adjustmentStatus = FALSE;
struct user User = {„Gast“};

static int cfgLogin(int htmlSock, int ContentLength, char *pArgs );

extern char *cgiParseVars(char PostIn[], int *pParseIndex );

extern int cgiCheckVars(char *value, char *key, int minValue, int maxValue, char *keyString);

void AddWebFilesCfgLogin(void)
{
efs_createfile(„login_action.cgi“, 0, (UINT8*)cfgLogin);
}

void RemoveWebFilesCfgLogin(void)
{
efs_destroyfile(„login_action.cgi“);
}

static int cfgLogin(int htmlSock, int ContentLength, char *pArgs )
{
char *buffer, *key, *value;
int len;
int parseIndex;
char *userNameStr, *passwortStr, *buttonValue ;

// CGI Functions can now support URI arguments as well if the
// pArgs pointer is not NULL, and the ContentLength were zero,
// we could parse the arguments off of pArgs instead.

// First, allocate a buffer for the request
buffer = (char*) mmBulkAlloc( ContentLength + 1 );
if ( !buffer )
goto ERROR;

// Now read the data from the client
len = recv( htmlSock, buffer, ContentLength, MSG_WAITALL );
if ( len document.location.href=„index.html“;"); // send responce to client
}
else
if( !strcmp(userNameStr, „user“) && !strcmp(passwortStr, „user“)){
adjustmentStatus = TRUE; // Store/Default button is actived
strcpy ((char*)&User.username, „User“);
html(„document.location.href=„index.html“;“); // send responce to client
}
else //Login error
html(„document.location.href=„index.html“;“);// send responce „login error“ to client
}
//Logout
else{
productionStatus = FALSE; // production button is deactived
adjustmentStatus = FALSE; // Store/Default button is deactived
strcpy ((char*)&User.username, „Gast“);
html(„document.location.href=„index.html“;“);
}

ERROR:
if( buffer )
mmBulkFree( buffer );

return( 1 );
}

Danke für die hilfe und viele Gruss.
Hicham

Hallo,

also ich würde dir mehrere sachen empfehlen:

  1. Templates verwenden, dass im c/c++ - code kein html vorkommt
  2. Eine library für Cgi verwenden wie z.B. qDecoder© oder cgicc(c++)

Durch eine Library wär wohl auch dein Problem gelöst welches meiner Meinung nach daraus besteht, dass du keine Session hast. Der Zugriff auf die dritte Stufe(?) sollte per Session id und client ip ziemlich eingeschränkt werden.

bye
Christoph