Création d’un formulaire avec Apache & C CGI

Création d’un formulaire avec Apache & C CGI

Ce tutoriel aura pour but la création d’un formulaire d’inscription basique.

Par la suite, nous utiliserons Apache2 pour notre serveur web et le compilateur GCC pour créer nos binaires CGI.

 

  1.  Configuration du serveur web

 

Les .cgi ne sont pas exécutés de base par Apache. Il faut signifier au serveur web qu’il doit exécuter les .cgi avant l’envoie des données au client.

Pour ce faire nous allons éditer le fichier de configuration du virtual host par default.

Ouvrez le fichier /etc/apache2/sites-enabled/000-default.conf puis ajoutez les lignes suivantes avant la fin du virtualhost (entre les balises <VirtualHost> </VirtualHost>)

 

            ScriptAlias /cgi-bin/ /var/www/html/cgi-bin/

<Directory "/var/www/html/cgi-bin">

AllowOverride None

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch

Order allow,deny

Allow from all

</Directory>

 

Une fois le fichier sauvegardé, exécutez les commandes suivantes afin de mettre à jour et redémarrer votre serveur apache.

 

            service apache2 reload

 

service apache2 restart

 

Comme spécifié dans la configuration que nous venons de faire, nos scripts .cgi devront se trouver dans un répertoire /cgi-bin/, nous allons donc le créer à la racine de notre répertoire web.

 

            cd /var/www/html

mkdir cgi-bin

chmod +x cgi-bin

 

Notre serveur apache est maintenant prêt à exécuter nos script !

  1. Création d’un premier script

 

 

Maintenant que notre serveur est correctement configuré, nous pouvons commencer à créer notre premier script.

 

Rendez-vous dans votre dossier cgi-bin à la racine de votre répertoire web.

 

Nos fichiers seront composés de deux parties :

 

- Dans la première nous devrons compléter l’en-tête HTML de la requête en spécifiant  le type de contenu :

 

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

 

- Dans la seconde nous devrons écrire notre squelette HTML ainsi que son contenu :

 

            printf("<html>\n<head></head>\n<body>\

<h1>Ceci est notre premier test</h1>\

</body>\n</html>")

 

A présent créons un fichier C test.c dans notre répertoire cgi-bin qui contiendra le code d’exemple vue précédemment :

 

            #include <stdio.h>

 

int     main()

{

/* En-tête de la réponse HTML */

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

 

/* Contenu HTML */

printf("<html>\n<head></head>\n<body>\                                 <h1>Ceci est notre premier test</h1>\                     </body>\n</html>");

}

 

Maintenant que nous avons notre code en langage C nous devons le compiler pour pouvoir obtenir un binaire CGI qui sera exécuté par notre serveur apache.

 

            gcc test.c -o index.cgi

chmod -x index.cgi

 

Une fois la compilation terminée nous pouvons tester notre script depuis un navigateur, rendez-vous sur l’url http://127.0.0.1/cgi-bin/index.cgi

 

  1. Création de la partie HTML du formulaire

 

Afin de garder un code relativement lisible nous allons le séparer en plusieurs fonctions.

 

void    HTML_header(char *page_title) ;

Pour écrire le header de notre page : titre, encodage…

            void    HTML_header(char *page_title)

{

printf("<head>\n");

printf("<meta charset=\"UTF-8\">\n");

printf("<title>%s</title>\n", page_title);

printf("</head>\n");

}

 

 

 

void    HTML_form() ;

Pour écrire la structure du formulaire

            void    HTML_form()

{

printf("<form action=\".\">\n");

HTML_textbox("prenom", 1);

HTML_textbox("nom", 1);

HTML_textbox("email", 1);

HTML_textbox("password", 0);

printf("<input type=\"submit\" value=\"S'inscrire\">");

printf("</form>\n");

}

 

 

void    HTML_title(char *title, int level) ;

Pour écrire un titre : h1, h2, h3…

            void    HTML_title(char *title, int level)

{

printf("<h%d>%s</h%d><br>\n", level, title, level);

}

 

 

void    HTML_textbox(char *name, int visibility) ;

Pour écrire un input dans notre formulaire avec l’option visibility permettant de masquer ou pas les données (utile dans le cas d’un mot de passe)

            void    HTML_textbox(char *name, int visibility)

{

if (visibility == 1)

printf("%s :\t<input type=\"text\"                                                                                    name=\"%s\"><br>\n", name, name);

else if (visibility == 0)

printf("%s :\t<input type=\"password\"                                                             name=\"%s\"><br>\n", name, name);

}

 

 

int     main() ;

Pour écrire l’en-tête et le squelette html : <html>, <body>… et appeler les fonctions nécessaire à la création du formulaire HTML

            int     main()

{

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

printf("<html>\n");

HTML_header("Notre super formulaire !");

printf("<body>\n");

HTML_form();

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

printf("</html>");

}

 

Nous ne devons pas oublier d’inclure la librairie stdio.h au début de notre fichier source.

 

            #include <stdio.h>

 

Passons à présent à la compilation avec GCC

 

            gcc test.c -o index.cgi

 

Nous pouvons nous rentre sur l’url http://127.0.0.1/cgi-bin/index.cgi afin de contrôler  que notre formulaire ce soit correctement créé

 

  1. Récupération des données du formulaire

 

Les données du formulaire ont été envoyées en POST. Pour les récupérer nous devons parser la variable d’environnement QUERY_STRING (qui contient toutes ces données) en utilisant la fonction sscanf.

 

Si il n’y a aucun POST alors nous affichons la titre « S’inscrire », sinon nous remercions l’utilisateur qui vient de s’inscrire.

void    get_data()

{

char  prenom[150];

char  nom[150];

char  email[150];

char  password[150];

int   infos = 4;

 

char  *data = getenv("QUERY_STRING");

if (data == NULL)

printf("Erreure dans le script !!");

else

{

if (sscanf(data,"%*[^=]%*c%[^&]%*[^=]%*c%[^&]%*[^=]%*c%[^&]%*[^=]%*c%s", &prenom, &nom, &email, &password) < 0)

HTML_title("S'inscrire :", 2);

else

printf("Merci %s %s votre inscription à était prise en compte !<br>", prenom, nom);

}

}

 

Il ne faut pas oublier d’ajouter la librairie stdlib.h afin de pouvoir utiliser la fonction getenv()

            #include <stdlib.h>

 

Et d’appeler la fonction get_data() dans notre main

int     main()

{

...

printf("<body>\n");

get_data();

HTML_form();

...

}

 

 

 

Résultat lorsque l’on envoie des données en POST :

 

 

Résultat lorsque l’on charge la page sans envoyer de données :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *