Python:仅接受具有身份验证的套接字

2024-09-27 21:26:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试学习如何使用套接字在本地网络上的PC之间发送文件

我在我的“服务器”上使用ubuntu,我最初的计划是创建一个ufw规则,允许所有LAN连接,但在接受套接字连接时要求输入密码。这样,只有真正应该与服务器通信的设备才会被接受

我意识到为静态IP创建ufw规则将是一种选择,但不幸的是,我正在处理动态IP

我在“服务器”上有一个包含允许密钥的文本文件,在“客户端”上有一个包含一个身份验证密钥的文本文件

服务器脚本如下所示:

#!/usr/bin/env python3

import socket

with open('/path/to/allowedKeys') as f:
    allowedKeys = []
    for line in f:
        allowedKeys.append(line.rstrip('\n'))

HOST = '127.0.0.1' #standard loopback interface address (localhost)
PORT = 9999

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((HOST, PORT))
serversocket.listen()
(clientsocket, address) = serversocket.accept()
with clientsocket:
    print('Connected by', address)
    while True:
        data = clientsocket.recv(1024)
        data = data.decode(encoding="utf-8")
        print('Received', repr(data))
        if data in allowedKeys:
            clientsocket.sendall(b'Thank you for logging in.')
            clientsocket.shutdown(socket.SHUT_RDWR)
            break
        else:
            clientsocket.sendall(b'Error: Failed authentication')
            clientsocket.shutdown(socket.SHUT_RDWR)
            break
   

客户端脚本如下所示:

#!/usr/bin/env python3

import socket

with open('/path/to/authenticationKey', 'r') as f: #read authenticationKey from textfile
    authenticationKey = f.readline().rstrip('\n')

authenticationKey = bytes(authenticationKey, encoding="utf-8") #convert authenticationKey to bytes
#authenticationKey = bytes('wrongKey', encoding="utf-8") #wrong Key for testing

HOST = '127.0.0.1'  #server hostname or IP address
PORT = 9999         #port used by the server

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(authenticationKey)
data = s.recv(1024)
s.shutdown(socket.SHUT_RDWR)
s.close()

print('Received', repr(data))

当我执行脚本时,看起来一切都像预期的那样工作。 我也有

Received 'nhjp9NIin987BUHBlkuULK98zJKn98JH'

Received 'wrongKey'

并且服务器成功关闭

我已经研究了这两个相关问题:

socket accept only specific addresses?

Server socket - accept connections only from IP addresses in the whitelist

虽然我不能通过IP进行过滤,但似乎必须首先接受连接才能对客户端进行身份验证

我只希望拥有允许密钥的设备能够与服务器通信。应关闭所有其他连接

由于我的知识仍然非常有限,我想知道这是否是一条路要走,或者这是否会让我面临任何漏洞


Tags: inip服务器host客户端dataportaddress
1条回答
网友
1楼 · 发布于 2024-09-27 21:26:20

While I cannot filter by IP it seems as if one must first accept the connection in order to authenticate the client. I only want devices that possess an allowed key ..

由于您希望根据实际数据(密钥或密钥拥有证明)对客户机进行身份验证,因此必须首先建立能够从客户机传输数据的连接。对于TCP,这意味着您必须接受连接

... whether this leaves me open to any vulnerabilities.

这是通常的做法,但它会让您面临拒绝服务攻击。创建新连接需要资源,因此通过打开大量连接,攻击者可以耗尽服务器资源。如果以这种方式耗尽所有资源,则即使有效用户也无法再访问服务器。例如,请参见SYN flood攻击

根据客户端的设置,可以添加其他保护。但这些都超出了python应用程序的范围,并且大部分都超出了这个问题的范围。但要想了解一些想法,请参阅维基百科文章中有关对策的部分

相关问题 更多 >

    热门问题