113

113

HTTP

1

Crouz Security Team

به نام خدا

HTTP

(

Clients & Servers) یک راهنمای کاربردی برای نوشتن مشتری و سرویس دهنده

به شما امکان نوشتن مرورگرهای وب،

HTTP یک پروتکل شبکه ساده و قوی برای وب است. دانستن شیوه کاربرد و کارایی HTTP

سرورهای وب، صفحه های دانلود خودکار، چک کننده های لینک و بقیه ابزارهای مفید را میدهد

.

Clients

برای شروع

) HTTP توضیح می دهد و جزئیات نوشتن مشتری و سرویس دهنده HTTP این متن آموزشی به سادگی در مورد ارتباط باHTTP . آشنا می کند "Socket Programming" را به شما آموزش می دهد. همچنین شما را با کلیات (& Servers

کاملا کافی و ساده است

. "Socket Programming"

استفاده می کنید در غیر این صورت اول باید آن را یاد بگیرید

و نیمه دوم در مورد نیازمندی های به وجود آمده و امکانات جدید آن بحث می کند

. نیمه اول CGI را می خوانید احتمالاً از Method هنگامی که شما این. HTTP این متن در مورد پایه ها و کلیات 1,0

را توضیح نمی دهد بلکه کلیات و چارچوبی از آن را توضیح می دهد تا دریابید به چه طریق نیازها

HTTP این متن تمامی جزئیات 1,1

بر آورده می شوند و در صورت نیاز کجا می توانید اطلاعات بیشتر به دست بیاورید

قبل از شروع دو پاراگراف زیر را با دقت مطالعه کنید

. HTTP از طریق:

<LECTURE>

و یا سایر برنامه های شبکه نیازمند دقت بیشتر نسبت به نوشتن برنامه برای یک سیستم است

شما باید طبق قوانین استاندارد شده حرکت کنید

نمی گیرید

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

(به نظر شما چرا؟)! HTTP نوشتن(برنامه بنویسید)،در غیر این صورت کسی شما را درک نمی کند و مورد توجه قرار. ولی از همه چیز مهم تر بار مسئولیتی است که با نوشتن برنامه برای سیستم های دیگر متوجه شما میشود . نوشتن یک:

CPU time, bandwidth, memory

نوشتن یک برنامه شبکه بد باعث تلف شدن منابع مردم دیگر و نوشتن یک برنامه واقعاً بد باعث تلف کردن منابع هزاران نفر در یک

زمان می شود

کارایی و بهره کمتری نسبت به یک برنامه نویسی مرتب و از روی اصول خواهد داشت

دیگران احترام بگذارید

! برنامه نویسی در هم و برهم و نامرتب شبکه از طریق استاندارها می تواند اصلاح شود. ممکن است مطمئن تر شود ولی. بنابراین با دقت و مودب باشید و به نظرات.

قبل از اینکه بدانید چه می کن ید دچار وسوسه نشوید تا برنامه هایی بنویسید که به طور خودکار لینک های وب را دنبال می کنند

.(

Robots & Spiders)

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

کورکورانه به تعداد لینک ها می افزاید و به سرعت منابع یک سرور را به یغما می برد . اگر خواستید برنامه ای مثل یک روبات بنویسید،

به لینک زیر مراجعه کنید:

2

. به طورCrouz Security Team

http://info.webcrawler.com/mak/projects/robots/robots.html

ممکن است در آنجا برنامه مورد نظر شما موجود باشد و اگر هم می خواهید خودتان بنویسید به سه لینک زیر سر بزنید:

http://info.webcrawler.com/mak/projects/robots/guidelines.html

http://info.webcrawler.com/mak/projects/robots/norobots.html

http://info.webcrawler.com/mak/projects/robots/exclusion.html

</LECTURE>

حال شروع به کار می کنیم.

چیست؟

HTTP

یک پروتکل شبکه برای انتقال مجازی تمامی فایل ها و انواع داده ها

"Hypertext Transfer Protocol" مخفف عبارت HTTP

است . این داده ها (

جای

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

محسوب می شود، زیرا مرورگر درخواست خود را به سرویس دهنده (

به درخواست او پاسخ می دهد . پورت استاندارد و (

World Wide Web) که مجموعا منابع نامیده می شوند) بر روی شبکه تار عنکبوتی جهانی With all EXT)TCP/IP Sockets بر روی HTTP عکس ها، نتایج فرم ها و یا هر چیز دیگر باشد . معمولا ،HTML میتوانند شامل صفحاتHTTP Client) HTTP یک مرورگر وب نوعی مشتریWeb Server) یا وب سرور می فرستد و وب سرور (HTTP Server) HTTP

پورت 80 می باشد . بر روی این پورت منتظر درخواست ها می ماند (البته می تواند از هر

پورت دیگر نیز استفاده کند).

HTTP پیش فرض برای سرویس دهنده

ها چیستند؟

Resource

مشخص

URL توده ای از اطلاعات است که توسط Resource علاوه بر انتقال فایلها، برای انتقال منابع نیز به کار می رود، یک HTTP

و به سرور منتقل می شود.

یک ،

سند که قابل دسترسی به زبان های گوناگون است و یا چیزهای دیگر باشد.

برای سادگی بیشتر می توانید منبع را مشابه فایل در نظر بگیرید ولی با حالتی عمومی تر، به عبارت دیگر ،

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

CGI بیشترین نوع منابع، فایل ها هستند ولی یک منبع می تواند : نتایج تولید شده توسط یک تولید کننده، خروجی ی ک اسکریپتHTTP در هنگام یادگیریHTTP تقریبا تمامی منابع

:

HTTP ساختار چگونگی انجام مذاکرات

یک

خود را از طریق آن ارتباط می فرستد. (

خواسته

پیغام های درخواست و پاسخ مشابه هم

میباشند و هر دو از کلمات انگلیسی تشکیل شده اند. هر دو شامل:

HTTP استفاده می کند . مشتری (Client-Server) از مدل مشتری-سرویس دهنده HTTP ، مشابه اکثر پروتکل های شبکهRequest Message) با سرویس دهنده برقرار می کند و درخواست (Connection) ارتباطResource معمولا شامل Response Message) را به مشتری برمی گرداند (Response Message) سپس سرور پیغامی حاوی پاسخFormat . شده توسط مشتری است )! بعد از پاسخ به درخواست، سرور ارتباط را قطع می کند

- خط آغازین

3

Crouz Security Team

Header Line

- یک خط خالی

- و پیام اختیاری (مثل یک فایل و یا نتایج فرم یا خروجی فرم).

- یک و یا چند

در زیر ساختار کلی آنرا می بینید:

Example Code

<initial line, different for request vs. response>

Header1: value1

Header2: value2

Header3: value3

<optional message body goes here, like file contents or query data;

it can be many lines long, or even binary data $&*%@!^$@>

و

دارای ارزش 13 و 10 هستند (توجه داشته باشید در سیستم های مختلف شاید این مقادیر تغییر کند).

CR تنظیم شوند (یعنی از پایان یک خط به متن به آغاز خط بعدی منتقل شوند ). در اینجا CRLS باید به ترتیب Headers و Initial خطوطASCII کدهای LF

آغاز کردن خط درخواست:

از یکدیگر جدا می شوند:

Space خط آغازین برای درخواست و عکس العمل متفاوت است. خط درخواست دارای 3 قسمت است که با

در حال استفاده

HTTP درخواستی و نسخه Resource آدرس محلی ،(Get Post Head) یک روش درخواست

مانند:

Example Code

GET /path/to/file/index.html HTTP/1.0

4

Crouz Security Team

توجه:

را بده به من !

" روش های دیگر Resource" : متداولترین روش مورد استفاده است که به زبان خودمانی به سرور می گوید GET

هستند که در آینده در مورد آنها توضیح داده می شود. نام روش ها همواره با حروف بزرگ است.

مشابه

در حروف بزرگ درج می شود.

HEAD و POST شاملURI نامیده می شود (یک request URI است که بعد از اسم میزبان می آید که URL قسمتی از Resource آدرس محلیHTTP / x.x همواره به فورمت HTTP است ولی در حالتی کلی تر) نسخه URL

5

Crouz Security Team

آغاز کردن خط پاسخ (یا خط وضعیت):

HTTP

در حال استفاده، یک کد مربوط به عکس العمل ارسالی سرور و یک اصطلاح انگلیسی که به شرح کد وضعیت می پردازد. مانند:

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

Example Code

HTTP/1.0 200 OK

Or

HTTP/1.0 404 Not Found

توجه:

.

کد وضعیت داده شده برای خواندن کام پیوتر و به اصطلاح انگلیسی برای خواندن انسان درج می شود و می تواند تغییر کند . کد وضعیت

شامل سه عدد صحیح است که در کنار هم آمده اند:

"HTTP/x.x" همانند فورمت خط درخواست درج می شود HTTP نسخه

1: تنها نشان دهنده یک پیغام خبری است.

xx

2: نشان دهنده پایان یافتن موفقیت آمیز یک عمل است.

xx

دیگر هدایت می کند.

URL 3: مشتری را به یک xx

متداول ترین کدهای وضعیت:

درخواستی (فایل و یا خروجی یک اسکریپت ) در بدنه پیغام فرستاده

resource 200 که به معنای موفقیت عمل است و در پی آن OK

میشود

.

404 درخواستی موجود نمی باشد

301 Moved Permanently

302 Moved Temporarily

303 See Other (HTTP 1.1 only)

. Not Found resource

پیغام عکس العمل این روش بارها توسط اسکریپت

header در Location : دیگری منتقل شده است (که آدرس جدید در خط URL به Resource

برای تغییر مکان مرورگر استفاده می شود).

CGI های

500 : یک خطای غیر منتظره در سرور:

در اکثر مواقع یک اسکریپت در قسمت سرور دارای خطای منطقی است و یا Server Error

نمی تواند به درستی اجرا شود.

در لینک زیر لیست کامل این کدها را مشاهده می کنید:

http://g0tr00t.mson.org/docs/misc/HTTP.html#httpspec

:

Header خطوط

6

Crouz Security Team

مهیا کننده اطلاعات لازم برای، درخواست و یا پاسخ و به طور کلی در رابطه با شئ که در بدنه نامه ارسال می شود،

هستند.

که به

قسمت سوم توضیح

داده شده است).

Header خطوط"Header-Name:Value" در یک خط جدا تعریف می شود Header این خطوط به صورت انگلیسی درج می شوند و هرRFC- پایان می یابد . این همان فورمتی است که برای ارسال نامه و یا اخبار استفاده می شود (در 822 CRLF صورت

:

Header در مورد خطوط RFC جزئیات 822

نسبت به حروف کوچ ک و بزرگ حساس نمی باشد

آغاز

می شوند و بعضی مواقع برای آسان خواندن در چند خط تجزیه می شوند.

زیر با هم هیچ تفاوتی ندارند:

Header پایان یابند . نام CRLF همان طور که در بالا گفته شد باید به صورتTAB با فاصله و یا Header می تواند بین ":" و ارزش قرار بگیرد. خطوط TAB هر تعداد فاصله و یا .(Not Case Sensitive)Header پس بنابر توضیحات فوق دو

Example Code

Header1: some-long-value-1a, some-long-value-1b

HEADER1: some-long-value-1a,

some-long-value-1b

دارای

لازم و ضروری است.

HTTP تعریف شده است که البته هیچ کدام ضروری نیستند و 1,1 Header دارای 16 HTTP بهتر است بدانید که 1,0"Host:" ، ها Header تعریف شده است که از میان این Header 46

ها استفاده کنید:

Header برای رعایت کردن آداب شبکه از این

که آدرس صندوق پستی شخصی که درخواست را فرستاده مشخص می کند و یا برنامه اجرا شده خود این کار را :

Form Header

باید توسط خود کاربر تعیین شود).

نوشته

Header میکند (این"Program-Name/x.xx" مشخص می کند چه برنامه ای درخواست را فرستاده است که بصورت :User-Agent Header

میشود.

به صورت زیر فرستاده می شود:

Header قسمت ،NetScape شماره نسخه برنامه است. به عنوان مثال برای 3,0 x.xx

"User-Agent: Mozilla/3.0 Gold"

به مسئولین سرورها برای رفع مشکل کمک می کند، آنها همچنین مشخصاتی در مورد کاربر آشکار می کنند . وقتی شما

هایی در برنامه خود قرار بدهید باید از امنیت اطلاعاتی که ارسال می کنید مطمئن شوید..

ها در جواب خود تصمیم بگیرید:

در مورد درخواست است که نام و شماره نسخه برنامه پاسخ د هنده به درخواست را

Header اینHeader تصمیم می گیرید چهHeader اگر شما در حال نوشتن یک سرویس دهنده هستید، در مورد قرار دادن اینUser-Agent که همانند :Server Header

قسمت زیر را ،

بر می گرداند:

Apache درج می شود برای مثال نسخه آزمایشی سرورهای "Program-Name/x.xx" مشخص می کند و به صورت

"Server: Apache/1.2b3-dev"

7

Crouz Security Team

درخواستی ارسال می کند که از ساعت گرینویچ استفاده

Resource که تاریخ آخرین تغییرات را برای :Last Modified Header

میشود:

"Last-Modified: Fri, 31, Dec, 2001 23:59:56 GMT"

8

Crouz Security Team

:(

Body) بدنه پیغام

شامل یک بدنه پیغام که داده ها در آن ثبت شده باشد . در پاسخ به درخواست

درخوستی در همین قسمت پیغام درج به مشتری فرستاده می شود (متداولترین حالت استفاده از بدنه پیغام ) و یا متن

Header ممکن است بعد از خطوط HTTP یک پیامresource

توضیح داده شده در مورد یک پیغام خطا باشد.

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

زیر که در مورد بدنه توضیح می دهند در آن پیغام وجود داشته باشد:

header اگر پیغامی شامل بدنه باشد همیشه باید خطوط

text/html

یا Image/gif : نوع داده ثبت شده در بدنه را مشخص می کند. مثل Header این :Content-Type

تعداد بایت های درج شده در متن پیغام را مشخص می کند.

Header این :Content-Length

:

HTTP الگوی انجام یک مبادله

در ابتدا یک ارتباط با میزبان ،

مشخص

http://www.somehost.com/path/file.html مثلا برای URL برای فراخواندن یک فایل درURL بر روی پورت 80 برقرار کنید (پورت پیش فرض وب سرور 80 است و به همین دلیل در www.somehost.com

نوشته می شود).

http://www.somehost.com:port نمی شود. در غیر این صورت به فورمت

Example Code

GET /path/file.html HTTP/1.0

From: someuser@crouz.com

User-Agent: HTTPTool/1.0

[blank line here]

9

Crouz Security Team

عکس العمل سرور در مقابل درخواست شما چیزی مشابه خطوط زیر خواهد بود:

Example Code

HTTP/1.0 200 OK

Date: Fri, 31 Dec 1999 23:59:59 GMT

Content-Type: text/html

Content-Length: 1354

<html>

<body>

<h1>Happy New Millennium!</h1>

(more file contents)

.

.

.

<!-- ZoneLabs Popup Blocking Insertion -->

<script language='javascript'>postamble();</script>

</body>

</html>

این ارتباط را برقرار می کنیم (تجربه

:(

برقرار کنید و به صورت دستی درخواست خود را تایپ و ارسال نمائید . به

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

درخواست خاص، بسیار مفید است.

10

telnet بعد از ارسال پاسخ، سرور ارتباط را قطع می کند . برای آشنایی بیشتر در زیر به وسیلهtelnet به وسیله HTTP عملی باhttp شما می توانید یک ارتباط با سرور telnet به وسیلهtelnet این ترتیب پاسخ سرور در صفحهCrouz Security Team

خود خط زیر را تایپ کنید:

command Prompt خوب در

Example Code

telnet www.somehost.com 80

سپس درخواست خود را خط به خط مشابه زیر وارد کنید

GET /path/file.html HTTP/1.0

[headers here, if any]

[blank line here]

:

وقتی درخواست شما به پایان رسید به وسیله یک خاط خالی به سرور اعلام می کنید و سرور پاسخ را ارسال می کند که شامل خط

ها و بدنه پیغام است.

Header ، وضعیت

:

Post و Head مانند HTTP روش های دیگر

هستند.

Post و Head ، دو روشی که بیشترین کاربرد را دارند ،GET در کنار

:

Head روش

های پیغام عکس العمل را درخواست و

دریافت نمی کند (به عنوان مثال بدنه پیغام ارسال نمی شود ) و این در مواقعی که می خواهید بدون دانلود یک

از مشخصات آن آگاه شوید، سودمند است.

Header است تنها با این تفاوت که از سرور تنها GET این درخواست دقیقا مشابه درخواستresource هیچ گونهresource

ها.

تجربه کنید تنها با این تفوات که خط آغازین یک چیزی مشابه زیر

است:

Header در پاسخ به این درخواست، سرور باید هیچ گاه بدنه پیغام را ارسال کند تنها خط وضعیت وGET همانند روش telnet این روش را هم می توانید به وسیله

HEAD /path/file.html HTTP/1.0

:

POST روش

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

.(

11

Post روشCGI Script) CGI مشخص شده دارند مانند یک اسکریپتCrouz Security Team

:

GET و POST تفاوت های درخواست

اضافه برای تشریح داده ها مانند:

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

header * در بدنه پیغام درخواست، مجموعه ای از داده ها قرار دارد و معممولا چندContent-Length و Content-Type

اشاره نمی کند بلکه آدرس برنامه ای که عملیات را بر روی داده های ارسالی انجام می دهد را

مشخص می کند.

به طور معمول یک فایل ثابت نیست بلکه خروجی برنامه است.

resource به یک ،URI * درخواستHTTP * عکس العمل

Content-Type

معمولا به صورت:

بوده است . در این حالت CGI به اسکریپت HTML تاکنون، ارسال اطلاعات یک فرم ،POST بیشترین کاربرد

application/x-www-form-URLEncoded

رمزگذاری شده داده فرم را مشخص می کند (بعد از مبحث به شرح چگونگی رمزگذاری می

پردازیم).

دریافت می کند سپس رمز آنرا می گشاید . در زیر نوعی ثبت (

آمده است:

URL طول Content-Length وSTDIN) بدنه پیغام درخواست را بهصورت ور ودی CGI اسکریپتPOST اطلاعات فرم توسط

Example Code

POST /path/script.cgi HTTP/1.0

From: frog@jmarshall.com

User-Agent: HTTPTool/1.0

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

Content-Length: 32

home=Cosby&favorite+flavor=flies

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

که هم فرستنده و هم گیرنده هر دو با فورمت ارسالی داده ها آشنا باشند.

افزوده می شوند

(در مورد این روش هم توضیح داده می شود).

را مطالعه

.

POST شما می توانید از روشURI هم می تواند بر ای ارسال اطلاعات فرم استفاده شود. در این حالت داده های فرم رمزگذاری و به GET روشNCSA's CGI definition پشتیبانی می کند شما باید CGI دارید که از اسکریپت HTTO اگر شما قصد نوشتن سرورEnvironment Variables کنید و همچنین

:

URL-Enconding

ثبت می شوند و در زیر چگونگی

رمزگذاری تشریح شده است:

12

POST یا GET در روش های URL-encoded معمولا به صورت html داده های یک فرمCrouz Security Team

معادل ارزش کاراکتر در جدول اسکی است ). به ،

نیز گفته می شود (مثل

دوم- تمام فاصله ها را به

سوم- نام ها و ارزشهای متغیرها را به وسیله = و

xx) تبدیل کنید "%xx" اول- تمامی کاراکترهایی که غیر از حروف و عدد هستند را& ^ % $ # @ = +). "UnSafe" این کاراکترها؛ کاراکترهای ناامن"+" تبدیل کنید.& به صورت رشته تبدیل کنید. مثل:

Example Code

name1=value1&name2=value2&name3=value3

می باشد.

دیگر با اسم

رمزگذاری شده به صورت زیر می باشد:

"Query String" قسمت GET در قسمت "بدنه پیام" و در POST چهارم- این رشته درfield را ثبت کند و "Lucy" تعیین شده باشد و کاربر اسم "Name" به صورت field برای مثال اگر در یک فرم نام یکURL باشد "Fred & Ethel" و ارزش "Neighbors"

Example Code

name=Lucy&neighbors=Fred+%26+Ethel

که دارای طول 34 می باشد.

( قسمت 2,2

توضیح داده شده است و تمام این مراحل برای تبادل اطلاعات ثبت شده فرم به یک رشته بلند است.

RFC- قسمت 2,4 (سابقا در 1738 RFC- تنها مرحله اول بالا است که در 2396 "URL-encoding" از لحاظ فنی عمل

برای ثبت داده های فرم:

GET استفاده از

URI

نیز می توان برای ارسال مجموعه ای از داده ه ای کوچک به سرور استفاده کرد . کلید این کار تنها در فهمیدن دقیق GET از

"

حتما نباید اسم فایل باشد بلکه یک رشته بلند است که منبع اطلاعات را بر روی سرور مشخص می کند که این ممکن است اسم

یک درخواست" است.URI

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

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

رشته رمزگذاری را

وارد کنید:

URL با گذاشتن علامت پرسش "?" بعد از GET توسط CGI بنابراین برای ارسال اطلاعات به یک اسکریپت

Example Code

GET /path/script.cgi?field1=value1&field2=value2 HTTP/1.0

که برای انتقال داده های کوچک استفاده می شود (برای داده های بزرگ از

استفاده کنید).

GET این بود طریقه ارسال داده های یک فرم به وسیلهPOST

13

Crouz Security Team

:

HTTP Proxies

Proxy

به مشتری می رسد .

ها مورد استفاده

قرار می گیرند.

ارسال می کند . درخواستی که به

درخواستی (به

در واقع برنامه ای است که بین مشتری و سرویس دهنده قرار می گیرد در خواست ها از مشتری به HTTP Proxy یکProxy درخواست را به سرویس دهنده می فرستد . پاسخ هم از همین راه و از طریق Proxy فرستاده می شود وFirewall ها معمولا در Proxy . هم نقش سرویس دهنده و هم نقش مشتری را اعمال می کند proxy به این ترتیبproxy استفاده می کند تمام درخواست های خود را به جای سرور به آن proxy وقتی یک مشتری ازresource کامل URL فرستاده می شود با درخواستی که به سرور ارسال می شود متفاوت است . در خط اول از proxy

استفاده می شود: (

path جای

Example Code

GET

http://www.somehost.com/path/file.html HTTP/1.0

می داند که درخواست را باید به کدام سرور ارسال کند.

proxy از این طریق

پایان قسمت اول:

آشنا شدید

می پردازد و نیازمندی های جدید آن را بررسی میکند

یاد داشته باشید که شعار برنامه نویسی برای شبکه در یک جمله خلاصه می شود:

درخواست خود سخت گیری و در برابر درخواست دیگران مدارا کنید

دیگر درخواست خود را به شما ارسال کنند ولی شما به نحوی باید برنامه را بنویسید تا به درخواست های غیر معمول احتمالی هم پاسخ

دهد:

و

. ادامه این آموزش به HTTP خوب به پایان نیمه اول این آموزش رسیدیم. در این قسمت شما با کلیات و ساختمان 1,0. در پایان این بخش به HTTP نحوه ارتقا برنامه های شما برای استفاده از . 1,1" برای چیزی که درخواست می کنید و در نحوه" . به عبارت دیگر مشتری ها و سرور های دیگر شاید به نوعیCRLF به خط پایان دهد .
نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد