Lập trình mạng Python: giao thức UDP (phần 5)

Máy khách lẫn lộn và các trả lời không được chào đón

Chương trình client trong phần code trên thực sự nguy hiểm! Nếu bạn xe lại mã nguồn, bạn
sẽ thấy rằng mặc dù recvfrom() trả về địa chỉ của datagram đi đến, code không bao giờ check
địa chỉ nguồn của datagram nó nhận để thẩm định rằng nó thực sự là một trả lời từ server.
Bạn có thê thấy vấn đề này bằng cách trì hoãn trả lời của server và xem liệu ai đó khác có
thể gửi một trả lời cái client bản địa này tin cậy. Trên một hệ điều hành ít khả năng hơn như
Windows, bạn sẽ có thể phải thêm một lời gọi time.sleep() dài vào giữa nhận và gửi của server để
mô phỏng một server cái mất thời gian dài để trả lời. Trên Mac OS X và Linux, tuy nhiên, bạn có
thể đơn giản hơn nhiều treo server với Ctrl+Z một khi nó đã thiết lập socket của nó để mô phỏng
một server cái mất thời gian dài để trả lời.

$ python udp_local.py server
Listening at (‘127.0.0.1’, 1060)
^Z
[1] + 9370 suspended python udp_local.py server
$

Nếu bạn bây giờ chạy client, nó sẽ gửi datagram của nó và sau đó treo để chờ nhận một trả lời.

$ python udp_local.py client
The OS assigned me the address (‘0.0.0.0’, 39692)

Giả định rằng bạn bây giờ là một kẻ tấn công người muốn giả mạo một trả lời từ server bằng cách
nhảy vào và gửi datagram của bạn trước khi server có một cơ hội gửi trả lời của
bản thân nó. Vì client đã thông báo hệ điều hành rằng nó sẵn sàng nhận bất cứ datagram nào và không
thực hiện sanity checks lại kết quả, nó nên tin cậy reply giả đó của bạn trên thực tế khởi nguồn tại
server. Bạn có thể gửi gói dữ liệu như vậy sử dụng một session nhanh tại Python prompt.

$ python3
Python 3.4.0 (default, Apr 11 2014, 13:05:18)
[GCC 4.8.2] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import socket
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> sock.sendto(‘FAKE’.encode(‘ascii’), (‘127.0.0.1’, 39692))
4

Client sẽ ngay lập tức đi ra và vui vẻ biên dịch trả lời bên thứ ba này như là trả lời nó đang chờ cho.

The server (‘127.0.0.1’, 37821) replied ‘FAKE’

Bạn có thể chấm dứt server bây giờ bằng cách gõ fg để giã băng nó và để nó chạy (nó sẽ bây giờ thấy client
packet cái đã xếp hàng và chờ cho nó và sẽ gửi trả lời của nó tới client socket bây giờ bị đóng). Ấn Ctrl+C
như thường lệ để chấm dứt nó.

Chia sẻ

Leave a Reply

Your email address will not be published. Required fields are marked *