# [SRIPT-PHP] Dns dynamique

## 404_crazy

Bonjour je vous post un petit script sans pretention qui permet de faire un DNS Dynamique avec PHP

Dans cette exemple il est configuré pour un domain "test.net." avec un serveur nomé "www"

il faut aussi que votre dns soit configuré avec nsupdate

Ca fonctionne avec une authentification LDAP (Vous pouvez biensure changer ca)

le script crée un fichier par utilisateur (login_ldap) puis il excute nsupdate 

n'esiter pas a mettre vos commentaires, j'ai une version plus aboutie mais je ne l'ai pas sous la main je vous post ca dés que possible.

```

<html>

<br>

<?

//Detection IPv4 ou IPv6

class ipv6 

{ 

  function is_ipv6($ip = "") 

  { 

   if ($ip == "") 

    {  $ip = ipv6::get_ip();   } 

    if (substr_count($ip,":") > 0 && substr_count($ip,".") == 0)

    { return true;  } else {  return false; }  } 

                       

                       

  function is_ipv4($ip = "") 

   { return !ipv6::is_ipv6($ip);  } 

                         

  function get_ip() 

   { return  getenv ("REMOTE_ADDR");  } 

 

 }

                           

echo "<center>";

//Affiche @ IP et nom DNS (reverse) 

$ip_client = $_SERVER["REMOTE_ADDR"]; //Recuperation de l'ip de la station cliente

echo "<br><center><h1>Votre Adresse IP = ";

 echo (ipv6::is_ipv6())? "IPv6/":"IPv4/"; 

 echo ipv6::get_ip(); 

echo "</center></h1>";

$hostname = gethostbyaddr($ip_client);

echo "<center><h2>".$hostname."</center></h2>";

// A faire 

// => afficher FAI

// tester IPv4 / IPv6

// ------------- ANTI BOT ----------------------------------

$captcha="";//mise a zero de la variable

//caractères utilisés

$car="0123456789";

//compte le nombre de caracteres pour $car

$wlong=strlen($car);

// definition de wpas et wpas2

$wpas="";

$wpas2="";

// Taille des operandes

$taille=2;

//Initialisation de la fonction aleatoire

srand((double)microtime()*1000000);

// depart de la boucle for pour le nombre de caracteres voulut

for($i=0;$i<$taille;$i++){

      $wpos=rand(0,$wlong-1);

      $wpas=$wpas.substr($car,$wpos,1);}

// On continue avec le caractère suivant à générer      

srand((double)microtime()*100000);

for($i=0;$i<$taille;$i++){

      $wpos2=rand(0,$wlong-1);

      $wpas2=$wpas2.substr($car,$wpos2,1); 

}

?> 

<FORM METHOD=POST ACTION="index.php">

<table border=1>

  <tbody>

    <tr>

      <td>Login :</td>

      <td><INPUT type="text" value="" name="ldaplogin"></td>

    </tr>

    <tr>

      <td>Password : </td>

      <td><INPUT type="password" value="" name="ldappass"></td>

    </tr>

   <tr>

      <td><?echo $wpas."+".$wpas2?><INPUT type="hidden" name= "verif" value="<?echo $wpas+$wpas2?>"> </td>

      <td><INPUT type="text" value="" name="captcha"></td>

    </tr>

    <tr>

   <tr>

      <td>Groupe</td>

      <td>

     <SELECT name="ou">

      <OPTION VALUE="grp1">grp1</OPTION>

      <OPTION VALUE="grp2">grp2</OPTION>

      <OPTION VALUE="grp3">grp3</OPTION>

      <OPTION VALUE="grp4">grp4</OPTION>

      <OPTION VALUE="grp5">grp5</OPTION>

     </SELECT>

     </td>

    </tr>

  </tbody>

</table>

<br>

 <INPUT type="submit" value="Connexion">

</form>

</center>

<?php 

/*

Connection a la base ldap puis generation d'un fichier  portant le nom de l'utilisateur

version du 6/11/08 

*/

error_reporting(E_ERROR | E_PARSE ); // on affiche toutes les erreurs sauf les erreurs de type E_WARNING 

//(Pour evité les message d'erreurs si le login n'est pas bon ou la connexion n'est pas OK...)

$ldaplogin  = "cn=".$_POST['ldaplogin'].",ou=".$_POST['ou'].",dc=test,dc=net"; // Definition de l'enregistrement dn

$ldappass = $_POST['ldappass']; //Definition de la variable contenant le mot de passe

$ip_client = $_SERVER["REMOTE_ADDR"]; //Recuperation de l'@ ip de la station cliente

$captcha = $_POST['captcha'];

$fichier_nom =$_POST['ldaplogin'] ; //Definition de la variable contenant le nom du fichier créé

// definition du contenu du fichier créé

$fichier = 

"server 127.0.0.1

zone ".$_POST['ldaplogin'].".test.net

update delete ".$_POST['ldaplogin'].".test.net. A

update add ".$_POST['ldaplogin'].".test.net. 60 A  ".$ip_client."

send

"; 

$nomDNS = $_POST['ldaplogin'].".test.net";

// Connection sur le serveur LDAP

$connect = ldap_connect("www.test.net")

    or die("Impossible de se connecter au serveur LDAP.");

// Passage de ldap en version 3

   ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);

   ldap_set_option($connect, LDAP_OPT_REFERRALS, 0); 

   

//Connexion en anonymous si la captcha est valide.

if ($captcha==NULL){ echo "<center>Veuillez remplir tous les champs ci-dessus</center>";}

else 

  {

    if ($captcha==$_POST['verif']) 

    {

       $bind_test = ldap_bind($connect);

      if ($bind_test != TRUE) { echo "Connexion LDAP échouée..."; }

      else //serveur LDAP répond

        {

          $bind = ldap_bind($connect, $ldaplogin, $ldappass);

          if ($bind != FALSE) 

          { // Si LDAP accepte les login et mot de passe

            echo "Authentification LDAP réussie ...<p>";

            

      $inF = fopen("DDNS/".$fichier_nom,"w"); //Creation du fichier au nom de l'utilisateur

       fwrite($inF,$fichier); //ecriture de $fichier de le fichier login.txt

       fclose($inF); // fermeture du fichier

       

       exec("nsupdate DDNS/".$fichier_nom , $out, $err );     // MAJ DDNS 

                 if ($err !=0) { echo "code erreur = ".$err." " ;}

                 else { 

                       if ( gethostbyname($nomDNS) == $ip_client )

                        { echo $nomDNS." a pour adresse IP ".gethostbyname($nomDNS);

                          echo "<p><p>Services accessibles dans moins de 5 minutes";

                          echo "<p><p>Actualiser avant ce délai !";  

                          //fichier avec seulement l'adresse IP

                          //".IPv4"; 

                 $inF = fopen("IPv4/".$fichier_nom,"w"); //Creation

                fwrite($inF,$ip_client); //ecriture 

                fclose($inF); // fermeture

                        }// modif DDNS correspond à demande 

                        

                        else { echo "Echec mise à jour" ;} // @IP changée <> lue !!!

                      }// pas d'erreur DDNS                               

          } //authentifié

            else { echo "Mauvais mot de passe ou mauvais identifiant de login";    }

        ldap_close($connect);  // fermeture de la connexion LDAP

   }// connexion LDAP

    }//captcha

    else { // si le captcha est vide ou faux

       if ($captcha==NULL){ echo "<center>Veuillez remplir tous les champs ci-dessus</center>";}

       else {echo "Code de verification incorrect !"; }

          }//captcha vide

  }//captcha pas vide

// <Copyleft 404_crazy 2008>

?>

<html>

```

----------

