有没有一种简单又安全的方法,可以用 python 显示带有访问者 IP 地址的错误页面?

有没有一种简单又安全的方法,可以用 python 显示带有访问者 IP 地址的错误页面?

Fail2ban 用于通过reject命令阻止特定模式下的用户。有时,尤其是当用户位于有大量用户的 NAT 后面时,他们会被无意中阻止。然后用户写一封电子邮件,然后我要求他的 IP 地址解除阻止(通常电子邮件会转发给我,所以我没有带有他的 IP 地址的邮件头)。

为了简化这一步,我想将他重定向到一个特殊的动态网页,该网页显示其 IP 地址和联系电子邮件。以下是一个例子:

在此处输入图片描述

我想要一个类似的网页。一个简单的解决方案是使用 php,但这需要安装 php 并进行一些网络服务器配置。因此,最简单的解决方案是使用一个小型网络服务器,它只为小段文本提供 IP 地址。

我考虑使用 python,因为 Python 已经安装好了。我找到了这篇文章https://www.anycodings.com/1questions/2464569/how-do-i-get-the-client-ip-address-on-a-python-server但它只会在标准输出上打印 IP 地址并提供文件。

据我所知,要像使用 php 一样简单地使用 python,需要 Flask 或 Django。但是,对于这个简单的用例来说,这些都是大型框架,而且规模过大。它们也可能意味着一些安全问题。此信息页面在设计上也应该是安全的,因此与reject方法相比不会产生任何可能的安全问题。我知道 DOS 更有可能是因为传输的数据比使用的数据多reject,但这个页面的大小非常小,所以这是可以接受的。

那么,这个任务的简单解决方案是什么?Python?如果可以,您能提示一些我可以搜索的关键字来完成这个任务吗?还有其他解决方案吗?也许这些比 Python 的想法更合适。

答案1

在这里找到解决方案https://pythonbasics.org/webserver/

所以基本上你只需要添加一行 self.wfile.write(bytes("<p>IP-Address: " + self.client_address[0] + "</p>", "utf-8")) client_address字段记录在这里https://docs.python.org/3/library/http.server.html#http.server.BaseHTTPRequestHandler.client_address

因此显示访问者 IP 地址的完整代码是:

from http.server import BaseHTTPRequestHandler, HTTPServer

listenAddress = "0.0.0.0"
serverPort = 8080

class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>https://pythonbasics.org</title></head>", "utf-8"))
        self.wfile.write(bytes("<p>Request: %s</p>" % self.path, "utf-8"))
        self.wfile.write(bytes("<body>", "utf-8"))
        self.wfile.write(bytes("<p>This is an example web server.</p>", "utf-8"))
        self.wfile.write(bytes("<p>IP-Address: " + self.client_address[0] + "</p>", "utf-8"))
        self.wfile.write(bytes("</body></html>", "utf-8"))

if __name__ == "__main__":        
    webServer = HTTPServer((listenAddress, serverPort), MyServer)
    print("Server started http://%s:%s" % (listenAddress, serverPort))

    try:
        webServer.serve_forever()
    except KeyboardInterrupt:
        pass

    webServer.server_close()
    print("Server stopped.")

相关内容