提问人:Kenglaze 提问时间:10/9/2023 更新时间:10/9/2023 访问量:43
Python HTTPServer 只响应我?
Python HTTPServer that only responds to me?
问:
我实现了一个python http服务器,它只响应获取请求,以远程向我提供数据图,向我展示我的光伏系统在家中做什么。我注意到一些来自不属于我自己的 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()
答:
第1项质询
在处理应用程序级协议(如 HTTP)时,套接字通常不会公开较低级别的网络详细信息,例如 MAC 地址。对 TCP/IP 标头的访问受到限制,因此在此层无法直接进行 MAC 过滤。
为了捕获这些细节,需要使用专门的软件,如数据包捕获库(例如,WinPCap、libpcap)在网络堆栈的较低级别运行。如果不仔细实施,这可能会带来巨大的复杂性和潜在的漏洞。它还使软件堆栈复杂化,使管理和解决问题更具挑战性。
选项
请记住,这些示例没有经过测试,也没有用于生产,不应这样使用。如果您计划将此应用程序投入生产,请使用现有框架。
- 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
...
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 退出应该足以终止服务器及其所有线程,而不会让任何线程保持运行。
评论
您无法从 HTTP 请求中获取 MAC 地址,因为此信息不会传递到 HTTP 运行的应用程序层。
但是,如果您希望识别或区分设备,请考虑使用 Cookie、会话或令牌来实现此目的。
对于第二个问题:是的,使用 ctrl-c 退出脚本也会停止服务器,并且退出后此脚本不会有任何运行。
上一个:AWS 保护 Websocket
评论