begin process at 2012 02 09 21:27:39
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > CGI COMMON GATEWAY INTERFACE EN C

CGI COMMON GATEWAY INTERFACE EN C


 Information sur la source

Note :
Aucune note
Catégorie :Réseaux & Internet Classé sous :cgi, login, c Niveau :Initié Date de création :28/05/2007 Vu / téléchargé :5 722 / 241

Auteur : justgivemetta

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

Cette source permet a l'aide de formulaire html et d'un serveur supportant le Cgi de pouvoir créer des comptes dans un fichier data.log et de s'authentifier avec le compte que l'on a créé.

Le programme en C décompose correctement la requête POST afin de bien récupérer les variables de login et mot de passe et les écrit dans le fichier data.log si l'on est passé par le formulaire de création de compte ou teste les variables en lisant dans le fichier data.log si l'on est passé par le formulaire d'authentification.

NB: Compilé sous gcc, est fonctionnel grâce au serveur python "serveur.py". Il est préferable de faire fonctionner cette source sous linux car ca ne marche pas sous windows jusqu'à preuve du contraire ;D.

Source

  • /* C'est la source pour s'authentifier, regarder dans le zip pour tout avoir (-; be happy!!! */
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <string.h>
  • /* Ces trois premieres fonctions permettent d'afficher du code correct en HTML, la fonction erreur permet d'afficher un message d'erreur en html si il ya un problème lors de la reception de la chaine en POST*/
  • void erreur (message)
  • {
  • printf("\n<br><font color=\"red\">ERREUR : %s</font>", message);
  • exit(0);
  • }
  • void reponsehttp (void)
  • {
  • printf("Content-type: text/html\n\n");
  • }
  • void debutpage (char *titre)
  • {
  • printf("\n<html>\n\t<head><title>%s\n</title>\n</head>", titre);
  • printf("<body bgcolor=\"white\">\n");
  • }
  • void finpage (void)
  • {
  • printf("</body></html>");
  • }
  • /* Voici la fonction decoupe qui va permettre de récupérer correctement les données reçues en POST,elle fonctionne avec le paremètre *entre qui correspond a la chaine de base, ensuite on trouve *sortie1 et *sortie2 qui sont deux variables qui contiendront la chaine de base découpée de par et d'autre par "carac", c'est à dire le caractère qu'on a choisi pour délimiter la chaîne */
  • void coupe (char *entree, char *sortie1, char* sortie2, char carac)
  • {
  • char *position;
  • position=strchr(entree, carac);
  • strncpy(sortie2, position+1, strlen(position));
  • strncpy(sortie1, entree, strlen(entree)-strlen(position));
  • sortie1[strlen(entree)-strlen(position)]='\0';
  • }
  • /* C'est grace a cette fonction que l'on va lire toutes les données du post */
  • char *LitDonneesPost()
  • {
  • char *donnees; //donnees du formulaire
  • char *chtaille;
  • int taille; //taille des donnees
  • chtaille = getenv("CONTENT_LENGTH");
  • taille = atoi(chtaille);
  • fflush(stdout);
  • donnees = (char *) malloc(taille);
  • if (donnees == NULL) erreur("pb allocation memoire");
  • if (fread(donnees, 1, taille, stdin) != taille)
  • erreur("Pb lecture entree standard");
  • return donnees;
  • }
  • /* dans cette fonction on va pouvoir traiter les données que l'on a recu dans le POST */
  • void recupdonnees(void)
  • {
  • FILE *fichier;
  • struct user { //ici on déclare la structure pour pouvoir lire dans le fichier data.log
  • char login[100];// c'est la variable qui contiendra le login du fichier
  • char passwd[100];// ici pour le mot de passe dans le fichier
  • };
  • struct user utilisateur;
  • int ok,ok2,i;//Declaration des deux booléens et initialisation à 0
  • ok=0;
  • ok2=0;
  • char login[20],maitre[20],yoda[20],name[20],input1[20],input2[20],pass[20],dechet1[30],dechet2[30];
  • //ici on declare toutes les variable char dont on a besoin, eh oui il yen a beaucoup !!!
  • long taille;
  • char *methode;
  • char *data;
  • methode = getenv("REQUEST_METHOD");
  • fflush(stdout);
  • if (strcmp(methode,"POST")==0)
  • data = LitDonneesPost();
  • else exit(0);
  • taille=strlen(data);
  • for (i=0; i<taille; i++) if (data[i] == '&') data[i] = ' ' ;//ici on applique une boucle for afin de remplace l'esperluette par un espace et que cela soit par la suite plus aisé pour le decoupage
  • //printf("<br>%s",data);
  • coupe(data, input1, input2, ' ');//ici on coupe de par et d'autre la chaine recu a partir d'un espace et on met ce que l'on a obtenu dans deux variables input1 et input2
  • coupe(input1,name,maitre,'=');// ici on va decouper le input1 de par et d'autre du "=" afin de récupérer maitre qui contient le login posté.La variable name contiendra simplement le nom qu'on a donné au input dans le formulaire HTML
  • strcpy(login,maitre);// pour des raisons de bon fonctionnement il faut copier la chaine maitre dans login. Car a la fin de quelques utilisations de la fonction coupe, la variable "maitre" ne contenait plus le login.
  • //printf("%s",login);
  • coupe(input2,dechet1,yoda,'=');//le formulaire transmettait quelques données en plus avec x=un_nbre&y=un_nbre, il suffit juste d'utiliser cette fois-ci la fonction coupe deux fois pour récupérer le mot de passe posté
  • coupe(yoda, pass, dechet2,' ');// le mot de passe posté se trouvera donc dans la variable passe
  • //printf("%s",pass);
  • /* une fois les variable de login et mot de passe correctement récupérées on peut enfin les comparées avec celle se trouvant dans le fichier data.log */
  • fichier=fopen("data.log","rb");
  • if (fichier != NULL){
  • while (!feof(fichier)){
  • fread(&utilisateur,sizeof(struct user),1,fichier);
  • if(strcmp(utilisateur.login,login)==0){
  • ok=1;
  • if(strcmp(utilisateur.passwd,pass)==0){
  • ok2=1;
  • }
  • }
  • }
  • }
  • fclose(fichier);
  • if(ok==1 && ok2==1) {
  • printf("<p align=\"center\" <font color=\"green\">Vous etes bien enregistrer</font><p>");
  • }
  • else{
  • printf("<p align=\"center\" <font color=\"red\">Mauvais login/password,Veuillez resaisir</font><p>");
  • }
  • }
  • int main (int argc, char *argv[])
  • {
  • reponsehttp();
  • debutpage("Identification en Cgi");
  • recupdonnees();
  • finpage();
  • return 0;
  • }
/* C'est la source pour s'authentifier, regarder dans le zip pour tout avoir (-; be happy!!! */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Ces trois premieres fonctions permettent d'afficher du code correct en HTML, la fonction erreur permet d'afficher un message d'erreur en html si il ya un problème lors de la reception de la chaine en POST*/
void erreur (message)
{
  printf("\n<br><font color=\"red\">ERREUR : %s</font>", message);
  exit(0);
}
void reponsehttp (void)
{
  printf("Content-type: text/html\n\n");
}
void debutpage (char *titre)
{
  printf("\n<html>\n\t<head><title>%s\n</title>\n</head>", titre);
  printf("<body bgcolor=\"white\">\n");
}
void finpage (void)
{
  printf("</body></html>");
}
/* Voici la fonction decoupe qui va permettre de récupérer correctement les données reçues en POST,elle fonctionne avec le paremètre *entre qui correspond a la chaine de base, ensuite on trouve *sortie1 et *sortie2 qui sont deux variables qui contiendront la chaine de base découpée de par et d'autre par "carac", c'est à dire le caractère qu'on a choisi pour délimiter la chaîne */

void coupe (char *entree, char *sortie1, char* sortie2, char carac)
{
	char *position;
	
	position=strchr(entree, carac);
	
	strncpy(sortie2, position+1, strlen(position));
	strncpy(sortie1, entree, strlen(entree)-strlen(position));
  	
	sortie1[strlen(entree)-strlen(position)]='\0';
}
/* C'est grace a cette fonction que l'on va lire toutes les données du post */
char *LitDonneesPost()
{
  char *donnees; //donnees du formulaire
  char *chtaille;
  int taille; //taille des donnees
  chtaille = getenv("CONTENT_LENGTH");
  taille = atoi(chtaille);
  fflush(stdout);
  donnees = (char *) malloc(taille);
  if (donnees == NULL) erreur("pb allocation memoire");
  if (fread(donnees, 1, taille, stdin) != taille)
    erreur("Pb lecture entree standard");
  return donnees; 
}
/* dans cette fonction on va pouvoir traiter les données que l'on a recu dans le POST */
void recupdonnees(void)
{
FILE *fichier;
struct user { //ici on déclare la structure pour pouvoir lire dans le fichier data.log
char login[100];// c'est la variable qui contiendra le login du fichier
char passwd[100];// ici pour le mot de passe dans le fichier
};
struct user utilisateur;
int ok,ok2,i;//Declaration des deux booléens et initialisation à 0
ok=0;
ok2=0;
char login[20],maitre[20],yoda[20],name[20],input1[20],input2[20],pass[20],dechet1[30],dechet2[30];
//ici on declare toutes les variable char dont on a besoin, eh oui il yen a beaucoup !!!
long taille;
char *methode;
char *data;
	methode = getenv("REQUEST_METHOD");

	fflush(stdout);
	if (strcmp(methode,"POST")==0)
	data = LitDonneesPost();
	
	else exit(0);
	taille=strlen(data);

	for (i=0; i<taille; i++) if (data[i] == '&') data[i] = ' ' ;//ici on applique une boucle for afin de remplace l'esperluette par un espace et que cela soit par la suite plus aisé pour le decoupage

	//printf("<br>%s",data);
	coupe(data, input1, input2, ' ');//ici on coupe de par et d'autre la chaine recu a partir d'un espace et on met ce que l'on a obtenu dans deux variables input1 et input2

	coupe(input1,name,maitre,'=');// ici on va decouper le input1 de par et d'autre du "=" afin de récupérer maitre qui contient le login posté.La variable name contiendra simplement le nom qu'on a donné au input dans le formulaire HTML

	strcpy(login,maitre);// pour des raisons de bon fonctionnement il faut copier la chaine maitre dans login. Car a la fin de quelques utilisations de la fonction coupe, la variable "maitre" ne contenait plus le login.
	//printf("%s",login);

	coupe(input2,dechet1,yoda,'=');//le formulaire transmettait quelques données en plus avec x=un_nbre&y=un_nbre, il suffit juste d'utiliser cette fois-ci la fonction coupe deux fois pour récupérer le mot de passe posté

	coupe(yoda, pass, dechet2,' ');// le mot de passe posté se trouvera donc dans la variable passe
	//printf("%s",pass);

	/* une fois les variable de login et mot de passe correctement récupérées on peut enfin les comparées avec celle se trouvant dans le fichier data.log */
		fichier=fopen("data.log","rb");
			if (fichier != NULL){
			while (!feof(fichier)){
			fread(&utilisateur,sizeof(struct user),1,fichier);
			
			if(strcmp(utilisateur.login,login)==0){
			ok=1;
			if(strcmp(utilisateur.passwd,pass)==0){
			ok2=1;
			}
			}
			}
			}
			
		fclose(fichier);
		
		if(ok==1 && ok2==1) {
		printf("<p align=\"center\" <font color=\"green\">Vous etes bien enregistrer</font><p>");
		}
		else{
		printf("<p align=\"center\" <font color=\"red\">Mauvais login/password,Veuillez resaisir</font><p>");
		}
	
}
int main (int argc, char *argv[])
{
  reponsehttp();
  debutpage("Identification en Cgi");
  recupdonnees();
  finpage();
  return 0;
}

 Conclusion

On peut améliorer la source en écrivant des empreintes MD5 dans le fichier data.log au lieu d'écrire les mots de passe en brut (-; ! Je n'ai pas encore réussi, si quelqu'un veut bien essayer alors je ferais la mise à jour nécessaire !


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas
Source avec Zip Source avec une capture SECURE REMOTE SHELL [WIN32] par ganjarasta
Source avec Zip Source avec une capture SUIVI DE PRODUCTION ONDULEUR PHOTOVOLTAÏQUE SOLARMAX par brunovan
Source avec Zip MINICHAT MULTI-CLIENT par wisar
SOCKET CPP par baptchr55

 Sources en rapport avec celle ci

Source avec Zip SERVEUR HTTP/HTTPS MULTITHREADS LINUX par naingenieur
Source avec Zip CODE DE HUFFMAN par Ricky_MacElroy
Source avec Zip Source avec une capture AFFICHAGE D'IMAGES JPG AVEC IPICTURE EN C par racpp
Source avec Zip UN BOT EN C POUR LE IRC AVEC SON BAZOOKA par The_Guardian
Source avec une capture Source .NET (Dotnet) JEU D'ECHEC TYMULUS MODIFIÉ PAR MÉLANIE GAGNÉ par einalem58

Commentaires et avis

Commentaire de Cyberboy2054 le 29/05/2007 22:20:54

Intéressant sur le principe (même si c'est un peu un truc de dingue juste pour gérer un formulaire), mais on a pas inventé le php entretemps ?

Commentaire de justgivemetta le 30/05/2007 03:12:07

Si si on a bien inventé le php, mais le but était de le faire en C: devoir à rendre oblige ;). Sinon c'est clair qu'en php c'est un peu plus simple !

Commentaire de Nebula le 07/06/2007 09:52:04

Au boulot on n'utilise quasiment que des CGIs en C, pour des raisons de performance notamment... Mais c'est clair qu'une librairie CGI allège le code, çà revient (presque) à faire du PHP :)

Pour ce qui est du MD5, tu utilises quel système ? Pour Windows j'ai posté des exemples sur ce site (regarde dans mes sources), pour Unix tu peux utiliser OpenSSL : http://www.openssl.org/docs/crypto/md5.html

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Programme avec Login et PassWord [ par SneakGuy ] Salut,Je voudrais me faire un petit programme qui permet l'accès à quelque chose (qui demande un Login et un PassWord). Je veux qu'il aille chercher l recuperation de parametres avec cgi [ par zmaster ] Salut,j'ai récupéré le programme qui permet de trouver la solution (basé sur le jeu : le compte est bon sur france 2) des chiffres donnés.Je désire l' login mdp C [ par shenron ] Personne n'aurait pas un ptit code tt fait, pr mettre un login et mdp en C, avec ecriture des login et mdp ds un fichier binaire?Merci ^_^ Login mdp en C [ par shenron ] Slt,Dites moi, je vais faire un acces login mot de passe sous C dans un prog, c koi la meilleure solution?1- Un fichier qui contient tous les login et Probleme typedef struct [ par shenron ] #include &lt;stdio.h&gt;#include &lt;conio.h&gt;#include &lt;string.h&gt;/*Definition de la structure*/typedef struct{ char login[11]; char mdp[11]; Comment recuperer le nom de login(win2000) [ par asik38 ] je voudrais récuperer le nom d'utilisateur avec borland 4.0Merci!!! Envoie d'une variable sur un site web via C++ [ par Arizona ] J'aimerais envoyer une variable sur un site web utilisant phpDans mon site web, je test une variable $loginet j'aimerais envoyer la variable login sur Combinaison ALT+fleche haut sous linux [ par homer242 ] salut,j'ai un petit soucis. je voudrais que lorsqu'un utlisateur appuis simultanément sur ALT+fleche haut, le programme revient en arrière (avec un go faire une fonction qui recherche .... ? ?? [ par Avalon10101 ] _-=AvAloN=-_voici une partie de mon code :class Compte{string loginstring pass;Public:Compte(nico,alex,gaby);void chercher();Compte ListdesComptes[255 besoin d'aide plzzz [ par Avalon10101 ] _-=AvAloN=-_Voici mon code : (en gros)#include &lt;iostream&gt;class Compte{string login;string pass;public:Compte();void chercher();Compte ListdesCom


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,061 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales