我正在用python编写自己的服务器,它从客户机获取数据,我在网上读到客户机在发送到服务器时屏蔽了它的数据。我已经搞定了握手的全部内容,但我还没有找到一个能解开数据包掩码的代码。我找到了一个代码,声称可以做到这一点,但它对我来说不起作用。是否有现成的功能或软件包可以做到这一点?任何帮助都将不胜感激。在
下面是我的代码:
# -----------------LISTEN FOR INCOMING DATA FUNCTION----------------- #
def listening_for_msgs(conn):
while True:
try:
rcv_msg = conn.recv(1024) #conn is the connection to the client
rcv_msg_str = str(rcv_msg[:].decode("utf-8"))
rcv_msg_list = rcv_msg_str.split('\r\n')
if rcv_msg_list[0] == 'GET /echo HTTP/1.1':
HandshakeThread = startHandshakeThread(rcv_msg_str, conn)
HandshakeThread.start()
else:
print(unmask_data(rcv_msg))
except UnicodeDecodeError:
unmask_data(rcv_msg)
# -----------------UNMASKING CLIENTS PACKET FUNCTION----------------- #
def unmask_data(rcv_msg):
# as a simple server, we expect to receive:
# - all data at one go and one frame
# - one frame at a time
# - text protocol
# - no ping pong messages
data = bytearray(rcv_msg)
if len(data) < 6:
raise Exception("Error reading data")
# FIN bit must be set to indicate end of frame
assert(0x1 == (0xFF & data[0]) >> 7)
# data must be a text frame
# 0x8 (close connection) is handled with assertion failure
assert(0x1 == (0xF & data[0]))
# assert that data is masked
assert(0x1 == (0xFF & data[1]) >> 7)
datalen = (0x7F & data[1])
# print("received data len %d" %(datalen,))
str_data = ''
if datalen > 0:
mask_key = data[2:6]
masked_data = data[6:(6 + datalen)]
unmasked_data = [masked_data[i] ^ mask_key[i % 4] for i in range(len(masked_data))]
str_data = str(bytearray(unmasked_data))
return str_data
我建议你再读一遍,也许可以使用更多的资源。您将普通web请求与WebSocket连接的代码思想混合在一起。屏蔽仅与WebSocket连接相关。描述WebSockets掩蔽是如何工作的,如何从web请求建立WebSocket连接,以及为什么WebSockets与普通sockets不同等等对于这个问题来说太宽泛了。如果您想快速得到结果,请使用existing libraries。如果您想了解如何编写自己的代码,请阅读specification for WebSockets或研究现有库的源代码。在
相关问题 更多 >
编程相关推荐