by Guest » 03 Jan 2025, 14:04
Mir ist bekannt, dass das Python-http.server-Modul hauptsächlich zu Testzwecken konzipiert wurde, da es bei seiner Implementierung einige bekannte Sicherheitsprobleme gibt.
Das heißt, Für ein sehr bescheidenes persönliches Projekt habe ich meine eigene Klasse implementiert, abgeleitet von http.server.BaseHTTPRequestHandler, wobei ich die Methode do_GET überschreibe. Alles funktionierte ordnungsgemäß, bis ich die Python-Version auf 3.12 aktualisiert habe: Es scheint, dass diese Version auch einige Änderungen am SSL-Modul mit sich brachte und ich daher den Code ein wenig umgestalten musste.
Diesbezüglich ist dies der komprimierte Inhalt der Datei main.py:
Code: Select all
# ...here are import statements and other functions...
class RequestHandler(BaseHTTPRequestHandler):
# ...here the other methods are defined...
def do_GET(self):
resobj = self._manage_get_request()
self.send_response(resobj.status_code)
self._send_headers(resobj.headers)
self._send_body(resobj.body)
def main():
print('Running http server...')
address = (_HTTP_SERV_ADDR, _HTTP_SERV_PORT)
httpd = HTTPServer(address, RequestHandler)
if not _DEBUG_ENABLED:
print('Enabling TLS protocol...')
context = _ssl.SSLContext(_ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile=_CERTIFICATE_FILE_PATH,
keyfile=_KEY_FILE_PATH)
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
print(f'Server is listening ({httpd.server_address[0]}:{httpd.server_port})...')
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
print('Shutting down http server...')
httpd.server_close()
Wenn das Debug aktiviert ist und daher der Codeteil im Zusammenhang mit HTTPS übersprungen wird, funktioniert der Server ordnungsgemäß. Wenn stattdessen das Debug deaktiviert ist, scheint der Server auch gut zu funktionieren, aber nach einigen Stunden reagiert er nicht mehr: Alle Verbindungsanfragen laufen ab.
Könnte mir jemand von euch welche zur Verfügung stellen? Hinweise, was überprüft werden muss, um besser zu verstehen, was vor sich geht und warum?
Weitere Informationen zur Implementierung
Während send_response bereits in definiert ist BaseHTTPRequestHandler, die anderen in do_GET aufgerufenen Methoden sind in meiner Implementierung definiert. Insbesondere:
- ist eine Art if-Anweisung zur ordnungsgemäßen Verwaltung der Anfrage unter Berücksichtigung der über die Abfrage bereitgestellten Parameter; Es gibt ein benutzerdefiniertes Antwortobjekt mit Code, Headern und Text zurück
- ist im Grunde ein Wrapper der Methode send_header der übergeordneten Klasse
- schreibt einfach den Antworttext in den Socket-Puffer
Mir ist bekannt, dass das Python-http.server-Modul hauptsächlich zu Testzwecken konzipiert wurde, da es bei seiner Implementierung einige bekannte Sicherheitsprobleme gibt.
Das heißt, Für ein sehr bescheidenes persönliches Projekt habe ich meine eigene Klasse implementiert, abgeleitet von http.server.BaseHTTPRequestHandler, wobei ich die Methode do_GET überschreibe. Alles funktionierte ordnungsgemäß, bis ich die Python-Version auf 3.12 aktualisiert habe: Es scheint, dass diese Version auch einige Änderungen am SSL-Modul mit sich brachte und ich daher den Code ein wenig umgestalten musste.
Diesbezüglich ist dies der komprimierte Inhalt der Datei main.py:
[code]# ...here are import statements and other functions...
class RequestHandler(BaseHTTPRequestHandler):
# ...here the other methods are defined...
def do_GET(self):
resobj = self._manage_get_request()
self.send_response(resobj.status_code)
self._send_headers(resobj.headers)
self._send_body(resobj.body)
def main():
print('Running http server...')
address = (_HTTP_SERV_ADDR, _HTTP_SERV_PORT)
httpd = HTTPServer(address, RequestHandler)
if not _DEBUG_ENABLED:
print('Enabling TLS protocol...')
context = _ssl.SSLContext(_ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile=_CERTIFICATE_FILE_PATH,
keyfile=_KEY_FILE_PATH)
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
print(f'Server is listening ({httpd.server_address[0]}:{httpd.server_port})...')
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
print('Shutting down http server...')
httpd.server_close()
[/code]
Wenn das Debug aktiviert ist und daher der Codeteil im Zusammenhang mit HTTPS übersprungen wird, funktioniert der Server ordnungsgemäß. Wenn stattdessen das Debug deaktiviert ist, scheint der Server auch gut zu funktionieren, aber nach einigen Stunden reagiert er nicht mehr: Alle Verbindungsanfragen laufen ab.
Könnte mir jemand von euch welche zur Verfügung stellen? Hinweise, was überprüft werden muss, um besser zu verstehen, was vor sich geht und warum?
[b]Weitere Informationen zur Implementierung[/b]
Während send_response bereits in definiert ist BaseHTTPRequestHandler, die anderen in do_GET aufgerufenen Methoden sind in meiner Implementierung definiert. Insbesondere:
[list]
[*][code]_manage_get_request[/code] ist eine Art if-Anweisung zur ordnungsgemäßen Verwaltung der Anfrage unter Berücksichtigung der über die Abfrage bereitgestellten Parameter; Es gibt ein benutzerdefiniertes Antwortobjekt mit Code, Headern und Text zurück
[*][code]_send_headers[/code] ist im Grunde ein Wrapper der Methode send_header der übergeordneten Klasse
[*][code]_send_body[/code] schreibt einfach den Antworttext in den Socket-Puffer
[/list]