Page suivante Page précédente Table des matières

15. Hack 14 : Home page dynamique via un CGI

par Michael Driscoll fenris@lightspeed.net

Ce hack est similaire au hack 11, mais il diffère en la méthode employée. Alors que le hack 11 implique l'utilisation d'un accès ftp vers le serveur http de votre FAI pour mettre à jour la page, celui ci accède à un CGI sur le serveur pour mettre en place la page elle-même.

Pour utiliser ce script, vous allez devoir convaincre votre l'administrateur de votre FAI de mettre ce CGI sur le serveur. Il est tout à fait possible qu'ils vous demandent de l'argent pour vérifier la sécurité de ce script, puisque cela va leur demander du temps, et c'est pour eux l'assurance que le script ne présentera pas de risque une fois mis en place (je vais faire de mon mieux pour qu'il soit le plus "sûr" possible). Par exemple, mon FAI (lightspeed.net) me demande $50 par script pour le vérifier.

Attention : Non seulement ce script est totalement nouveau et (largement) non testé, mais en plus, je l'écris à 3 heures du matin car je n'ai pas envie de faire ma philosophie. Si vous ne connaissez rien aux CGI ni comment les rendre sûrs, alors, je vous suggère d'attendre que les quelques bugs soient retirés avant de l'envoyer à votre pauvre administrateur système.

Note : Bon, cela fait maintenant deux mois que j'ai écrit ce message, et je n'ai rien entendu à propos de la sécurité de ce CGI, ni pour, ni contre. Alors, soit il est sûr et personne ne me l'a fait savoir, soit personne ne l'utilise :-) Par conséquent, je vous conseille de faire attention.

15.1 Voilà ce que l'on va faire.

A la base, tout ce que vous avez à faire, c'est de prendre le script et de remplir quelques endroits.

Dans le script, on va essayer de :

15.2 Le script (dynip.pl)


#!/usr/bin/perl
# Ecrit par Michael Driscoll <fenris@lightspeed.net>
# Les suggestions sont les bienvenues

require 5; # Requiert perl5
use CGI; # Ceci est le module CGI.pm, disponible sur tous les sites CPAN tels
         # ftp://ftp.cdrom.com/pub/perl/CPAN/modules/by-module/CGI

# Remplir les trucs qui suivent
$givendomain = "domain.net";               # Mettez le domaine de votre FAI
                                           # (Pour l'instant, ce sont les deux
                                           # premières parties, mais cela peut
                                           # être change en dessous avec le
                                           # split())
$givenpassword = "potrzebie";              # Mettez le mot de passe à utiliser
$filename = "/some/path/to/my/index.html"; # Demandez à votre admin de mettre
                                           # ici la page à mettre à jour
                                           # Note à l'administrateur :
                                           # le fichier devra avoir les
                                           # droits en écriture pour l'uid
                                           # de httpd, à moins que vous
                                           # utilisiez la méthode suid
                                           # d'Apache ou un autre truc
                                           # (mais c'est pas recommandé)

# Ce qui suit joue avec les IP en utilisant la forme aaa.bbb.ccc.ddd
$higha = "255"; # Mettez ici le plus grand numéro de la partie aaa
                # de votre FAI.
$lowa = "0";    # De même pour le plus petit numéro de la partie aaa.
                # probablement la même que $higha vu que la majorité des
                # FAI ne prennent pas plus qu'un domaine de classe A :-)
$highb = "255"; # Mettez la borne supérieure pour bbb.
$lowb = "0";    # La borne inférieure de bbb.
$highc = "255"; # Vous avez compris.
$lowc = "0";    #
$highd = "255"; #
$lowd = "0";    #

# on fait un lien entre $query et le module cgi.pm
$query = new CGI;

# $newip est la nouvelle IP du paramètre newip
$newip = $query->param("newip");

# $trypassword est la tentative de mot de passe à confronter avec $givenpassword
$trypassword = $query->param("password");

# $hostname est le nom d'hote à confronter avec $givendomain
$hostname = $query->remote_host;

# Verifier le mot de passe avant tout
unless ("$trypassword" eq "$givenpassword") {
        print "Content-type: text/plain\n\n";
        print "Sorry, wrong password\n";
        exit;
}

# On découpe l'IP dans @IP
# On vire d'abord les caractères non numériques sauf le '.'
# on le splice() pour supprimer les trucs après les quatre premier points
# (Comment c'est arrivé là ??  De toute façon, j'essaye de le rendre aussi
# peu craquable que possible).
$newip =~ s/[^\d\.]//g;
@IP = split /\./, $newip;
splice(@IP, 4);

# On vérifie que l'IP est dans les bornes
unless (($lowa <= $IP[0]) &&
        ($lowb <= $IP[1]) &&
        ($lowc <= $IP[2]) &&
        ($lowd <= $IP[3]) &&
        ($higha >= $IP[0]) &&
        ($highb >= $IP[1]) &&
        ($highc >= $IP[2]) &&
        ($highd >= $IP[3])) {
        print "Content-type: text/plain\n\n";
        print "Désolé, cette adresse IP ne fait pas partie des adresses admises\n";
        exit;
}

# Maintenant, on vérifie le nom de l'hôte
# On le découpe dans @hostnamearray
@hostnamearray = split /\./, $hostname;
$dompart2 = pop @hostnamearray;
$dompart1 = pop @hostnamearray;

# On le vérifie
unless (("$dompart1"."\.$dompart2" eq "$givendomain") ||
        ("$hostname" eq "localhost")) {
# On affiche une erreur
        print "Content-type: text/plain\n\n";
        print "Désolé, vous n'avez pas le bon nom de domaine\n";
        exit;
}

# Tout à l'air d'être OK, on va donc mettre en place la page
# Prenez garde aux trucs dans le style de #, \, $, @, %, et '

open(FILE, ">$filename") ||
        die "dynip.pl cannot open $filename to write: $!";
flock(FILE, 2);

# Ici commence le HTML. $newip est notre nouvelle adresse IP.
print FILE "<html><head><title>Title etc.</title></head>\n\n";

print FILE "<body><h1>body here</h1><hr>\n";
print FILE "<p>blah blah blah\n";

print FILE "<p>And <a href=telnet://$newip>here</a> est un lien vers mon ";
print FILE "addresse IP actuelle.\n";

print FILE "</body></html>\n";
flock(FILE, 8);
close(FILE);

# On dit que tout s'est bien passé
print "Content-type: text/plain\n\n";

print "Installation réussie\n";

# Fin

Accéder au CGI quand la connection s'établie

Maintenant, tout ce que nous avons à faire est d'y accéder avec lynx dans notre /etc/ppp/ip-up. La ligne suivante devrait le faire, utilisant le $4 de /etc/ppp/ip-up comme nouvelle IP :


lynx -dump \
"http://www.votre-FAI.net/cgi-bin/dynip.pl?newip=$4&password=potrzebie" \
>> /etc/ppp/lynxlog

Mettez le mot de passe que vous avez choisis à la place de "potrzebie", bien sur. Et assurez-vous de bien faire chmod 700 /etc/ppp/ip-up quand c'est Ok, car il y a des informations sensibles dedans.

(Au fait, les \ sont juste utilisés pour que la commande tienne en 80 colonnes. Ils ne font qu'escaper les retours à la ligne pour que ce soit considéré comme une seule commande)

De plus, videz périodiquement le /etc/ppp/lynxlog sinon, il va être très gros après quelque temps :-)

Voilà... C'est fait !


Page suivante Page précédente Table des matières