Проверка, ввел ли пользователь доменное имя или просто базу - PullRequest
0 голосов
/ 24 ноября 2011

Я хочу создать что-то, что делает запрос WHOIS, чтобы проверить, доступен ли домен.Теперь я нашел довольно много готовых сценариев для этого, но все они кажутся одинаковыми в том, что вам нужно указать базу, а затем выбрать, какие расширения вы хотите, и это будет сделано (например, так).введите «test», проверьте .com, и он проверит, доступен ли test.com)

Однако я пытаюсь сделать что-то еще.Я хочу, чтобы он проверял, ввел ли пользователь только базовый или полный URL-адрес, а затем выполняет один или несколько запросов соответственно.Пример:

Если пользователь вводит «test», я хочу, чтобы скрипт проверял наличие test.com, test.org, test.net и т. Д. Если пользователь вводит «test.com», я хочускрипт для проверки JUST на test.com.

Я действительно не знаю, на что опираться, но PHP Whois Script Майка Нотта выглядит хорошо.Конечно, предложения всегда приветствуются.

Теперь я предполагаю, что поток сценариев должен выглядеть примерно так:

  1. Пользователь вводит запрос
  2. Проверка сценариев на наличие пробелов
  3. Скрипт проверяет, ввел ли пользователь только базовое или полное доменное имя (я предполагаю, что для этого нужно проверить, есть ли там точка)
  4. Если пользователь ввелполное доменное имя, разделите базу и TLD и сохраните их обе в переменных и сохраните где-нибудь «статус» ($ full = true / false)
  5. if ($ full = true) {проверьте соответствующие серверы whoisдля $ base.com $ base.net и т. д.;
  6. if ($ full! = true) {посмотрите, какой сервер подходит для $ tld, и проверьте его для $ base. $ tld}
  7. Вывод результатов

Конечно, если есть скрипт, который уже делает это, дайте мне знать.

Редактировать: Просто чтобы вы знали,Я могу сделать простые операторы if и лайки, но шаги 3, 4, 5 и 6 в моем «рабочем процессе» - это те части, которые я не могу понять.

Редактировать 2: Спасибо за все ваши ответы, ребята!Теории Маркуса Адама действительно верны.Мой реселлер доменов (ребята, от которых я получаю свои домены) не предлагает TLD второго уровня, как .co.uk, так что это не проблема.Они также не поддерживают IDN.

Из ответов, ребята, я пришел к выводу, что функция разнесения используется для разделения доменного имени.Тем не менее, что будет взрываться, когда он сталкивается с несколькими точками?Я предполагаю, что это просто добавит еще одну запись в массив, но это вызовет проблемы.Потому что если пользователь затем введет (например) домен, оканчивающийся на .co.uk, сценарий примет в качестве TLD 'co'.

Проверка наличия более 2 строк в массиве также не возможна(Я думаю), потому что если пользователь затем введет «sub.domain.com», сценарий примет «sub» в качестве базы, а «domain.com» - в качестве TLD.

Кроме того, Маркус Адамс, выскажем, что если whois-сервер показывает «доступно», это не является гарантией его доступности, и я должен обратиться к регистратору.Но как мне поступить?Есть идеи?

Спасибо, ребята:)

Ответы [ 4 ]

1 голос
/ 23 декабря 2011

Не существует алгоритмического метода нахождения наивысшего уровня, на котором домен может быть зарегистрирован для определенного домена верхнего уровня (политики различаются для каждого реестра), единственный способ - создать список всех доменов верхнего уровняи уровень, на котором могут быть зарегистрированы домены.

Это основная причина, по которой Public Suffix List завершает работу.

Используя определения, собранные в этом списке, вы можете легкоразбить доменное имя на его части, извлекая TLD, домен и поддомен.

1 голос
/ 24 ноября 2011

Я реализовал такой код, но не в PHP.Вот что я узнал.

Алгоритм

Будьте осторожны, потому что некоторые домены могут иметь домены первого и второго уровня.Например, example.in и example.co.in.

Я рекомендую сначала обрезать домены начального и конечного пробелов и преобразовать их в строчные буквы.

Поскольку у многих доменов верхнего уровня есть свой собственный сервер Whois, выможет также создать таблицу или массив всех возможных ДВУ, в нижнем регистре, конечно.

Затем проверьте, есть ли точка.Если нет периода, то больше ничего не нужно делать.

Если есть период, вы должны извлечь TLD.Начните с левой стороны и найдите первый период.Разделите строку там.Если правая сторона соответствует одному из TLD в списке, то все слева было именем, а все справа - TLD.Если совпадения TLD отсутствуют, переходите к следующему периоду и повторяйте, пока не найдете совпадение или у вас не закончится период.

Если вы не можете найти совпадение, значит, они не ввели действительныйдомен.Вы можете попробовать разделить на последнем периоде справа, потому что, возможно, они вошли в www.wiki.example.

. Если вы найдете совпадение, вам все равно придется посмотреть, есть ли еще один период с левой стороны от разделения и обрезки.или считайте его недействительным.

Поиск сервера whois

IANA предоставляет базовую информацию о каждом TLD, включая сервер whois.

База данных корневой зоны

Обратите внимание, что вы, вероятно, будете создавать регулярные выражения для оценки результатов с каждого сервера whois, поскольку результаты не стандартизированы.

База данных Whoisне совпадает с базой данных регистратора

Вы не можете полагаться на доступность домена просто потому, что whois-сервер сообщает, что он "доступен".В большинстве случаев это будет точным, но не дайте пользователю никаких обещаний, что он может его зарегистрировать.Вы должны запросить регистратора, чтобы узнать, доступен ли домен.

Наиболее заметным исключением является случай, когда домен будет удален.Существует период до одного дня, когда у whois-сервера не будет записей об этом, но он еще не освобожден от регистратора.

Интернационализированные доменные имена

Планируете ли вы поддерживать ИДИ ?

0 голосов
/ 24 ноября 2011

Я не уверен, что сценарий для этого уже существует, но предложенное вами решение будет работать.

Если предположить, что вся логика поиска в whois находится в методе с именем check_whois($base, $tld), решение может выглядеть примерно так:

$pieces = explode(".", $user_input);
$base = $pieces[0];
$tld = $pieces[1];
if ($tld == null) {
  $default_tlds = array("com","net","org");
  foreach( $default_tlds as $tld ) {
    check_whois($base, $tld);
  }
} else {
  check_whois($base, $tld);
}
0 голосов
/ 24 ноября 2011

Лучший способ проверить это перебрать все возможные доменные расширения, разбить строку с помощью explode, а затем проверить все, что следует после точки.

Это для шагов 3 и 4:

function isFullDomain($domain){
    $domain=explode('.', $domain);
    foreach($possibleDomainExts as $ext){
        if($ext==$domain[count($domain)-1) return $ext;
    }
    return false;
}

Назовите это так:

if(!$ext=isFullDomain($domain)){
    //is only the base
}
else{
    //is the full domain and $ext will hold the value of the domain extension
}

У вас уже есть этот PHP-сценарий whois, поэтому разберите его, чтобы получить список возможных доменов, а также помощь по шагам 5 и 6

...