Curl ، خواندن سایتهای دیگر از سایت خودتان و لوگین

saalek110

Well-Known Member

ثابت (Constant) های آپشن cURL​

  • CURLOPT_FILE – فایلی برای ذخیره نتیجه Curl
  • CURLOPT_URL – آدرس URLی که برای دریافت داده از آن ، نیاز داریم . اگر این url در curl_init() مشخص شده باشید ، نیازی به این آپشن ندارید
  • CURLOPT_RETURNTRANSFER – برگشت دادن نتیجه در قالب رشته برای ذخیره در متغییر بجای چاپ آن در مرورگر
  • CURLOTP_HTTPHEADER – ست کردن فیلد ها در قالب آرایه (مناسب برای ارسال فرم)
  • CURLOPT_POST – برای ارسال داده با متد پست باید مقدار TRUE را ست کنید
  • CURLOPT_USERPWD – ست کردن نام کاربری / رمزعبور اگر آدرس مورد نظر نیاز به احراز هویت داشت.
 

saalek110

Well-Known Member

saalek110

Well-Known Member
سالک: پس در پستهای بالا فهمیدید چطور بفهمید curl فعال است یا نه و طرز فعال کردنش را یا گرفتید.
باید این قسمت اول تاپیک بود که حالا اومده صفحه دوم. شاید بعدا پست ها را جابجا کردم. شاید هم همین طور خوب باشد.
 
آخرین ویرایش:

saalek110

Well-Known Member

در سایت انگلیسی بالا ، با تعداد دیگری از توابع curl می توانید آشنا شوید و چند برنامه نمونه هم دارد.
 

saalek110

Well-Known Member
سالک: حالا اگر شما به هر برنامه خاصی نیاز دارید ، فکر کنم باید موردی سرچ کنید.
می توانید نام توابع curl را در جستجو بیاورید تا دقیق تر باشه کار.

می توانید command را منها کنید در گوگل تا دستورات لینوکسی نیاید.
 

saalek110

Well-Known Member

دانلود یک عکس به کمک curl​


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

saalek110

Well-Known Member
ساختن یک فایل html از خواندن سایت:
PHP:
<?php

$url_name ="http://.............../form22.php";


$file = __DIR__ . DIRECTORY_SEPARATOR . "bb.html";

$handle_session = curl_init();

$fileHandle_name = fopen($file, "w");

curl_setopt_array($handle_session,

  array(

    CURLOPT_URL       => $url_name,

       CURLOPT_FILE => $fileHandle_name,

         )

         );

         $data_result = curl_exec($handle_session);

         curl_close($handle_session);

         fclose($fileHandle_name);

         ?>
در کد بالا ، url را من نقطه چین گذاشتم ، آدرس کامل فایل مقصد را درش بگذارید. شامل آدرس سایت و اسم پوشه.

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

سالک: من وقتی فایل bb.html را باز کردم ، دقیقا همون متن فایل فرم بود عین این:
HTML:
          <html>
          <body>
     
           <form method = "POST" action = "" >
             <input  name="firstName"  type="text">
               <input  name="lastName"  type="text">
                 <input  type="submit"  name="submit"  value="submit" >
                 </form>
                 </body>
                 </html>

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

البته محتوای فایل مقصد واقعا این بود:
PHP:
<?php
if(isset($_POST["submit"]))
{
  echo "Full name is " . $_POST["firstName"] .
       "  " . $_POST["lastName"];
         exit;
         }
         ?>
        
          <html>
          <body>
        
           <form method = "POST" action = "" >
             <input  name="firstName"  type="text">
               <input  name="lastName"  type="text">
                 <input  type="submit"  name="submit"  value="submit" >
                 </form>
                 </body>
                 </html>

ولی موقع خوندن ظاهر سایت خونده میشه نه کدهای اکشن که در صورت لوگین فرم عمل می کند.


در حقیقت این برنامه ، page source را از راه دور می دهد.
از راه نزدیک در ویندوز ، با کلیک راست بر صفحه و زدن سورس
و در اندروید نوشتن view-source جلوی اسم سایت بدست می آید.

پس چون
 
آخرین ویرایش:

saalek110

Well-Known Member



سالک : من فکر می کنم برای لوگین به یک سایت نیاز به
page source داریم ،
چون باید اسم فیلد ها را بدانیم. و برنامه پست قبل اسم فیلد ها را می دهد ، و برنامه لوگین را هم قبلا نوشتیم.
 

saalek110

Well-Known Member
استفاده از CURLOPT_FOLLOWLOCATION ممکن است باعث بروز مشکلاتی شود (این پارامتر PHP را مجبور می کند که تا هر تعداد ریدایرکت، منتظر پاسخ سرور میزبان باشد تا نهایتا کد 200 دریافت کند) بنابراین در حالت Safe Mode روشن، امکان استفاده از آن نیست، راه حل هایی در وب عنوان شده که استاندارد و کوتاه نیستند (اگر الزامی به استفاده از این پارامتر است، بهتر است Safe Mode خاموش شود).


منبع:
 

saalek110

Well-Known Member
اجازه دهید نگاهی دوباره به برنامه loginer بیاندازیم.

PHP:
<?php
if(isset($_POST["submit1111"]))
{
  echo "Full name is " . $_POST["firstName"] .
     "  " . $_POST["lastName"];
  exit;
}
?>


<html>
<body>


<form method = "POST" action = "" >
  <input  name="firstName"  type="text">
  <input  name="lastName"  type="text">
  <input  type="submit"  name="submit"  value="submit" >
</form>
</body>
</html>

سالک: در کد بالا ، submit1111 را بیابید.

البته در یک سایت درست ، name=submit در خط آخر فرم ، اسمش با ورودی بلوک که من اسم submit آن را submit1111 گذاشتم یکی است ، ولی من عمدا دو جور گذاشتم تا نشان دهم برنامه curl دنبال کدوم می رود.
 
آخرین ویرایش:

saalek110

Well-Known Member
حالا فایل لوگینر را ببینید:


PHP:
<?php
$handle = curl_init();
 
$url = "https://localhost/curl/theForm.php";
 

 
$postData = array(
  'firstName' => 'Amir',
  'lastName'  => 'ZM',
  'submit1111'    => 'ok'
);
 
curl_setopt_array($handle,
  array(
     CURLOPT_URL => $url,
     // POST جهت تنظیم درخواست روی حالت
    CURLOPT_POST       => true,
    // داده هایی که باید به همراه درخواست ارسال شود
    CURLOPT_POSTFIELDS => $postData,
    CURLOPT_RETURNTRANSFER     => true,
  )
);
 
$data = curl_exec($handle);
 
curl_close($handle);
 
echo $data;
؟>

باز در کد بالا ، submit1111 را بیابید.

نکته ای که از ایجاد این تغییر خواستم بفهمید اینه که کد لوگینر اصلا با فرم کار ندارد ، بلکه با خط کد


PHP:
'submit1111'    => 'ok'

حصار ورود به اون بلوک را می شکند تا $_POST["firstName"] و $_POST["lastName"] را مقدار دهی کند.
اون بلوک منظورم این قسمت از فایل فرم است:

PHP:
if(isset($_POST["submit1111"]))
{
echo "Full name is " . $_POST["firstName"] .
"  " . $_POST["lastName"];
exit;
}
بله ، برنامه دوم یعنی برنامه curl ما فقط با این قسمت کار دارد. و با شرح فرم کاری ندارد.
 
آخرین ویرایش:

saalek110

Well-Known Member
ادامه داستان:
حالا اگر فایل فرم پاس بدهد به یک فایل دیگر ، بلوک مورد نظر فایل curl اصلا در اون فایل نیست که بهش حمله کند.


پاس بدهد منطورم این فایل است:
HTML:
<form method = "POST" action = "second_file.php" >
  <input  name="firstName"  type="text">
  <input  name="lastName"  type="text">
  <input  type="submit"  name="submit"  value="submit" >
</form>
</body>
</html>

در فایل بالا ، به فایل second_file.php پاس داده.

و بلوک مورد نظر فایل curl ما کلا در فایل اول نیست و در فایل دوم است.
 
آخرین ویرایش:

saalek110

Well-Known Member
پس برای لوگین کردن باید ببینید بلوک اکشن در کدام فایل است.
چند پست قبل برنامه ای نوشتیم که سورس فایل را می داد. احتمالا با خواندن سورس می فهمیم باید به کجا حمله کنیم.

اسم فیلدها ، را باید بخوانیم ، و در فرم ببینیم اونجا که name سابمیت را نوشته
HTML:
 <input  type="submit"  name="submit2222"  value="submit" >


در کد بالا ، نام submit برابر با submit2222 است، اون بلوک هم با همین کلید باز می شود
ولی اگر پاس بدهد به یک فایل دیگر ، ممکن است اصلا بلوک وجود نداشته باشد یا اینکه وجود داشته باشد ، منطورم اینه:
PHP:
if(isset($_POST["submit2222"]))
{

}

ممکن است اصلا بلوک نداشته باشیم و
PHP:
$_POST["firstName"]
و
PHP:
$_POST["lastName"]

کف فایل باشد.

بهرحال چه بلوک داشته باشد و چه بلوک نداشته باشد ، کلید submit2222 را اگر ok اعلام کنیم احتمالا مشکلی پیش نمی آید.

ولی مهمه بدانیم اینها ایا در فایل اول است یا در فایل های دیگر.
اینها منطورم مقدار دهی به فرست نیم و لست نیم است. چون اگر در فایل دوم باشد ، ارسال به فایل اول بی فایده است ، چون فرم فقط برای نمایش است و دریافت کننده اطلاعات نیست. شما از نمایشش فقط اسم فیلد ها و اسم submit را باید پیدا کنی و بعد بفهمی بلوک مقدار دهی کجاست. خوب وقتی در فرم میگه مقصد second_file.php است، یعنی بلوک در فایل دوم است ولی اگر فرم به فایل فعلی پاس داد ، بلوک در همین فایل است.
احتمالا بلوک نامرئی است ، چون در سورس دیده نمی شود ، سورس فقط شامل عناصر html است نه عناصر php ، و چون نامرئی است از روی کلمات فرم جایش را حدس می زنیم.

پس با بررسی سورس سایت باید چند چیز را بفمید ، اول اینکه به فایل دوم پاس داده یا نه ، و دوم نام فیلدها و نام submit را یادداشت کنید.
 

saalek110

Well-Known Member
سالک: من الان ، به فایل دوم سایتی ، یوزرنیم و پسورد را ارسال کردم و لوگین شد. چون می دانستم به فایل دوم پاس داده.

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

saalek110

Well-Known Member
تمرین کنید برای لوگین تا حرفه ای شوید.
اول فرم های ساخته شده توسط خودتون را لوگین کنید.


بعد اینکه حرفه ای شدید ، این برنامه را ببینید:
PHP:
<?php
$username="user";
$password="passs";
$url="url";
$cookie="cookie.txt";
$postdata = "username=".$username."&userpass=".$password;
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_REFERER, $url);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);
echo $result; 
curl_close($ch);
?>

منبع:

همون برنامه لوگین ماست با کمی خرت و پرت اضافه.

یک فایل می سازه و چیزهایی درش موقع لوگین ذخیره می کنه.
 

جدیدترین ارسال ها

بالا