یک نکتهء امنیتی درمورد برنامه نویسی سوکت UDP

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

مثال:
برنامهء دریافت کنند:
import socket
import time

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 50007))
print('UDP Server is waiting for packets...')

while True:
data=s.recv(1000)
print("UDP data received.")

برنامهء ارسال کننده:
import socket

remoteAddr = ('localhost', 50007)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

data=b'x'*2000

while True:
input("hit Enter to send data...")
s.sendto(data, remoteAddr)
print("data sent.")

در این مثال ها، وقتی برنامهء ارسال کننده، دیتای ۲۰۰۰ بایتی رو ارسال میکنه، برنامهء دریافت کننده که حداکثر ۱۰۰۰ بایت دریافت میکنه دچار خطا میشه.
نکته: کدها به زبان پایتون (نسخهء ۳.۱) نوشته و تست شدن.

پس باید برای اینکه برنامه درصورت حمله یا ارسال تصادفی Packet های بزرگتر از حداکثر اندازهء Packet های نرمالی که خود برنامه دریافت میکنه متوقف نشه باید تمهید کرد.

آیا باید بافر دریافت رو روی حداکثر اندازهء ممکن برای Packet های UDP تنظیم کنیم و این حداکثر چقدر هست؟

یا اینکه بجای تنظیم بافر به حداکثر حجم ممکن برای Packet های UDP، باید کد دریافت دیتای سوکت رو در یک بلاک try – catch بذاریم و Exception خاص مربوطه رو هندل کنیم؟

حداکثر سایز پکت UDP رو هم که خودم تست کردم 65,507 بود که بعدا با مقالهء ویکیپدیا درمورد UDP چک کردم دیدم درسته:

The practical limit for the data length which is imposed by the underlying IPv4 protocol is 65,507 bytes (65,535 − 8 byte UDP header − 20 byte IP header)

البته این نتیجه روی سیستم لوکال هست که تست کردم و با محاسبهء تئوریک سازگار هست؛ در LAN باید محدودیت بیشتری وجود داشته باشه، و در اینترنت هم احتمالا محدودیت حجم از اینهم بیشتر هست. ولی بهرحال باید بدترین حالت رو درنظر گرفت و برنامه ممکنه بصورت لوکال یا حداقل از طریق LAN هم مورد حمله یا ارسال بسته های تصادفی قرار بگیره. البته چون من از روش try-catch استفاده کردم، دیگه نیازی به دونستن دقیق حداکثر سایز پکت هم نبود.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>