ورود

View Full Version : روش جلوگیری از حمله یا اختلال بوسیلهء Packet های بزرگ



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

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

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

یا اینکه میگید بجای تنظیم بافر به حداکثر حجم ممکن برای Packet های UDP، باید کد دریافت دیتای سوکت رو در یک بلاک try - catch بذارم و 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.")

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

razeghi_loved
یک شنبه 26 دی 1389, 11:11 صبح
حداکثر پکت 1500 می باشد من نمی دونم باید چی کار کرد خوب تیکه تیکه ارسال کن

eshpilen
یک شنبه 26 دی 1389, 11:47 صبح
نه، پکت های برنامهء بنده خیلی کوچکتر از این حرفا هستن. بنده در فکر جلوگیری از توقف برنامه موقعی که یک پکت ناشناختهء حجیم بعلت حملهء خارجی یا تصادف به آدرس و پورت برنامه ارسال میشه بودم. دست آخر به این نتیجه رسیدم که استفاده از بلاک 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 استفاده کردم، دیگه نیازی به دونستن دقیق حداکثر سایز پکت هم نبود.