Domain Availability Whois-Server mit DNS-Abfrage

d4f

Kaffee? Wo?
Was?
Die Kombination aus dnscheck-Klasse und pseudo Whois-Server erlaubt es ohne Zugriffe auf das echte Whois und damit einhergehende Probleme (Rate-Limiting, Bandbreiten-Verbrauch, uneinheitliche Antworten der verschiedenen Registries) einfach und unkompliziert die Verfuegbarkeit von Domains unter allen existierenden TLD's zu ueberpruefen.

Wie?
In 2 DNS-Anrufen wird zuerst ein Nameserver der zustaendigen Registry ausfindig und danach mittels dem Kommandozeilen-Programm 'dig' eine detaillierte DNS-Antwort auf die spezifische Domain abgefragt. Durch die in der DNS-Antwort enthaltenen Statusinformationen (NOERROR, NXDOMAIN) kann somit die Verfuegbarkeit der Domain festgestellt werden.

Einschraenkung
Alle Registries pflegen eine Liste an nicht-registrierbaren Domains (blacklist) welche sich idR weder ueber Whois noch ueber DNS-Abfragen bestimmen lassen sondern manuell in die Datei 'blacklist.ini' eingepflegt werden muessen.

Sicherheitsprobleme
Ich empfehle den whoisserver nur auf 127.0.0.1 horchen zu lassen, da ihm jedgliche Angriffserkennung sowie Verbindungsbegrenzung fehlt. Da fuer jede einkomme Verbindung ein neuer Fork erstellt wird liesse sich der Server durch viele gleichzeitige Verbindungen in die Knie zwingen.
Die Benutzung der WHOISSERVER_NONPRIVILEGED Funktion ist empfohlen!

Hinweis
Das Programm wurde als proof-of-concept entwickelt und ist somit eventuell zum Produktiveinsatz nicht ohne Abaenderungen (zumals bez. Whoisserver) geeignet.

Einsatz
Falls nur die domaincheck.class benutzt werden will, ein entsprechender Test-Code mit kurzem Exception-Handler ist auskommentiert unten enthalten.
Ansonsten die blacklist.ini ergaenzen und in der whoisserver.php die Konfiguration den eigenen Wuenschen anpassen.
Danach mit "php5 -q whoisserver.php" den Server starten. (nohup oder screen empfohlen ;) )

Whois-Antworten
domainname.tld AVAILABLE|ERROR|BLACKLISTED|TAKEN

Wo?
GitHUB: https://github.com/d4fseeker/Misc-classes/tree/phpdns
 
Last edited by a moderator:
Dir ist aber schon klar, dass eine Domain keinesfalls "frei" ist, nur weil keine Zone dafür in den bei der Registry hinterlegten Nameservern existiert, oder?

DNS und WHOIS (bzw. Allgemein der Domainbestand einer Registry) haben erstmal nichts miteinander zu tun und von der Nichtexistenz eines Eintrags in einem von beiden lässt sich nicht viel über den Status in der anderen "Liste" aussagen.
 
Dir ist aber schon klar, dass eine Domain keinesfalls "frei" ist, nur weil keine Zone dafür in den bei der Registry hinterlegten Nameservern existiert, oder?
Deswegen rufe ich ja nicht die bei der Registry hinterlegten Nameserver, sondern die Nameserver der Registry auf, welche auf die gleiche Domaindatenbank wie der Whois-Server zugreifen. (*)

Allerdings ist mir nicht klar wie meine Klasse auf die 'RESERVED'-Domains einiger Registries (wie Restena.lu) reagiert respektiv wie die verschiedenen Registries diesen Status in den entsprechenden DNS-Antworten anzeigen
(Solange es kein NXDOMAIN ist sollte es funktionieren)


(*) Nicht ganz korrekt, ich weiss. Die Whois-Server werden meist in (Beinahe)-Echtzeit um neue und ablaufende Domains aktualisiert, waehrend die DNS-Server je nach Registry alle X Stunden periodisch aktualisiert werden.
 
Hier ein auf dem gleichen Grundprinzip basierende Domain-Scanner welcher alle Domains mit den gegebenen Zeichen und den gegebenen Laengen ausprobiert.

- PHP-native DNS-Abfrage bei der Registry fuer fehlerfreie schnelle Suche
- Mehrere Registry-Nameserver spezifierbar um die Last zu verteilen
- Funktioniert fuer jede gegebene TLD
- Testet NICHT ob die Domain den Vergabekriterien entspricht, nur ob sie existiert (NXDOMAIN)

Der Grund die Registry-eigenen Nameserver statt deren Whois-Server zu benutzen ist schlicht und einfach: schneller, weniger Ressourcenverbrauch und (WICHTIG) keine oder sehr hohe Grenzen auf der Anzahl an Abfragen.

Zum Betrieb ist die PEAR-Klasse Net_DNS notwendig.

PHP:
<?php
//Pear Net_DNS class
require_once 'Net/DNS.php';

class domainNames {
 var $Chars;
 var $LastChar;
 var $MinLength;
 var $MaxLength;
 var $CurrentPos = array();
 function __construct($Chars,$Minlength,$Maxlength) {
   $this->MinLength = $Minlength;
   $this->MaxLength = $Maxlength;
   $this->Chars = str_split(' '.$Chars);
   $this->LastChar = strlen($Chars);
   for($i=$this->MinLength+1;$i<=$this->MaxLength;$i++) {
    $this->CurrentPos[$i] = 0;
   }
   for($i=1;$i<=$this->MinLength;$i++) {
    $this->CurrentPos[$i] = 1;
   }
   $this->CurrentPos[$this->MaxLength] = 0;
 }

 function next() {
   $this->CurrentPos[$this->MaxLength]++;
   for($i=$this->MaxLength;$i>=1;$i--) {
     if($this->CurrentPos[$i] <= $this->LastChar) break; //we're done!
     elseif($i > 1) {
      $this->CurrentPos[$i] = 1;
      $this->CurrentPos[$i-1]++;
     }
     else return false;
   }
   $Domain = '';
   for($i=1;$i<=$this->MaxLength;$i++) {
     if($this->CurrentPos[$i] == 0) continue;
     $Domain .= $this->Chars[$this->CurrentPos[$i]];
   }
   return $Domain;
 }

}

//CONFIG START
$MinLength = 1;
$MaxLength = 4;
$Chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$Tld = 'de';
$Nameservers = array('77.67.63.105','195.243.137.26'); //l.de.net , s.de.net
//CONFIG END

$Domains = new domainNames($Chars,$MinLength,$MaxLength);

$resolver = new Net_DNS_Resolver();
$resolver->nameservers = $Nameservers;
$resolver->debug = 0;

$DomainList = 0;
$CharLength = strlen($Chars);
for($i=$MinLength;$i<=$MaxLength;$i++) {
 $DomainList += pow($i,$CharLength);

}
echo PHP_EOL."WARNING! This will send ".$DomainList." DNS requests! Starting in 1 second...".PHP_EOL.PHP_EOL;
sleep(1);

$Count = 1;
while($Domain = $Domains->next()) {
   $Count++;
   if($Count == 10) {
    $Count = 1;
    echo ".";
   }
   $response = $resolver->rawQuery($Domain.'.'.$Tld,'NS');
   if($response->header->rcode != 'NXDOMAIN') continue;
   else echo PHP_EOL."Available: ".$Domain.'.'.$Tld;
}
echo PHP_EOL."DONE".PHP_EOL;

Das ganze ist ein proof-of-concept und bedarf zum Produktiveinsatz oder sinnvollen Einsatz als Scanner ein paar Aenderungen (zB die gefundenen Domains in eine Datei schreiben)
Sonderzeichen sollten funktionieren ;)
 
Back
Top