Python HTTPServer 只响应我?

问题描述 投票:0回答:2

我实现了一个 python http 服务器,它只响应 get 请求,向我远程提供数据图,向我展示我的光伏系统在家中正在做什么。我注意到一些来自不属于我自己的 IP 地址的失败请求,并且希望将其锁定一点以拒绝来自不属于我的计算机的连接。

示例:如果有一种方法可以只响应来自我的 iPhone 的 MAC 地址的 GET 请求,并且不提供任何响应,这样该服务就不会被其他人检测到,那就太理想了。

问题 2:如果我使用 ctrl-c 退出此脚本,此代码是否会使某些内容继续运行,或者当我退出脚本时守护进程是否负责停止服务器?

这是我当前使用的代码。如果您对锁定此内容有任何想法、评论和建议,那就太棒了!

from http.server import HTTPServer, BaseHTTPRequestHandler, ThreadingHTTPServer
import threading

def load_binary(filename):
    with open(filename, 'rb') as file_handle:
        return file_handle.read()
        
class MyRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        if self.path == '/':
            os.system('python3 /home/pi/Plot_Generator_0_2.py')
            mimetype='image/png'
            self.send_response(200, 'OK')
            self.send_header('Content-type',mimetype)
            self.end_headers()
            self.wfile.write(load_binary('plot_image.png'))

if currentOS != "Windows":
    server = ThreadingHTTPServer(('192.168.0.122', 5555), MyRequestHandler)
    server_thread = threading.Thread(target=server.serve_forever)
    server_thread.daemon = True
    server_thread.start()
python security python-multithreading httpserver mac-address
2个回答
0
投票

问题1

在处理 HTTP 等应用程序级协议时,套接字通常不会暴露 MAC 地址等较低级别的网络详细信息。对 TCP/IP 标头的访问受到限制,因此在这一层无法直接进行 MAC 过滤。

要捕获此类详细信息,需要使用数据包捕获库(例如 WinPCap、libpcap)等专用软件在网络堆栈的较低级别进行操作。如果不仔细实施,这可能会带来巨大的复杂性和潜在的漏洞。它还使软件堆栈变得复杂,使管理和解决问题变得更具挑战性。

选项

请记住,这些示例未经测试,也未准备好用于生产,因此不应使用。如果您计划将此应用程序投入生产,请使用现有框架。

  1. IP 允许列表(客户端需要静态 IP)
class MyRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        client_ip, _ = self.client_address
        if client_ip not in ['192.168.0.122', '192.168.0.123', '127.0.0.1']:
            self.send_error(403)
            return
        ...
  1. HTTP 基本身份验证
class MyRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.headers.get('Authorization') == 'Basic ' + str(b64encode(('username:password').encode('utf-8')).decode('utf-8')):
            # Your existing code for handling GET requests
        else:
            self.send_response(401)
            self.send_header('WWW-Authenticate', 'Basic realm=\"Authorization required\"')
            self.end_headers()
            self.wfile.write(b'Authorization required.')

如果选择此路由,则应启用 HTTPS。否则此信息将是纯文本且不安全。


问题2

使用 ctrl-c 退出应该足以终止服务器及其所有线程,而不会留下任何运行的内容。


0
投票

您无法从 HTTP 请求中获取 MAC 地址,因为此信息不会传递到 HTTP 运行的应用程序层。

但是,如果您希望识别或区分设备,请考虑使用 cookie、会话或令牌来实现此目的。

对于第二个问题:是的,使用 ctrl-c 退出脚本也会停止服务器,并且退出后该脚本将不再运行任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.