آموزش سوکت نویسی در PHP

درود به دوستان عزیز امیدوارم حالتون خوب باشه .

در این جا قصد دارم که آموزش برنامه نویسی شبکه در php رو بهتون یاد بدم و در آخر هم چند برنامه(پیشمایش پورت, پیدا کردن صفحه ادمین,پیدا کردن سایت های روی یک سرور) رو آموزش می دم.

در اینجا آموزش کار با توابع سوکت در php و ارسال و دریافت اطلاعات و …. رو یاد میگیرید .

سوکت هم مانند cURL میتونید در فایل php.ini فعال کنید که بتونید ازش استفادع کنید .

این اکستنشن هم باز در ویندوز با نام php_sockets.dll و در لینوکس با نام sockets.so قابل مشاهده هست .

برای فعال کردن کافیه به php.ini رفته و extension=php_sockets.dll رو پیدا کرده و ; قبل از اونو بردارید سپس وب سرور خود رو ری استارت کنید . حالا میتونید ازش استفاده کنید .

با سپاس

خب دوستان عزیز بریم سراغ آموزش

برای برنامه نویسی شبکه یا سوکت php توابعی متخلف و زیادی رو داره که در اینجا به آموزش و بررسی اونا می پردازیم.

برای ارتباط با یک سرویس دهنده باید یک سوکتی ایجاد بشه که php توابع مختلفی رو روی ورژن های مختلف ارایه میده

تابع

1 fsockopen(target,port,error,errstr,timeout)

برای ایجاد سوکت به یک مقصد خاص استفاده میشود.

این تابع 2 آرگومان ضروری و 3 تا غیر ضروری میگیره

آرگومان اول مقصد مورد نظر هست برای مثال

1 www.google.com
1OR
1192.168.1.1

اگر php شما opnessl رو هم ساپورت کنه میتونید به ssl هم وصل بشید .

آرگومان دوم شماره پورت هست برای مثال 80 25 و …

آرگومان سوم و چهارم به روش ارجاعی به تابع وصل میشن.

آرگومان آخر هم زمانی هست که میخوای روی سوکت کار بشه.

تابع

1 fscokopen() 

یک اشاره گر فایل بر میگردونه که میشه با توابع فایل ها مثل fputs , fgets و … باهاش کار کرد.

برای شما

اگر تابع نتونه اتصالی بگیره false رو بر میگردونه که اگر هم آرگومان سوم و چهارم پر شده باشد میتونید اررور هارو بگیرید .

خب بریم سراغ مثال . به کد زیر توجه کنید :

1$socket = fsockopen("www.bing.com",80,$errno,$errstr);
1if(!$socket)
1{
1    echo $errstr;
1    exit;
1}
1$header  = "GET / HTTP/1.1\r\n";
1$header .= "Host: www.bing.com\r\n";
1$header .= "User-Agent: ".$_SERVER["HTTP_USER_AGENT"]."\r\n";
1$header .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
1$header .= "Connection: keep-alive\r\n\r\n";
1fwrite($socket,$header);
1while(!feof($socket))
1    echo fgets($socket);

خب اگر کد بالارو اجرا کنید خروجی شما صفحه اول سایت bing.com خواهد بود.

حالا اگر دقت کرده باشید با توجه به هدری که نوشتیم ما درخواست نمایش صفحه اول رو کرده بودیم که جواب هم مطابق میلمان بود.

حال اگر صفحه خاصی رو میخواستیم ببینیم چطور ؟ برای مثال میخوایم صفحه

1 http://www.bing.com/profile/history?FORM=Z9LH5

رو ببنیم خب کافیه این درخواستمون رو توی هدر به سوکت php بگیم.

به قطعه کد زیر توجه کنید :

1$socket = fsockopen("www.bing.com",80,$errno,$errstr);
1if(!$socket)
1{
1    echo $errstr;
1    exit;
1}
1$header  = "GET /profile/history?FORM=Z9LH5 HTTP/1.1\r\n";
1$header .= "Host: www.bing.com\r\n";
1$header .= "User-Agent: ".$_SERVER["HTTP_USER_AGENT"]."\r\n";
1$header .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
1$header .= "Connection: keep-alive\r\n\r\n";
1fwrite($socket,$header);
1while(!feof($socket))
1    echo fgets($socket);

این خط

1 $header  = "GET /profile/history?FORM=Z9LH5 HTTP/1.1\r\n";

رو تغییر دادیم.

حالا فرض کنید ما فقط می خواستیم ببینیم اون صفحه وجود داره یا نه (کاری که اکثر ادیمن فایندر ها انجام می دهند)

خب جواب از وب سرور توی خط اول مشخص میشه و تابع fgets هم که یک خط رو میخونه پس

1while(!feof($socket))
1    echo fgets($socket);

رو به

1  $result = fgets($socket);

تغییر میدیم . حالا مقدار بازگشتی توی $result هست حالا باید مقدار رو چک کنیم. از

1 preg_match()

کمک می گیریم (آموزشش رو گذاشتم پیدا کنید) پس کد بالا رو به کد زیر تغییر میدیم

1$socket = fsockopen("www.bing.com",80,$errno,$errstr);
1if(!$socket)
1{
1    echo $errstr;
1    exit;
1}
1$header  = "GET /profile/history?FORM=Z9LH5 HTTP/1.1\r\n";
1$header .= "Host: www.bing.com\r\n";
1$header .= "User-Agent: ".$_SERVER["HTTP_USER_AGENT"]."\r\n";
1$header .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
1$header .= "Connection: keep-alive\r\n\r\n";
1fwrite($socket,$header);
1$result = fgets($socket);
1if(preg_match("/200 OK /",$result))
1echo "found";
1else
1echo "not found";

اگر کد بالارو اجرا کنید خروجی شما found خواهد بود. (حالا برای خودتون با یک صفحه نامعتبر امتحان کنید)

خب نظرتون چیه یکم کد رو پیشرفته ترش کنیم ؟ اگر وضعیت 302 بود چی ؟ ممکن هست بخوایم با توجه به مقادیر بازگشتی خاص عمل خاصی رو انجام بدیم مثلا می خوایم اگر 302 مقدار بازگشتی بود صفحه رو دنبال کنیم . خب اول بیایم کد رو بهتر کنیم برای این کار یک تابع تعریف می کنم که این کارو انجام بده .

به قطعه کد زیر توجه کنید :

1echo load_url("www.bing.com","/profile/history?FORM=Z9LH5");
1function load_url($url,$page)
1{
1    $socket = fsockopen($url,80,$errno,$errstr);
1    if(!$socket)
1    {
1        echo $errstr;
1        exit;
1    }
1    $header  = "GET $page HTTP/1.1\r\n";
1    $header .= "Host: $url\r\n";
1    $header .= "User-Agent: ".$_SERVER["HTTP_USER_AGENT"]."\r\n";
1    $header .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
1    $header .= "Connection: keep-alive\r\n\r\n";
1    fwrite($socket,$header);
1    $result = fgets($socket);
1    if(preg_match("/\s(\d+)\s/",$result,$number))
1        return $number[0];
1    else
1        return null;
1 }

کد قبل رو به کد بالا تبدیل کردم حالا یک تابع دارم یک سایت و صفحه رو میگیره و عدد بازگشتی هدر رو برام برمیگردونه.

حالا می تونیم یک ادمین فایندر بنویسم.کافیه لیست سایت هارو بگیریم و صفحه هایی که قرار چک بشه و بدیم به تایع و مقدار بازگشتی رو چک کنیم.(دقت کنید اگر توی آدرس سایت http:// بود باید حذفش کنید)

البته کد بالا خیلی مشکلات داره که با خلاقیت خودتون می تونید بهترش کنید و توسعه بدید. برای مثال یکی از مشکلات پیغام 302 هست که یعنی به یک صفحه دیگه ریدایرکت میشه نظرتون چیه این 302 هارو دنبال کنیم ؟

به کد زیر توجه کنید:

1$body = load_url("google.com","/");
1if($body)
1{
1    echo $body;
1}else
1{
1    echo "null";
1}
1
1function load_url($url,$page)
1{
1    $socket = fsockopen($url,80,$errno,$errstr);
1    if(!$socket)
1    {
1        echo $errstr;
1        exit;
1    }
1    $header  = "GET $page HTTP/1.1\r\n";
1    $header .= "Host: $url\r\n";
1    $header .= "User-Agent: ".$_SERVER["HTTP_USER_AGENT"]."\r\n";
1    $header .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
1    $header .= "Connection: keep-alive\r\n\r\n";
1    fwrite($socket,$header);
1    $result = fgets($socket);
1    $returnBody = "";
1    if(preg_match("/\s(\d+)\s/",$result,$status))
1      {
1        switch($status[1])
1        {
1            case "200":
1                while(!feof($socket))
1                {
1                    $returnBody .= fgets($socket);
1                }
1                return $returnBody;
1            case "301":
1            case "302":    
1                do
1                {
1                     $url = fgets($socket);
1                }while(!preg_match("/Location: (http:\/\/)?(.*)/",$url,$redirect));
1                 $splitUrl = explode("/",$redirect[2]);
1                 $url = $splitUrl[0];
1                 $page = "/".$splitUrl[1];
1                 return load_url($url,$page);
1            default:
1                return $status[1];
1        }
1      }

من اینو بازگشتی و به این ترتیب نوشتم شما می تونید به طریقه دیگه ای بنویسید.(توی این روش که من نوشتم کد راحت شد ولی چون بازگشتی هست خودتون بهتر می دونید اگر تعداد ریدایرکت ها زیاد بشن برنامه چطور میشه 😉 )

اگر دقت کرده باشید می تونید با fsockopen() برای خودتون پورت اسکنرطراحی کنید.

به قطعه کد زیر توجه کنید :

1    $openPorts = array();
1    $closePorts = array();
1    $ip = "192.168.1.1";
1    for($i = 20 ; $i < 100 ; $i++)
1    {
1        $socket = @fsockopen($ip,$i);
1	if($socket)
1        {
1            $openPorts[] = $i;
1            
1        }else
1نویسنده مطلب: علیرضا

منبع مطلب

به فکر سرمایه‌گذاری هستی؟

با هر سطحی از دانش در سریع‌ترین زمان با آموزش گام به گام، سرمایه گذاری را تجربه کن. همین الان میتونی با لینک زیر ثبت نام کنی و ۱۰ درصد تخفیف در کارمزد معاملاتی داشته باشی

ثبت نام و دریافت جایزه
ممکن است شما بپسندید
نظر شما درباره این مطلب

آدرس ایمیل شما منتشر نخواهد شد.