0

我有一个获取命令并在 python 中返回答案的服务器示例:

import socket
import time
import random

CommandDict = {"TIME" : time.strftime("%d-%m-%Y"),"NAME": "Ori","RANDOM": str(random.randint(0,10))}
server_socket = socket.socket()
server_socket.bind(('127.0.0.1',8820))
server_socket.listen(5)

while True:
    print "Waiting for commands"
    (client_socket, client_address) = server_socket.accept()
    client_data = client_socket.recv(1024)
    print "GOT COMMAND FROM " + client_address[0] + " : " + client_data
    try:
        client_socket.send(CommandDict[client_data])
    except Exception:
        client_socket.send("ERROR!")

    client_socket.close()

server_socket.close()

我尝试对它进行同步洪水攻击,但它崩溃了。我想保护它免受同步洪水攻击,我该怎么做?我是套接字编程的新手,所以我很乐意得到一些建议^_^

4

1 回答 1

1

首先你需要一个更好的服务器。正如@Nikolai N Fetlissov 指出的那样,您正在泄漏文件描述符,因为您从未关闭客户端连接。

查看此示例以了解如何避免此泄漏:

http://ilab.cs.byu.edu/python/socket/echoserver.html

特别要注意client.close()调用的位置和缩进级别。

接下来,您的代码只处理来自客户端的一个命令。看看这里:

http://code.activestate.com/recipes/578247-basic-threaded-python-tcp-server/

讨论编写可以处理多个连接和来自每个连接的多个命令的线程服务器。

最后,用户空间、基于套接字的程序(更重要的是,用解释语言编写)太慢了,无法以任何方式处理真正的 SYN 洪水。标准方法是为此使用防火墙软件(以及在一定余量后使用硬件)。

于 2014-12-12T18:39:14.510 回答