我正在开发套接字级别的服务器-客户端服务。我的服务器被随机数据包淹没。我需要一种区分好IP和坏IP的方法,但是我不知道所有好的IP,因此白名单/黑名单不起作用。
服务器管理所有客户端的列表,并将当前客户端队列通知所有客户端。当第一个客户端采取行动后,它将向服务器发送肯定答复,并且服务器将前进队列。可以扫描传入数据包数据的过滤器可以工作,但是我不确定是否可以捕获所有攻击(仅使用常规字母,“,”,“。”和数字,因为可能是有效的客户)。
今天我得到了这个控制台输出(对不起格式设置,并削减了异常,这个非常不错的网站认为以下是代码,希望我使用一些我无法解决的任意缩进,所以我只是删除了一些东西,直到它不再认为它是代码了
收听:4444
连接地址('198.108.67.48',53556)
我是:\ r \ n
收听:4444
连接地址:('198.108.67.48',62346)
我是:GET / HTTP / 1.1 \ r \ nHost
听4444
activeDisps [['198.108.67.48','\ r \ n'],['198.108.67.48','GET / HTTP / 1.1 \ r \ nHost']]
ValueError:以10为底的int()无效文字:'z \ xc2 \ x00 \ x00 \ xc0 / \ xc00 \ xc0 + \ xc0'
连接地址('198.108.67.48',7204)
我是\ x16 \ x03 \ x01 \ x00 \ x89 \ x01 \ x00 \ x00 \ x85 \ x03 \ x03 \ xcf \ xef \ x1f \ xea \ xe5 \ x11 \ x88 \ xba \ x86
听4444
activeDisps [['198.108.67.48','\ r \ n'],['198.108.67.48','GET / HTTP / 1.1 \ r \ nHost'],['198.108.67.48','\ x16 \ x03 \ x01 \ x00 \ x89 \ x01 \ x00 \ x00 \ x85 \ x03 \ x03 \ xcf \ xef \ x1f \ xea \ xe5 \ x11 \ x88 \ xba \ x86']]
答案 0 :(得分:1)
我为我找到了一个可行的解决方案:由于所有恶意数据包似乎都包含非字母数字字符,因此我可以对接收到的数据运行模式匹配,以确定其是否为有效客户端:
import re
pattern = re.compile("^([0-9]\*\w+[0-9]\*)+$")
while True:
clientName=''
conn, addr = myPorts[0].accept()
try:
data = conn.recv(BUFFER_SIZE)
dataStr=str(data)
nameStr=dataStr.split("'")[1]
clientName=nameStr.split(",")[0] #This is my own protocoll, might be different for you
except:
print("Connection failed")
if pattern.match(clientName):
listeningThread = threading.Thread(target=myListener, args=(conn, [addr[0], clientName]))
listeningThread.daemon = True
listeningThread.start()
else:
conn.close()