استعلام whois در کانستراکت به کمک PHP
#1
Lightbulb 
به نام خدا؛
سلام دوستان امیدوارم حالتون خوب باشه...
حتماً تا حالا نام whois به گوشتون خورده. در واقع whois یک سامانه جهانی برای استعلام مشخصات ثبت کننده یک دامنه اینترنتی هست. این مشخصات میتونه شامل  نام، شماره همراه، شماره ثابت، آدرس ایمیل، آدرس پستی، کدپستی و بسیاری از اطلاعات مربوط به صاحب دامنه باشه. البته صاحب دامنه میتونه اطلاعات رو مخفی کنه و یا اطلاعات غلط به ثبت برسونه. امروز با یک کد PHP ساده که یک فانکشن کاربردی توش تعریف کردیم به راحتی این استعلام رو انجام میدیم.
اما کد PHP به این شرحه:
کد php:
<?php
/**
 * @author Master Badfar
 * @copyright 2020
 */
 // صدور مجوز ajax برای مرورگر
 
header('Access-Control-Allow-Origin: *'); 
   
// قطع نمایش خطاهای مفسر PHP
ini_set('display_errors'0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
// ایجاد فانکشن استعلام دامنه

function whois_query($domain) {
 
    
// تنظیم نام دامنه
    
$domain strtolower(trim($domain));
    
$domain preg_replace('/^http:\/\//i'''$domain);
    
$domain preg_replace('/^www\./i'''$domain);
    
$domain explode('/'$domain);
    
$domain trim($domain[0]);
 
    
// جدا کردن دامنه سطح بالا
    
$_domain explode('.'$domain);
    
$lst count($_domain)-1;
    
$ext $_domain[$lst];
 
// منبع whois برای استعلام دامنه های مختلف
    
$servers = array(
        
"biz" => "whois.neulevel.biz",
        
"com" => "whois.internic.net",
        
"us" => "whois.nic.us",
        
"coop" => "whois.nic.coop",
        
"info" => "whois.nic.info",
        
"name" => "whois.nic.name",
        
"net" => "whois.internic.net",
        
"gov" => "whois.nic.gov",
        
"edu" => "whois.internic.net",
        
"mil" => "rs.internic.net",
        
"int" => "whois.iana.org",
        
"ac" => "whois.nic.ac",
        
"ae" => "whois.uaenic.ae",
        
"at" => "whois.ripe.net",
        
"au" => "whois.aunic.net",
        
"be" => "whois.dns.be",
        
"bg" => "whois.ripe.net",
        
"br" => "whois.registro.br",
        
"bz" => "whois.belizenic.bz",
        
"ca" => "whois.cira.ca",
        
"cc" => "whois.nic.cc",
        
"ch" => "whois.nic.ch",
        
"cl" => "whois.nic.cl",
        
"cn" => "whois.cnnic.net.cn",
        
"cz" => "whois.nic.cz",
        
"de" => "whois.nic.de",
        
"fr" => "whois.nic.fr",
        
"hu" => "whois.nic.hu",
        
"ie" => "whois.domainregistry.ie",
        
"il" => "whois.isoc.org.il",
        
"in" => "whois.ncst.ernet.in",
        
"ir" => "whois.nic.ir",
        
"mc" => "whois.ripe.net",
        
"to" => "whois.tonic.to",
        
"tv" => "whois.tv",
        
"ru" => "whois.ripn.net",
        
"org" => "whois.pir.org",
        
"aero" => "whois.information.aero",
        
"nl" => "whois.domain-registry.nl"
    
);
 
// اگر اطلاعاتی موجود نبود پیغام زیر را نمایش بده
    
if (!isset($servers[$ext])){
        die(
'Error: No matching nic server found!');
    }
 
    
$nic_server $servers[$ext];
 
    
$output '';
 
    
// اتصال به سرور whois و دریافت اطلاعات
    
if ($conn fsockopen ($nic_server43)) {
        
fputs($conn$domain."\r\n");
        while(!
feof($conn)) {
            
$output .= fgets($conn,128);
        }
        
fclose($conn);
    }
    else { die(
'Error: Could not connect to ' $nic_server '!'); }
    
// چاپ خروجی
 
return $output;
}
// متغیر میزان ارور
$error 0;
// ذخیره مقدار پارامتر domain در متغیر وبسایت
$website $_GET['domain'];
// بررسی خالی نبودن پارامتر domain
if (empty($website)){
    echo 
"You should enter a domain!" '</br>';
    
$error++;
    
// بررسی صحت ساختاری آدرس وارد شده در پارامتر domain
    
}elseif(!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)){
        echo 
"The entered URL is invalid!" '</br>';
        
$error++;
}
// نمایش کل ارورهای یافت شده
if ($error 0){
    echo 
"The number of total errors that were found is : " $error;
}
// استفاده از فانکشن استعلام دامنه
if ($error == 0){
echo 
whois_query($website);
}
?>
برای استفاده از این کد باید ریکوئستی مشابه نمونه زیر ارسال کنین:
کد:
http://yourhost.com/file.php?domain=http://youraddress.com
در واقع برای پارامتر domain باید یک دامنه اینترنتی ریجیستر شده رو به همراه پروتکلش (http یا https) قرار بدین. دقت کنین که این کد با وارد کردن زیردامنه (Subdomain) هیچ اطلاعاتی رو مربوط به دامنه نمایش نمیده و شما باید دامنه اصلی رو وارد کنین.
چنانچه به کد دقت کرده باشین با دو خط دستور ارورهایی که مفسر PHP نمایش میده رو قطع کردیم. این مسئله میتونه خیلی کاربردی باشه و توصیه میکنم حتماً این مورد رو توی کدهای PHP خودتون اعمال کنین. درسته نمایش ارورها توسط مفسر PHP میتونه به توسعه دهنده در حین ساخت و تکامل پروژه کمک شایانی بکنه ولی اگر توی پروژه نهایی آپلود شده همچنان فعال باشه میتونه سرنخ های خوبی به دست هکرها بده. پس با این رویکرد باید حساب تک تک اتفاقاتی که ممکنه کاربر رقم بزنه رو بکنین!
توضیحات پیغام های خطای کد:
اگر کاربر هیچ مقداری برای پارامتر domain وارد نکرده باشد پیغام زیر نمایش داده می شود:
کد:
You should enter a domain!
اگر آدرس دامنه وارد شده توسط کاربر از نظر ساختاری صحیح نباشد (یعنی به شکل http://yoursite.(com/net/org/...) نباشد) پیغام زیر چاپ می شود:
کد:
The entered URL is invalid!
اگر تعداد ارورهای یافت شده بزرگ تر مساوی یک شود پیغام زیر در انتها و پس از نمایش تمامی ارورها به کاربر نمایش داده می شود:
کد:
The number of total errors that were found is : (x)
(عبارت x در واقع تعداد ارورهای یافت شده است.)
تست کد:
من کد خودم رو با دامنه (انجمن تخصّصی کانستراکت) تست کردم و نتایج زیر رو که مربوط به مشخصات ثبت کننده دامنه (آقا مجتبی) هست رو دریافت کردم. با این فرض ریکوئست من به این شکل هست:
کد:
http://yourhost.com/file.php?domain=http://construct2.ir/
نتیجه اجرای کد به این شکل خواهد بود:
کد:
% This is the IRNIC Whois server v1.6.2. % Available on web at [url=http://whois.nic.ir/]Query Whois Server - IRNIC[/url] % Find the terms and conditions of use on [url=http://www.nic.ir/]ایرنیک (IRNIC) – ایرنیک[/url] % % This server uses UTF-8 as the encoding for requests and responses. % NOTE: This output has been filtered. % Information related to 'construct2.ir' domain: construct2.ir ascii: construct2.ir remarks: (Domain Holder) Mojtaba Qasemzade Tehrany remarks: (Domain Holder Address) Floor 2, No 21, Chaman Afrooz 1 Alley, Hosein Bashi 13 Alley, Hosein Bashi Quarter, Khaje Rabi Cross, Mashhad, Khorasan Razavi, IR holder-c: mq173-irnic admin-c: mq173-irnic tech-c: mj1889-irnic nserver: adrian.ns.cloudflare.com nserver: yichun.ns.cloudflare.com last-updated: 2019-09-01 expire-date: 2020-04-23 source: IRNIC # Filtered nic-hdl: mq173-irnic person: Mojtaba Qasemzade Tehrany e-mail: [email protected] address: Floor 2, No 21, Chaman Afrooz 1 Alley, Hosein Bashi 13 Alley, Hosein Bashi Quarter, Khaje Rabi Cross, Mashhad, Khorasan Razavi, IR phone: +989150472758 source: IRNIC # Filtered nic-hdl: mj1889-irnic person: Majid Jafari org: Damaneh.Net e-mail: [email protected] source: IRNIC # Filtered

نکته مهم جهت کوتاه سازی کد:
کدی که بنده قرار دادم تقریباً طولانی هست و 110 خط کد رو شامل میشه. برای اینکه کد رو کوتاه تر کنیم میتونیم از تکنیک include یا require در زبان PHP استفاده کنیم. 
در واقع به نوعی ما فانکشن رو به تنهایی در یک فایل مجزا مثلاً با نام function.php قرار میدیم و بعد اون رو توی یک فایل دیگه فراخوانی میکنیم. 
دقت کنین که برای فراخوانی یک فایل PHP دیگه در فایل PHP دیگه راه های زیادی هست که بسته به شرایط به کار میاد. ولی به طورکلی همونطور که گفتم دو تابع require و include باید استفاده بشن. البته بماند که require_once و include_once رو هم داریم که یعنی یک بار فایل به روش require یا include فقط در همون قسمتی از برنامه که تعیین کردیم و نه کل برنامه مون فراخوانی بشه. اما تفاوت include با require در چی هست؟
وقتی ما از include استفاده میکنیم اگر اون فایل PHP که مشخص می کنیم که فراخوانی بشه مشکلی داشته باشه ادامه برنامه ما اجرا میشه ولی اگر از require استفاده کنیم و مشکلی در فایل PHP فراخوانی شده باشه ادامه برنامه اجرا نمیشه و برنامه از قسمت فراخوانی فایل متوقف میشه و به پایان میرسه.
با این توضیحات میفهمیم که در حالتی که الان باهاش مواجه هستیم باید فایل function.php رو از طریق تابع require فراخوانی کنیم. 
دستور فراخوانی با تابع require یا include در کد PHP ما به این شکل میشه:
کد php:
include/require ('file.php'); 
اسم دیگه این تکنیک اصطلاحاً ساختن مستر پیج و صفحات فرعی هست. همونطور که گفته شد استفاده از این تکنیک میتونه کدهای شما رو کوتاه تر بکنه و البته اگر مشکلی هم پیش بیاد پیدا کردن مشکل خیلی ساده تر خواهد بود.
من با استفاده از این تکنیک 110 خط کد رو به 33 خط کد (با احتساب 12 خط کامنت لا به لای کدها) کاهش دادم. 
امیدوارم این مطلب براتون مفید واقع شده باشه.
خوشحال میشم نظراتتون رو بیان کنین.
با آرزوی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: shazde ، M.gh ، [email protected] ، oak ، amin hosseini
#2
خیلی خوب بود
راستی آقای master badfar خواهشا صندوق پیام خصوصی ات رو خالی کن!
  پاسخ


 سپاس شده توسط: Master Badfar


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 127 76,093 1402/8/24، 09:00 عصر
آخرین ارسال: mehdiosw
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 17,645 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,141 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 6,991 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100
  رفع مشکل خروجی فونگپ (: M.gh 11 7,298 1400/4/10، 02:17 صبح
آخرین ارسال: oak

پرش به انجمن: