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

امنیت شبکه با پایتون سوکت

تاریخ بروزرسانی : یکشنبه 21 مهر 1398

تعداد بازدید : 709

گروه دوره : Python

زمان خواندن مقاله : 20 دقیقه

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

امنیت شبکه با پایتون سوکت

کاربرد پایتون در شبکه

میدانیم پایتون زبانی است با قابلیت های بسیار، ازبرنامه نویسی برای وب گرفته تاهوش مصنوعی و....
امروز میخواهیم قدرت این زبان محبوب را در شبکه بررسی کنیم و بفهمیم چه کاربردی دارد؟
چگونه میتوان از این زبان در بحث شبکه استفاده کرد؟
زبان پایتون با استفاده از ماژول خود به نام سوکت در شبکه کار میکند پس قبل از آن ما شما را با تاریخچه این ماژول وهمچنین تعریفی ازآن آشنا میکنیم سپس آموزش پایتون سوکت را به طورمختصر برای  شما بیان میکنیم  پس باماهمراه باشید.

تاریخچه سوکت ها:

درباره تاریخچه سوکت ها باید بگویم که تاریخ خیلی طولانی دارند و استفاده ازآنها درسال 1971 با آرپانت آغازشد و سپس باتوسعه API یاهمان رابط های نرم افزاری که ارتباط بین نرم افزارهای مختلف را پیاده سازی میکنند در سال 1983 به نام سوکت بِرِکلی منتشر شد.
احتمالا الان در ذهن خود میگویید آرپانت چیست؟سوکت برکلی چیست؟
باکمی صبروحوصله به جواب میرسید.
در ادامه سوکت ها، با اینترنت که در دهه 1990 جهانی شد به کار خود ادامه دادند و کلید برنامه نویسی شبکه رقم خورد و سرورهای وب و مرورگرها تنها برنامه هایی بودند که با استفاده از سوکت ها به شبکه متصل شدند.
شایع ترین کاربرد سوکت ها، برنامه مشتری - سرور است که درآن یک طرف به عنوان سرور عمل میکند و منتظر ارتباط از مشتریان است.

تعریف آرپانت و سوکت برکلی:

آرپانت (ARPANET) مخفف Advanced Research Projects Agency Network به معنی سازمان پروژه‌های تحقیقاتی پیشرفته شبکه، اولین شبکه Switching بسته های اطلاعات در دنیا بود و پس از مدتی تبدیل به اینترنت جهانی شد.
پس از پرتاب نخستین ماهواره اتحاد جماهیر شوروی به فضا و هنگامی که رقابت سختی از نظر تسلیحاتی بین دو ابرقدرت آن زمان جریان داشت و دنیا در دوران جنگ سرد به سر می برد، وزارت دفاع آمریکا در واکنش به این اقدام رقیب نظامی خود، آژانس پروژه های تحقیقاتی پیشرفته یا آرپا (ARPA) را تاسیس کرد. یکی از پروژه های مهم این آژانس تامین ارتباطات در زمان جنگ جهانی احتمالی تعریف شده بود.
در همین سال ها در مراکز تحقیقاتی غیرنظامی که در امتداد دانشگاه ها بودند، تلاش برای اتصال کامپیوترها به یکدیگر در جریان بود. در آن زمان کامپیوتر های Mainframe از طریق ترمینال ها به کاربران سرویس می دادند. در اثر اهمیت یافتن این موضوع آژانس آرپا (ARPA) منابع مالی پروژه اتصال دو کامپیوتر از راه دور به یکدیگر را در دانشگاه MIT بر عهده گرفت. در اواخر سال 1960 اولین شبکه کامپیوتری بین چهار کامپیوتر که دو تای آنها در MIT، یکی در دانشگاه کالیفرنیا و دیگری در مرکز تحقیقاتی استنفورد قرار داشتند، راه اندازی شد.
 
این شبکه آرپانت نامگذاری شد. در سال 1965 نخستین ارتباط راه دور بین دانشگاه MIT و یک مرکز دیگر نیز برقرار شد. تا این سال ها شبکه آرپانت به امور نظامی اختصاص داشت، اما در سال 1967 به عموم معرفی شد.
 Switching بسته‌های اطلاعات در آرپانت بر اساس طرحی از دانشمند بریتانیایی دونالد دیویس و لارنس رابرت از آزمایشگاه لینکلن بود.
در این سال ها حرکتی غیرانتفاعی به نام MERIT که چندین دانشگاه بنیانگذار آن بوده اند، مشغول توسعه روش های اتصال کاربران ترمینال ها به کامپیوتر مرکزی یا میزبان شد.
نخستین شبکه از این نوع که چندین ایالت را به هم متصل می کرد Michnet نام داشت. روش اتصال کاربران به کامپیوتر میزبان در آن زمان به این صورت بود که یک نرم افزار خاص روی کامپیوتر مرکزی اجرا می شد و ارتباط کاربران را برقرار می کرد اما در سال 1976 نرم افزار جدیدی به نامHermes عرضه شد که برای نخستین بار به کاربران اجازه می داد از طریق یک ترمینال به صورت تعاملی مستقیماً به سیستم MERIT متصل شوند.
از وقایع مهم تاریخچه شبکه های کامپیوتری، ابداع روش سوئیچینگ بسته ای است. قبل از معرفی شدن این روش از سوئیچینگ مداری برای تعیین مسیر ارتباطی استفاده می شد اما در سال 1974 با پیدایش پروتکل ارتباطی TCP/IP این پروتکل جایگزین پروتکل NCP شد و به پروتکل استاندارد برای آرپانت تبدیل شد. با این تغییر و تحول، شبکه های زیادی به بخش تحقیقاتی این شبکه متصل شدند و آرپانت به اینترنت تبدیل شد.
 ۲۹ اکتبر سال ۱۹۶۹ اولین پیام بین کامپیوتری ارسال شد. در این روز، چارلی کلاین، یکی از دانشجویان دانشگاه UCLA تلاش کرد کلمه‌ی «login» را با استفاده از شبکه‌‌ی بین کامپیوتری، به کامپیوتر دیگر در مرکز تحقیقات دانشگاه استنفورد ارسال کند. این شبکه‌ی بین کامپیوتری آرپانت (ARPANET) نام داشت که پایه‌های اینترنت را بنا کرد.
پس از ارسال حروف l و o، شبکه‌ی آرپانت دچار مشکل شد و قطع شد. پس از یک ساعت تلاش، شبکه به حالت پایدار بازگشت و ارسال پیام با موفقیت انجام شد. آرپانت مخفف عبارت «شبکه‌ی آژانس پروژه‌های تحقیقاتی پیشرفته  (Advanced Research Projects Agency Network)  است. این شبکه یکی از اولین شبکه‌های ارتباطی بر اساس ارسال و دریافت Packet بود و از پروتکل TCP/IP استفاده می‌کرد. هر ۲ فناوری استفاده‌شده در این شبکه، پایه‌های توسعه‌ی اینترنت بودند. توسعه‌ی شبکه‌ی آرپانت توسط آژانس پروژه‌های تحقیقاتی پیشرفته‌ی وزارت دفاع ایالات متحده‌ی آمریکای پشتیبانی می‌شد.
با پیشرفت پروژه‌ی آرپانت، استانداردها و نیازها برای اتصال شبکه‌های متعدد به یکدیگر نیز توسعه یافتند. در سال‌های بعد استانداردها و پروتکل‌های اینترنت به‌مرور تدوین شدند و در نهایت در سال ۱۹۹۰، شبکه‌ی آرپانت بازنشسته و تعطیل شد.
سوکت های برکلی: سوکت‌های برکلی  یا سوکت‌های بی‌اس‌دی، فریم ورکی است که شامل رابط‌های برنامه‌نویسی نرم‌افزار برای کار با سوکت‌های اینترنتی است، که از این سوکت‌ها برای ارتباطات بین پردازشی استفاده می‌شوند. امروزه تمام سیستم‌عامل‌های مدرن یک پیاده‌سازی از سوکت‌های برکلی را به همراه دارند چون این سوکت‌ها روش استاندارد برای دسترسی به اینترنت هستند.

 

سوکت‌ها چه هستند؟

قبل از هر چیز بهتر است بدانیم که سیستم عامل برنامه ها بایکدیگر صحبت نمی کنند بلکه این پردازش  ها(Processes)  هستند که عمل ارتباط با یکدیگر را انجام میدهند.در واقع پردازش ها برنامه هایی هستند که درون و بین یک سیستم انتهایی در حال اجرا هستند و هنگامی که پردازش ها بر روی یک سیستم در حال اجرا می باشند آنها میتوانند با یکدیگر و با دیگر پردازش ها ی مابین خود ارتباط برقرار کنند ارتباط این پردازش ها از طریق مبادله پیام می باشد.
یک پردازش پیام های ارسالی و یا در یافتی خود را از طریق یک نرم افزار واسط شبکه که اصطلاحا به آن سوکت گفته میشود از درون شبکه عبور می دهند.
با یک بیان ساده می‌توان گفت که سوکت به ترکیب یک آدرس ماشین (IP) و یک شماره درگاه (Port) گفته می‌شود
در برقراری ارتباط بین کامپیوترها در یک شبکه دو چیز بسیار مهم است:
  1. آدرس ماشینی که می‌خواهیم اطلاعاتی از آن بگیریم یا به آن ارسال کنیم
  2. برنامه‌ای از آن ماشین که درخواست اطلاعات کرده یا اینکه می‌خواهیم اطلاعاتی از آن برنامه کسب کنیم.
این دو یعنی آدرس ماشین و شماره برنامه به وسیله سوکت در شبکه مشخص می‌شوند.
پس یک سوکت یا پریز یا کانال در شبکه ، لینکی است میان دو اپلیکیشن که می‌توانند با همدیگر ارتباط برقرار کنند. این حالت می‌تواند به صورت محلی روی یک ماشین و یا به صورت ریموت بین دو ماشین جداگانه انجام شود.
به صورت کلی سوکت‌ها مانند یک لینک بین دو موجودیت کار می‌کنند
ودربحث برنامه نویسی میتوان گفت درواقع سوکت ها کانال ارتباطی ما در برنامه هستند. یا دروازه و ابزار ارسال و دریافت اطلاعات بین ما و طرف مقابل در سطح برنامه نویسی.
و اما چیزهای مثل HTTP و FTP و SMTP و POP3 چی هستن؟
اینها پروتکل هستن. یعنی قراردادها و استانداردهایی که تعیین میکنند برنامه های مختلف چطور با هم صحبت کنند.
پروتکل مثل زبان است. مثلا زبان عربی، فارسی و غیره.
و سوکت یه دستگاه ارتباطی مثل تلفن است.
شما با تلفن زنگ میزنید به طرف مقابل واو گوشی را  برمیدارد و حالا یک کانال ارتباطی بین شما وجود دارد که میتوانید از طریق آن، صدای یکدیگر رو بشنوید. این یعنی سوکت.
اما فقط توانایی تبادل صدا کافی نیست، بلکه نیاز است طرفین به زبان مشترکی صحبت کنند تا حرف همدیگر را متوجه شوند. این زبان مشترک همان پروتکل ها هستند.

چه پروتکل هایی برای ارتباط سوکت استفاده می شود؟

همان طور که اشاره شد ما پروتکل های ارتباطی نظیر TCP  و UDP  داریم که پروتکل TCP  این امکان را به ما میدهد تا هم اطلاعات را ارسال و هم دریافت کنیم.
به عبارتی تبادل اطلاعات به صورت دو طرفه خواهد بود.
اما در پروتکل UDP  ارسال اطلاعات به صورت یک طرفه خواهد بود.

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

برای برنامه نویسی شبکه در زبان پایتون، نیاز است تا به تمام Syntax ها و مفهوم های ابتدایی این زبان آشنا باشید.
اگر آشنایی با این زبان ندارید، پیشنهاد می‌کنیم به دوره آموزش پایتون ما بروید و با این زبان آشنا شوید و سپس این آموزش را دنبال کنید.

پایتون سوکت چیست؟

در زبان پایتون از کتابخانه httplib  و یا socket.io   برنامه نویسان تحت وب برای برنامه نویسی خود استفاده میکنند.برای ایجاد یک سوکت شما می‌توانید از تابع socket.socket() استفاده کنید، سینتکس این حالت به صورت زیر است:
Import socket
s= socket.socket (socket family,socket type,protocol=0)
  • socket_family: این مورد نوع آدرس دهی برای ارتباط را مشخص میکند. این ورودی، یک مقدار عددی است اما میتوان مقادیر ثابت موجود در کتابخانه socket را نیز استفاده کرد
  • socket_type:  مشخص کننده نوع سوکت است. این ورودی، یک مقدار عددی است و میتوان برای تعریف آن از مقادیر ثابت موجود در کتابخانه استفاده کرد. نوع سوکت در اصل نشان دهنده نحوه اتصال بین دو نود خواهد بود. معمولاً از مقدار socket.SOCK_STREAM برای ارتباط TCP و از socket.SOCK_DGRAM برای اتصال UDP استفاده میشود.

توابع مربوط به سوکت سرور

bind

با استفاده از تابع bind() میتوان آدرس IP و پورت مورد نظر برای فعال شدن را تعیین کرد. توجه داشته باشید که پورتی که وارد میشود باید بر روی سیستم سرور آزاد بوده و توسط برنامه دیگری استفاده نشود. (همانطور که میدانید پورت های 1 تا 1024 به صورت پیشفرض توسط سیستم عامل رزرو شده اما میتوانید پورت های 1025 تا 65536 را بررسی کنید)

 

listen

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

accept

این تابع درخواست هایی که برای سرور ارسال میشود را دریافت کرده و در صورت توان قبول خواهد کرد. برنامه بر روی تابع accept() به صورت بلاک شده خواهد ماند تا زمانی که درخواستی به سرور ارسال و از سمت سرور پذیرفته شود.پس از دریافت و قبول یک ارتباط (connection)، این تابع یک تاپل (tuple) را به عنوان خروجی باز میگرداند؛ این تاپل دو مقدار دارد، مقدار اول شئ کانکشن و مقدار دوم حاوی مشخصات کلاینت متصل شده در ارتباط می باشد.

 

توابع سوکت کلاینت

connect

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

توابع اصلی سوکت

توابع زیر را میتوان در هر دو طرف ارتباط (سرور یا کلاینت) استفاده کرد.

 

recv
وقتی این تابع فراخوانی میشود مقدار ارسال شده در اتصال TCP را دریافت کرده و خروجی را به ما نشان میدهد. هنگام استفاده از این تابع، برنامه روی این خط بلاک شده و تا زمانی که پیامی در ارتباط دریافت نکند، پیشروی نخواهد کرد.
به عنوان ورودی اول تابع recv() یک مقدار عددی دریافت میکند؛ این عدد (buffer size) نشان دهنده تعداد حداکثر بایت هایی است که باید از خروجی بخواند. یعنی مشخص میکنیم حداکثر چند بایت از پیام دریافت شده را بخواند.
خروجی تابع به صورت byte است؛ پس اگر بخواهیم آن را به عنوان یک رشته استفاده کنیم، بهتر است تابع decode() را روی آن صدا بزنیم.

 

send
تابع send() یک ورودی به صورت اجباری میگیرد که همان اطلاعاتی است که باید به مقصد (آن سوی ارتباط TCP) ارسال شود.
ورودی تابع می بایست به صورت byte و با encode مشخص باشد؛ بنابراین در صورتی که بخواهیم یک رشته را ارسال کنیم، باید بر روی رشته مورد نظر ابتدا تابع encode() را صدا زده و خروجی آن را ارسال کنیم.

 

recvfrom
این تابع برای دریافت پیام در کانکشن ایجاد شده UDP استفاده میشود.

 

sendto
تابع sendto() برای ارسال پیام به مقصد در یک کانکشن UDP استفاده میشود. به عنوان سومین خروجی این تابع، میتوان مقصد (زوج آدرس و پورت) را تعریف کرد.

 

Close
در ابتدای ایجاد کانکشن، ما یک کانکشن به آن طرف ارتباط ایجاد کرده و یک پورت را مشغول کرده ایم. با صدا زدن تابع close()روی کانکشن ایجاد شده، کانکشن را بسته و پورت را آزاد میکنیم. بدیهی است که این کار در انتهای کارمان صورت خواهد پذیرفت.

 

ساخت برنامه چت با پایتون

برای ساخت برنامه چت به دو فایل مختلف نیازداریم که اولی به عنوان سرور server.py و دومی به عنوان کلاینتclient.py شناخته خواهند شد.

ایجاد سوکت سرور و اتصال به سرور

ابتدا می بایست در سرور یک سوکت روی پورت مورد نظر ایجاد کرده، شنود TCP را روی آن فعال کنیم و منتظر دریافت درخواست ایجاد کانکشن میمانیم. سپس با استفاده از دستور socket() یک سوکت ایجاد میکنیم.
چون قرار هست هر دو فایل روی یک سیستم اجرا شوند و خبری از دو سیستم با دو آدرس IP متفاوت نیست، آدرس مقصد را localhost یا آدرس 127.0.0.1 معرفی میکنیم؛ یعنی مقصد روی همین سیستم است.
import socket
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
s.bind(("localhost", 14200))
s.listen(1)
 
#Waiting For a Connection
connection, client = s.accept() 


همچنین در سمت مشتری (client) نیز یک سوکت ایجاد کرده و تلاش میکنیم تا به مقصد localhost و پورتی که در سرور تعریف کرده ایم (در اینجا 14200) متصل شویم.

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
#connectings.connect(("localhost", 14200))
 
هنگامی که سرور در حال اجرا و منتظر دریافت درخواست ایجاد ارتباط باشد و خط ششم قطعه کد فوق اجرا شود، یک ارتباط TCP بین دو برنامه ایجاد خواهد شد. پس از ایجاد شدن ارتباط، سرور که منتظر دریافت پیام بود، از حالت بلاک از روی خط نهم آزاد شده و ادامه کدها را اجرا میکند.

ارسال و دریافت پیام در شبکه

حال که ارتباط ما به سرور ایجاد شد، میخواهیم از طریق کلاینت پیامی به سرور ارسال کنیم. پس در ادامه ، اتصال کانکشن در سمت کلاینت را خواهیم داشت.
 message = "Hello"
s.send(message.encode())
 
 
همانطور که گفته شد، پیام ها بر روی سوکت ها به صورت byte ارسال میشوند و می بایست رشته متنی را با استفاده از تابع encode() به رشته ی بایتی تبدیل کنیم.
اگر بخواهیم پس از ان که پیام هایمان را به سرور ارسال کردیم، منتظر دریافت تایید از سمت سرور باشیم و پیام سرور را نیز دریافت کنیم این کار را بااستفاده از تابع recv()   به صورت زیر انجام میدهیم:
data = s.recv(32)
print(data.decode()) 
 
و در پایان، کانکشن ایجاد شده را خواهیم بست
#Connection Closed
s.Close()
 
 
برای دریافت و ارسال پیام در سمت سرور، به طور کاملاً مشابه عمل خواهیم کرد. یعنی در ادامه کدهای قبلی server.py، قطعه کدهای زیر را خواهیم نوشت
print(client, 'Connected')
 
data = connection.recv(32)
print('Received "' + data.decode() + '"')
 
connection.send("Message Received!".encode())
 
connection.close()

 

برای دریافت و ارسال پیام در سمت سرور، به طور کاملاً مشابه عمل خواهیم کرد. یعنی در ادامه کدهای قبلی server.py، قطعه کدهای زیر را خواهیم نوشت
print(client, 'Connected')
 
data = connection.recv(32)
print('Received "' + data.decode() + '"')
 
connection.send("Message Received!".encode())
 
connection.close()
در قطعه کد بالا، پس از برقراری کانکشن، اعلام میکنیم که یک کلاینت به سرور متصل شد و اطلاعات (آدرس IP و پورت) آن را چاپ میکنیم.
سپس منتظر دریافت پیام از کلاینت خواهیم ماند و پس از دریافت و چاپ پیام دریافت شده، پیام موفقیت آمیز بودن را برای  client  ارسال میکنیم.

کدهای سرور چت با پایتون:

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(("localhost", 14200))
s.listen(1)
 #Waiting For a Connection
connection, client = s.accept() 
print(client, 'Connected') 
data = connection.recv(32)
print('Received "' + data.decode() + '"') 
connection.send("Message Received!".encode()) 
connection.close()

 

کدهای کلاینت چت پایتون

import socket
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
#connecting
s.connect(("localhost", 14200))
 
message = "Hello"
s.send(message.encode())
 
data = s.recv(32)
print(data.decode())
 
#Connection Closed
s.close()

 

ماژول های برنامه نویسی تحت شبکه برای پایتون:

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

ماژول پایتون
شماره ی درگاه یا پورت
کاربرد و موارد استفاده پروتکل
httplib, urllib, xmlrpclib
80
برای اپلیکیشن های تحت وب/پروتکل ارسال اطلاعات بین
سرور، کلاینت
HTTP
nntplib
119
پروتکل دسترسی به گروه های خبری
NNTP

 

ftplib, urllib
20
انتقال فایل
FTP
smtplib
20
ارسال ایمیل
SMTP
poplib
110
واکشی ایمیل
POP3
imaplib
143
واکشی ایمیل
IMAP4

 


اشتراک گذاری


توضیحاتی در مورد نویسنده این مقاله :
مرضیه فتاحی مرضیه فتاحی

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


نظر بدهید

نشانی ایمیل شما منتشر نخواهد شد .
برای ارسال نظر نیاز است وارد سایت شوید. در صورت نداشتن حساب کاربری عضو شوید.

گروه مقالات


آموزشی
18
علمی
16
تحقیقاتی
22


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