# Native Code > برنامه نویسی در Delphi > توسعه نرم افزارهای تحت شبکه >  نمونه : ارسال اطلاعات به یک سرور با استفاده از Http

## ghabil

این چند خط مقادیر دو تا فیلد مثلا UserName و Password رو به آدرسی که نوشته شده با متد Post میفرسته. 
این کار میتونه برای پر کردن فرمهای اینترنتی هم مفید باشه یعنی یک فرم Html در یک سایت رو مثلا از دلفی پر کنید ، برای این کار سورس صفحه رو ببینید مقادیر Input رو پیدا کنید ، که در واقع همون فیلدها هستند و اسمشون رو در بیارید بعد هم مقداری که میخواهید بهشون نسبت بدید رو مثل مثال تعیین کنید ، بعد آدرسی که بهش فرستاده میشند رو با پیدا کردن Action صفحه بدست بیارید و اطلاعات رو پست کنید :


procedure THttpTestForm.btSendClick(Sender: TObject);
var
  ARequestContent : TStringList;
  AResponse: String;
begin
  ARequestContent := TStringList.Create;
  try
    ARequestContent.Add('username=' + edName.Text);
    ARequestContent.Add('password=' + edPass.Text);
    AResponse := IdHTTPTest.Post('http://AWebSite.com/login.php', ARequestContent);
    ....
  finally
    ARequestContent.Free;
  end;
end;


کد برنامه رو هم میزارم. منتها این کد رو اجرا نکنید چون فایده ای نداره باید آدرس و اسم فیلدها رو برای جای خاصی در نظر بگیرید.

جواب برگشتی که توی AResponse هست اون متن Htmlی هست که سرور بر میگردونه که میتونید هرطوری دوست دارید پروسسش کنید.

این یک مثال خیلی ساده هست ، یکمی خودتون با Idhttp بازی کنید کلی اکانات دیگش رو هم میبینید.

*نکته مهم :*
برای ارسال پارامترها به سرورهای دات نتی لازم هست که حتما خط زیر رو در Header ریکوستتون بزارید و الا پارامترها رو سرور نمیخونه ، من زیاد دیدم اینجا میپرسند که چرا وب سرویسها نمیتونند با دلفی ارتباط برقرار کنند، یا چرا پارامترهاشون توی سرور خالی دریافت میشند، دلیلش نبودن این هدر هست ، و البته ربطی به دلفی هم نداره حتی توی C#‎ هم اگر از HttpWebReuest استفاده مکینید باید این رو به هدر اضافه کنید :

Content-Type: application/x-www-form-urlencoded.


کلمات کلیدی : TIdHTTP، دلفی ، Indy، Post، ایندی ، Client، Form, Html

----------


## dkhatibi

با تشکر 
این مثال را در مورد سایت یاهو (میل) می تونید تکمیل کنید؟

----------


## ghabil

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

----------


## dkhatibi

سلام
من از تو سورس فیلدهای UserName و Passwd را به عنوان Input یافتم. و جایگزینی کردم. و آدرس را هم به دو شکل 
http://www.Yahoomail.com/
و
https://login.yahoo.com/config/mail?.intl=us
وارد کردم. اولی ConnectionRefused میده دومی بلافاصله خطایی مبنی بر اشتباه بودن آدرس مسده.
شاید مشکل از اینه که پروتکل اون Https ه نه Http

----------


## Hamid_PaK

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

<form method="post" action="https://login.yahoo.com/config/login?" name="login_form">
<input name=".src" value="ym" type="hidden">
<input name=".tries" value="0" type="hidden">
<input name=".done" value="http://mail.yahoo.com" type="hidden">
<input name=".md5" value="" type="hidden">
<input name=".hash" value="" type="hidden">
<input name=".js" value="" type="hidden">
<input name=".partner" value="" type="hidden">
<input name=".slogin" value="praiser_man" type="hidden">
<input name=".intl" value="us" type="hidden">
<input name=".fUpdate" value="" type="hidden">
<input name=".prelog" value="" type="hidden">
<input name=".bid" value="" type="hidden">
<input name=".aucid" value="" type="hidden">
<input name=".yplus" value="" type="hidden">
<input name=".chldID" value="" type="hidden">
<input name="pkg" value="" type="hidden">
<input name="hasMsgr" value="0" type="hidden">
<input name="login" id="username" value="test_user" type="hidden">
<input name="passwd" id="passwd" value="password" type="hidden">
</form>


یا حق ...

----------


## AlirezaBahredar

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

----------


## Hamid_PaK

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

یا حق ...

----------


## ghabil

ببین چند روش Session Managment در HTTP وجود داره :

Cookies: که سرور برای کلاینت زمانی که شناسایی شد ،یک Cookie میفرسته و هر دفعه که مجددا کلاینت خواست با سرور ارتباط برقرار کنه این کوکی رو میفرسته و سرور متوجه میشه که قبلا این کلاینت رو شناسایی کرده و از توی لیست سشنهاش با کمک اون کوکی این سشن مخصوص کلاین رو پیدا میکنه.

URL Tracking: در این روش بجای کوکی از یک شماره Session استفاده میشه که بصورت یک پارامتر بعد از Url صفحاتی که کاربر توشون میره ، قرار میگیره و سرور هربار کاربر رو با این پارامتر شناسایی میکنه

Hidden Fields: در این روش یک سری Input از نوع Hidden توی هر پاسخی که سرور میسازه گذاشته میشه که اطلاعات لازم برای شناسایی Session توی این فیلدها هست و کلاینت هم هربار که میخواد دوباره به سرور مراجعه کنه این اطلاعات رو مجددا برای سرور میفرسته.

----------


## hamed_gm

برای وصل شدن به سرور یاهو می تونید از کد زیر استفاده کنید!
var
  SL: TStringList;
begin
IdHTTP1.IOHandler:=ssl;
sL := TSTringList.Create;
SL.Values['login'] := txtuser.Text;
SL.Values['passwd'] := txtpasword.Text;
Memo1.Lines.Text:=IdHTTP1.Post('https://login.yahoo.com/config/login?',sl);

----------


## undefined

با سلام
ببخشید اما من به این خطا بر خوردم 
زمانی که میخواد اطلاعات رو به سرور ارسال کنه این خطا رو میده 
HTTP/1.1 302 Foundسایت مقصد .Net هستش و هدر رو هم برابر با تنظیمات خودتون تنظیم کردم یکبار هم هماند یک درخواست ارسالی از خود سایت اما باز هم همین خطا .

----------


## hamedsoft

> با سلام
> ببخشید اما من به این خطا بر خوردم 
> زمانی که میخواد اطلاعات رو به سرور ارسال کنه این خطا رو میده 
> HTTP/1.1 302 Foundسایت مقصد .Net هستش و هدر رو هم برابر با تنظیمات خودتون تنظیم کردم یکبار هم هماند یک درخواست ارسالی از خود سایت اما باز هم همین خطا .


البته ميدونم که تاپيک خيلي قديمي هست ولي گفتم شايد کسي هنوز جواب سؤال رو نگرفته باشه.

فکر کنم اگه پراپرتي HandleRedirects مربوط به شيء HTTP رو در حالت True قرار بديد مشکل حل بشه.

----------


## golbafan

سلام من میخوام عکس های Twebbrowser رو *بدون اینکه از url استفاده کنم* ذخیره کنم

در صورت استفاده کردن از URL عکس رفرش شده و عوض میشود

----------


## gbg

سلام
من هم برای ارسال و دریافت به سرور از کدی مثل کد شما استفاده کردم
مشکل من در session هستش
من لاگین می کنم و صفحه جدید رو دریافت می کنم ولی وقتی در خواست جدید رو ارسال می کنم دوباره اطلاعات صفحه لوگین برام ارسال میشه
حالا می خوام ببینم در جواب اولی چطوری طلاعات session رو بدست بیارم و چطور به همراه درخواست دوم ارسال کنم

----------


## vcldeveloper

> مشکل من در session هستش


شما می تونید با یک اسنیفر بررسی کنید که سایت مربوطه برای session از چه مکانیزمی استفاده میکنه؛ در اکثر مواقع مکانیزم استفاده شده مبتنی بر Cookie هست. اگر مبتنی بر Cookie باشه، شما باید بعد از لاگین در سایت، Cookie مربوطه را ذخیره کنید، و در درخواست های بعدی آن را به سایت ارسال کنید. برای این کار، یک Cookie Manager به پروژه اضافه کنید، و به خصوصیت CookieManager از کلا TIdHttp اختصاص بدید.

----------


## gbg

سلام
من  CookieManagerداشتم و به idHTTP هم وصلش کرده بودم و بخاطر همین فکر کردم شاید به جای کوکی از session استفاده میکنه
ولی برای  CookieManager هیچ کدی ننوشتم
نمی دونم چطور مقدار کوکی ها رو بگیرم و چطور دوباره بفرستم
سرچ هم کردم به نتیجه ای نرسیدم

----------


## vcldeveloper

> نمی دونم چطور مقدار کوکی ها رو بگیرم و چطور دوباره بفرستم


اگر مقدار خصوصیت AllowCookies مساوی True باشه، IdHttp به طور خودکار کوکی های ارسالی از سرور را به CookieManager پاس میده، و هر زمان که درخواستی به اون سرور ارسال میکنه، کوکی های مربوط به اون سرور رو هم از CookieManager میگیره و با درخواست به سرور ارسال میکنه. پس عملا نیازی نیست که شما کار خاصی انجام بدید.

اگر شک دارید که اون سایت دقیقا چطور state رو حفظ میکنه، بهتره با یک اسنیفر مراحل ارسال درخواست از یک مرورگر عادی وب به اون سرور رو capture کنید، و با مراحل ارسال درخواست در برنامه خودتون مقایسه کنید؛ ببینید مرورگر شما دقیقا چه درخواستی و با چه پارامترهایی به سرور ارسال میکنه.

----------


## gbg

AllowCookies هم True هستش
من اسنیفر خوب پیدا نکردم اگه سراغ داری معرفی کن ممنون

----------


## vcldeveloper

WireShark

----------

----------


## tadeh2010

سلام
اگر صفحه ی مورد نظر یوزر و پسورد را بصورت یک پنجره ی popup بگیرد چه؟
مثلا آدرس صفحه اینجوری باشد


```
http://10.251.16.33/IN_monitoring?
```

!!
آن وقت چطوری بایستی یوزر و پسورد را بهش بفرستیم؟

----------


## vcldeveloper

> اگر صفحه ی مورد نظر یوزر و پسورد را بصورت یک پنجره ی popup بگیرد چه؟


یک صفحه وب به دو صورت کلی میتونه اطلاعات مربوط به اعتبار سنجی کاربر را دریافت کنه؛ اول اینکه از خاصیت Authentication مربوط به HTTP استفاده کنه، مثلا از Basic Authentication استفاده کنه، که در اون صورت مرورگر خودش متوجه میشه که باید از کاربر اطلاعات مربوطه رو بگیره و به سرور ارسال کنه. در این حالت مرورگر یک پنجره Pop-up برای دریافت اطلاعات مربوطه به کاربر نمایش میده. دوم هم اینکه از یک فرم HTML استفاده شده باشه که کاربر در فیلدهای اون اطلاعات مورد نظر را وارد کنه، سپس دکمه  Submit فرم را کلیک کنه، تا اطلاعات به سرور مربوطه برای پردازش ارسال بشه. هر دو حالت فوق رو میشه با استفاده از اسنیفر بررسی کرد، البته به شرطی که اتصال مربوطه از نوع HTTPS نباشه.

----------


## BORHAN TEC

با سلام  :قلب: 



> البته به شرطی که اتصال مربوطه از نوع HTTPS نباشه.


در تکمیل صحبتهای vcldeveloper باید بگویم که با Colasoft Capsa 7 میشه HTTPS رو هم اسنیف کرد البته اگر از نوع کلید عمومی باشد مثل FaceBook و ... در برخی حالات هم مثلاً یک اپلیکیشن با یک کلید خصوصی از HTTPS برای برقراری اطلاعات استفاده می کنه که میشه اون رو شنود کرد ولی از اونجایی که این اطلاعات کد میشن هیچ چیزی نمیشه از اون متوجه شد و شنود اونها عملاً بی فایده است و در صورتی میشه اون رو دیکد کرد که به کلید خصوصی اون هم دسترسی داشته باشیم و لا غیر.

----------


## tadeh2010

خوب دوستان ممنونم من نمی دونم چطوری sniff بکنم ؟
حالا با یه نرم افزار مثل Wireshark-win64-1.10.1
ولی من اینو نصب کردم ولی نمی دونم باید چیکار بکنم
چه اطلاعاتی بدست بیارم؟
چطوری؟
و چیکارشون بکنم؟
 :متفکر:

----------


## vcldeveloper

> در تکمیل صحبتهای vcldeveloper باید بگویم که با Colasoft Capsa 7 میشه  HTTPS رو هم اسنیف کرد البته اگر از نوع کلید عمومی باشد مثل FaceBook و  ... در برخی حالات هم مثلاً یک اپلیکیشن با یک کلید خصوصی از HTTPS برای  برقراری اطلاعات استفاده می کنه که میشه اون رو شنود کرد


برای شنود اتصالات HTTPS نیاز به کلید Session مبادله شده بین دو طرف هست. این کلید محتوای رد و بدل شده را با یک الگوریتم متقارن رمز میکنه. در HTTPS این کلید Session با استفاده از الگوریتم های نامتقارن مثل RSA رمز میشه. و بین دو طرف مبادله میشه. بعدش در ادامه اتصال داده ها با این کلید رمز میشند. برای رمزگشایی از این اطلاعات نیاز به کلید خصوصی وب سایت ارائه کننده اتصال HTTPS هست. پس چیزی که اون برنامه مورد اشاره شما دریافت میکنه، بیشتر از اونی که Wireshark میگیره نیست. داده کد شده ای که کلید رمزنگاری اش موجود نباشه و امکان شکستن رمز اون هم برای کاربر فراهم نباشه، به درد نمیخوره.





> حالا با یه نرم افزار مثل Wireshark-win64-1.10.1
> ولی من اینو نصب کردم ولی نمی دونم باید چیکار بکنم


خودش به اندازه کافی راهنما و مستندات داره. البته در کار با ابزاری مثل Wireshark فرض بر این هست که شما دانش ابتدایی درباره شبکه های کامپیوتری و پروتکل هایی مثل HTTP دارید. البته ابزارهای ساده تری که فقط برای پروتکل HTTP مورد استفاده قرار می گیرند در Firefox  و یا Chrome وجود دارند که با استفاده از اونها می تونید اطلاعات مبادله شده بین یک سایت و مرورگر را مشاهده کنید. Wireshark نسبت به اونها ابزار پیشرفته تر و با کاربری گسترده تری هست.

----------


## tadeh2010

ببینید این رو توی کدهای دیتابیس فایرفاکس پیدا کردم که برای نگهداری یوزر و پسورد همون صفحه هستش
نمی دونم بدرد می خوره؟
<entry host="http://10.251.16.3" user="user" password="pass" formSubmitURL="" httpRealm="IDU" userFieldName="" passFieldName=""/>
و اگر بدرد بخوره چطوری ازش استفاده بکنم که کارم راه بیافته؟
مرسی

----------


## Felony

سلام ؛
پیرو بحث vcldeveloper نرم افزارهایی هستند که میتونند حملاتی نظیر MIM بزنند ( Man in the middle ) و با یک Certificate جعلی اطلاعات رو استخراج کنن ، مثلا Fiddler با یک Fake SSL Certificate میتونه داده های HTTPS رو استخراج کنه ؛ Fiddler خودش رو به عنوان یک Proxy برای انجام حملات MIM معرفی میکنه .

- البته این Certificate چون جعلی هست موقع ورود تو سایت های مختلف هشدارهایی هم نمایش میده ولی در هر صورت میتونه برای Sniff کردن گزینه مناسبی باشه .

- اگر دنبال اطلاعات بیشتر در مورد Fiddler هستید کتابی با نام Debugging with Fiddler هست که میتونه کمکتون کنه .

----------


## hp1361

سلام

اگر صفحه مورد نظر کپچا داشته باشه و اونو از یه URL دیگه دریافت کنه، حالا چطور باید عمل کرد؟(منظورم در مورد Cookie هاست)

ممنون

----------


## tadeh2010

سلام دوست عزیز
من هنوز اون مشکلم رو نتونستم حل بکنم
ولی برای موضوع کپچاپ می دونم که بایستی با کدهای Html که از کامپوننت IDHTTP بعد از گزشتن از مرحله ی مشکل من و با پردازش  عکس (البته بسته به نوع کپچاپ) و یک تاکتیک که در جستجوهای فراوانی که انجام دادم در یک سایت دیدم و اون پرکردن یک edit در صفحه وب و ارسال مقادیر یا فشردن دکمه یا باتتن بود میشه اینکارو انجام داد
پیچیده بود نه؟
البته شاید دوستان راههای بهتری هم بلد باشند.
اگر به نتیجه رسیدی تو سایت بزار ما هم استفاده بکنیم
موفق باشید

----------


## hp1361

سلام

من با کد زیر کپچا رو دریافت و در یک TImage نمایش میدم


procedure TForm1.lblInitClick(Sender: TObject);
var
  response: TMemoryStream;
  gif: TGIFImage;
  html: string;
begin
  html := IdHTTP.Get(URLGET);
  mem.Text := html;
  GetHiddenFieldValues(html);

  response := TMemoryStream.Create;
  gif := TGIFImage.Create;
  try
    IdHTTP.Get(URLIMG, response);
    response.Position := 0;
    gif.LoadFromStream(response);
    imgCaptcha.Picture.Assign(gif);
  finally
    gif.Free;
    response.Free;
  end;
end;


اما در مورد طریقه ارسال اون و فیلدهای Hidden مشکل دارم. نمیدونم اصلا چیکار باید کرد!

----------


## tadeh2010

:-)کد جالبی بود من خیلی چیزا بلد نیستم و کمی چیز یاد گرفته ام
نمیدونم 
دوستان دیگه حتماکمکتان خواهند کرد
ولی بیشتر سرچ بکن
کلمات کلیدی مختلفی را در گوگل امتحان بکن
موفق باشی

----------

