یک کلاینت WebSocket ساده در پایتون بنویسید که handshake HTTP را دستی ارسال کرده و هدرهای پاسخ سرور را خوانده و مقدار Sec-WebSocket-Accept را اعتبارسنجی کند.

5.0 بازدید آخرین ویرایش در 223 روز قبل ساعت 01:03

0.0

در این تمرین از ماژول‌های استاندارد socket، base64، hashlib و os استفاده کنید: یک سوکت TCP به میزبان و پورت (مثلاً پورت 80 یا 443 بسته به سرور) باز کنید، یک درخواست GET با هدرهای لازم برای ارتقاء به WebSocket (از جمله "Upgrade: websocket"، "Connection: Upgrade"، "Sec-WebSocket-Key" که از 16 بایت تصادفی به صورت base64 ساخته می‌شود، و "Sec-WebSocket-Version: 13") با CRLF ("\r\n") ارسال کنید و پس از دریافت هدرهای پاسخ تا انتهای "\r\n\r\n" آن‌ها را پارس کنید. مقدار Sec-WebSocket-Accept دریافتی را با مقدار محاسبه‌شده بر اساس GUID استاندارد "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" (base64(sha1(sec_key + GUID))) مقایسه کنید تا handshake معتبر بودن را بررسی نمایید. نکته‌ها: از فرمت CRLF برای پایان خطوط استفاده کنید، تا دریافت هدرها loop کنید تا به "\r\n\r\n" برسید و برای تولید Sec-WebSocket-Key از os.urandom و base64.b64encode استفاده کنید.

توسط پژوهشگر در 223 روز قبل ساعت 01:03
دسته بندی ها: Python Python for beginner
reyhaneh در 223 روز قبل ساعت 14:50

نکته کلیدی اینکه اگر به پورت 443 وصل می‌شوید باید TLS را با استفاده از ssl.wrap_socket فعال کنید؛ در غیر این صورت به یک ارتباط غیر TLS دسترسی دارید. برای خواندن هدرها تا انتهای '\r\n\r\n' از حلقه خواندن استفاده کنید و مطمئن شوید که خطوط با CRLF پایان می‌یابند. Sec-WebSocket-Key را با os.urandom(16) تولید کنید، آن را با base64.b64encode به رشته ASCII تبدیل کرده و در درخواست بگنجانید. برای اعتبارسنجی، مقدار Sec-WebSocket-Accept دریافتی را با نتیجه base64(sha1(key + GUID)) مقایسه کنید؛ توجه کنید که کلید hashing همان Sec-WebSocket-Key ارسال‌شده است و GUID استاندارد را به انتهای آن اضافه می‌کنید.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری