http.server --- máy chủ HTTP¶
Source code: Lib/http/server.py
Mô-đun này xác định các lớp để triển khai máy chủ HTTP.
Cảnh báo
http.server không được khuyến khích sử dụng trong sản xuất. Nó chỉ thực hiện basic security checks.
sẵn có: not WASI.
Mô-đun này không hoạt động hoặc không có trên WebAssembly. Xem Nền tảng WebAssugging để biết thêm thông tin.
Một lớp, HTTPServer, là lớp con socketserver.TCPServer. Nó tạo và lắng nghe tại ổ cắm HTTP, gửi yêu cầu đến trình xử lý. Mã để tạo và chạy máy chủ trông như thế này:
def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
- class http.server.HTTPServer(server_address, RequestHandlerClass)¶
Lớp này xây dựng trên lớp
TCPServerbằng cách lưu trữ địa chỉ máy chủ dưới dạng các biến thể hiện có tên làserver_namevàserver_port. Trình xử lý có thể truy cập máy chủ, thường thông qua biến thể hiệnservercủa trình xử lý.
- class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)¶
Lớp này giống với HTTPServer nhưng sử dụng các luồng để xử lý các yêu cầu bằng cách sử dụng
ThreadingMixIn. Điều này rất hữu ích để xử lý các ổ cắm mở trước trình duyệt web, trên đóHTTPServersẽ đợi vô thời hạn.Added in version 3.7.
- class http.server.HTTPSServer(server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)¶
Lớp con của
HTTPServercó ổ cắm được bọc bằng mô-đunssl. Nếu mô-đunsslkhông có sẵn, việc khởi tạo đối tượngHTTPSServerkhông thành công vớiRuntimeError.Đối số certfile là đường dẫn đến tệp chuỗi chứng chỉ SSL và keyfile là đường dẫn đến tệp chứa khóa riêng.
Một password có thể được chỉ định cho các tệp được bảo vệ và gói bằng PKCS#8, nhưng hãy cẩn thận vì điều này có thể làm lộ mật khẩu được mã hóa cứng một cách rõ ràng.
Xem thêm
Xem
ssl.SSLContext.load_cert_chain()để biết thêm thông tin về các giá trị được chấp nhận cho certfile, keyfile và password.Khi được chỉ định, đối số alpn_protocols phải là một chuỗi các chuỗi chỉ định giao thức "Thương lượng giao thức lớp ứng dụng" (ALPN) được máy chủ hỗ trợ. ALPN cho phép máy chủ và máy khách đàm phán giao thức ứng dụng trong quá trình bắt tay TLS.
Theo mặc định, nó được đặt thành
["http/1.1"], nghĩa là máy chủ hỗ trợ HTTP/1.1.Added in version 3.14.
- class http.server.ThreadingHTTPSServer(server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)¶
Lớp này giống với
HTTPSServernhưng sử dụng các luồng để xử lý các yêu cầu bằng cách kế thừa từThreadingMixIn. Điều này tương tự với việcThreadingHTTPServerchỉ sử dụngHTTPSServer.Added in version 3.14.
HTTPServer, ThreadingHTTPServer, HTTPSServer và ThreadingHTTPSServer phải được cấp RequestHandlerClass khi khởi tạo, trong đó mô-đun này cung cấp ba biến thể khác nhau:
- class http.server.BaseHTTPRequestHandler(request, client_address, server)¶
Lớp này được sử dụng để xử lý các yêu cầu HTTP đến máy chủ. Bản thân nó không thể đáp ứng bất kỳ yêu cầu HTTP thực tế nào; nó phải được phân lớp con để xử lý từng phương thức yêu cầu (ví dụ:
'GET'hoặc'POST').BaseHTTPRequestHandlercung cấp một số biến lớp và phiên bản cũng như các phương thức để các lớp con sử dụng.Trình xử lý sẽ phân tích yêu cầu và tiêu đề, sau đó gọi một phương thức cụ thể cho loại yêu cầu. Tên phương thức được xây dựng từ yêu cầu. Ví dụ: đối với phương thức yêu cầu
SPAM, phương thứcdo_SPAM()sẽ được gọi mà không có đối số. Tất cả thông tin liên quan được lưu trữ trong các biến thể hiện của trình xử lý. Các lớp con không cần ghi đè hoặc mở rộng phương thức__init__().BaseHTTPRequestHandlercó các biến thể hiện sau:- client_address¶
Chứa một bộ có dạng
(host, port)đề cập đến địa chỉ của khách hàng.
- server¶
Chứa phiên bản máy chủ.
- close_connection¶
Boolean phải được đặt trước khi
handle_one_request()trả về, cho biết liệu có thể mong đợi một yêu cầu khác hay không hoặc liệu kết nối có nên bị tắt hay không.
- requestline¶
Chứa chuỗi biểu diễn của dòng yêu cầu HTTP. Việc kết thúc CRLF bị loại bỏ. Thuộc tính này phải được đặt bởi
handle_one_request(). Nếu không có dòng yêu cầu hợp lệ nào được xử lý thì nó sẽ được đặt thành chuỗi trống.
- command¶
Chứa lệnh (loại yêu cầu). Ví dụ:
'GET'.
- path¶
Chứa đường dẫn yêu cầu. Nếu có thành phần truy vấn của URL thì
pathsẽ bao gồm truy vấn đó. Sử dụng thuật ngữ RFC 3986,pathở đây bao gồmhier-partvàquery.
- request_version¶
Chứa chuỗi phiên bản từ yêu cầu. Ví dụ:
'HTTP/1.0'.
- headers¶
Giữ một thể hiện của lớp được chỉ định bởi biến lớp
MessageClass. Phiên bản này phân tích cú pháp và quản lý các tiêu đề trong yêu cầu HTTP. Hàmparse_headers()từhttp.clientđược sử dụng để phân tích các tiêu đề và nó yêu cầu yêu cầu HTTP cung cấp tiêu đề kiểu RFC 5322 hợp lệ.
- rfile¶
Luồng đầu vào
io.BufferedIOBase, sẵn sàng đọc từ đầu dữ liệu đầu vào tùy chọn.
- wfile¶
Chứa luồng đầu ra để viết phản hồi cho máy khách. Phải tuân thủ đúng giao thức HTTP khi ghi vào luồng này để đạt được khả năng tương tác thành công với các máy khách HTTP.
Thay đổi trong phiên bản 3.6: Đây là luồng
io.BufferedIOBase.
BaseHTTPRequestHandlercó các thuộc tính sau:- server_version¶
Chỉ định phiên bản phần mềm máy chủ. Bạn có thể muốn ghi đè lên điều này. Định dạng là nhiều chuỗi được phân tách bằng khoảng trắng, trong đó mỗi chuỗi có dạng name[/version]. Ví dụ:
'BaseHTTP/0.2'.
- sys_version¶
Chứa phiên bản hệ thống Python, ở dạng có thể sử dụng được bằng phương thức
version_stringvà biến lớpserver_version. Ví dụ:'Python/1.4'.
- error_message_format¶
Chỉ định một chuỗi định dạng sẽ được phương thức
send_error()sử dụng để xây dựng phản hồi lỗi cho máy khách. Chuỗi này được điền theo mặc định với các biến từresponsesdựa trên mã trạng thái được chuyển tớisend_error().
- error_content_type¶
Chỉ định tiêu đề HTTP Loại nội dung của các phản hồi lỗi được gửi tới máy khách. Giá trị mặc định là
'text/html'.
- protocol_version¶
Chỉ định phiên bản HTTP mà máy chủ tuân thủ. Nó được gửi dưới dạng phản hồi để cho khách hàng biết khả năng liên lạc của máy chủ đối với các yêu cầu trong tương lai. Nếu được đặt thành
'HTTP/1.1', máy chủ sẽ cho phép kết nối liên tục HTTP; tuy nhiên, máy chủ must của bạn sau đó sẽ bao gồm tiêu đềContent-Lengthchính xác (sử dụngsend_header()) trong tất cả các phản hồi của nó tới máy khách. Để tương thích ngược, cài đặt mặc định là'HTTP/1.0'.
- MessageClass¶
Chỉ định một lớp giống như
email.message.Message- để phân tích các tiêu đề HTTP. Thông thường, giá trị này không bị ghi đè và mặc định làhttp.client.HTTPMessage.
- responses¶
Thuộc tính này chứa ánh xạ các số nguyên mã lỗi tới các bộ hai phần tử chứa một thông báo ngắn và dài. Ví dụ:
{code: (shortmessage, longmessage)}. shortmessage thường được sử dụng làm phím message khi phản hồi lỗi và longmessage làm phím explain. Nó được sử dụng bởi các phương phápsend_response_only()vàsend_error().
Một phiên bản
BaseHTTPRequestHandlercó các phương thức sau:- handle()¶
Gọi
handle_one_request()một lần (hoặc, nếu kết nối liên tục được bật, nhiều lần) để xử lý các yêu cầu HTTP đến. Bạn không bao giờ cần phải ghi đè lên nó; thay vào đó, hãy triển khai các phương phápdo_*()thích hợp.
- handle_one_request()¶
Phương thức này sẽ phân tích cú pháp và gửi yêu cầu đến phương thức
do_*()thích hợp. Bạn không bao giờ cần phải ghi đè lên nó.
- handle_expect_100()¶
Khi máy chủ tuân thủ HTTP/1.1 nhận được tiêu đề yêu cầu
Expect: 100-continue, nó sẽ phản hồi lại bằng100 Continue, theo sau là tiêu đề200 OK. Phương thức này có thể bị ghi đè để gây ra lỗi nếu máy chủ không muốn máy khách tiếp tục. Ví dụ: máy chủ có thể chọn gửi417 Expectation Failedlàm tiêu đề phản hồi vàreturn False.Added in version 3.2.
- send_error(code, message=None, explain=None)¶
Gửi và ghi lại phản hồi lỗi hoàn chỉnh cho khách hàng. Số code chỉ định mã lỗi HTTP, với message là mô tả lỗi tùy chọn, ngắn gọn, dễ đọc của con người. Đối số explain có thể được sử dụng để cung cấp thông tin chi tiết hơn về lỗi; nó sẽ được định dạng bằng thuộc tính
error_message_formatvà được phát ra, sau một bộ tiêu đề hoàn chỉnh, làm nội dung phản hồi. Thuộc tínhresponsesgiữ các giá trị mặc định cho message và explain sẽ được sử dụng nếu không có giá trị nào được cung cấp; đối với các mã không xác định, giá trị mặc định cho cả hai là chuỗi???. Phần nội dung sẽ trống nếu phương thức là HEAD hoặc mã phản hồi là một trong những mã sau:1xx,204 No Content,205 Reset Content,304 Not Modified.Thay đổi trong phiên bản 3.4: Phản hồi lỗi bao gồm tiêu đề Độ dài nội dung. Đã thêm đối số explain.
- send_response(code, message=None)¶
Thêm tiêu đề phản hồi vào bộ đệm tiêu đề và ghi lại yêu cầu được chấp nhận. Dòng phản hồi HTTP được ghi vào bộ đệm bên trong, theo sau là các tiêu đề Server và Date. Các giá trị cho hai tiêu đề này được chọn tương ứng từ các phương thức
version_string()vàdate_time_string(). Nếu máy chủ không có ý định gửi bất kỳ tiêu đề nào khác bằng phương thứcsend_header()thì sau đósend_response()sẽ được gọi bằng lệnh gọiend_headers().Thay đổi trong phiên bản 3.3: Các tiêu đề được lưu vào bộ đệm bên trong và
end_headers()cần được gọi một cách rõ ràng.
- send_header(keyword, value)¶
Thêm tiêu đề HTTP vào bộ đệm bên trong sẽ được ghi vào luồng đầu ra khi
end_headers()hoặcflush_headers()được gọi. keyword phải chỉ định từ khóa tiêu đề, với value chỉ định giá trị của nó. Lưu ý rằng, sau khi thực hiện xong lệnh gọi send_header,end_headers()MUST BE được gọi để hoàn tất thao tác.Phương pháp này không từ chối đầu vào chứa chuỗi CRLF.
Thay đổi trong phiên bản 3.2: Tiêu đề được lưu trữ trong bộ đệm nội bộ.
- send_response_only(code, message=None)¶
Chỉ gửi tiêu đề phản hồi, được sử dụng cho các mục đích khi máy chủ gửi phản hồi
100 Continueđến máy khách. Các tiêu đề không được lưu vào bộ đệm và gửi trực tiếp luồng đầu ra. Nếu message không được chỉ định, thông báo HTTP tương ứng với phản hồi code sẽ được gửi.Phương pháp này không từ chối message chứa các chuỗi CRLF.
Added in version 3.2.
- end_headers()¶
Thêm một dòng trống (cho biết phần cuối của tiêu đề HTTP trong phản hồi) vào bộ đệm tiêu đề và gọi
flush_headers().Thay đổi trong phiên bản 3.2: Các tiêu đề đệm được ghi vào luồng đầu ra.
- flush_headers()¶
Cuối cùng gửi các tiêu đề đến luồng đầu ra và xóa bộ đệm tiêu đề bên trong.
Added in version 3.3.
- log_request(code='-', size='-')¶
Ghi lại một yêu cầu được chấp nhận (thành công). code phải chỉ định mã HTTP bằng số được liên kết với phản hồi. Nếu có sẵn kích thước của phản hồi thì nó sẽ được chuyển dưới dạng tham số size.
- log_error(...)¶
Ghi lại lỗi khi yêu cầu không thể được thực hiện. Theo mặc định, nó chuyển thông báo tới
log_message(), do đó, nó nhận các đối số giống nhau (format và các giá trị bổ sung).
- log_message(format, ...)¶
Ghi một tin nhắn tùy ý vào
sys.stderr. Điều này thường được ghi đè để tạo cơ chế ghi lỗi tùy chỉnh. Đối số format là chuỗi định dạng kiểu printf tiêu chuẩn, trong đó các đối số bổ sung cholog_message()được áp dụng làm đầu vào cho định dạng. Địa chỉ IP của máy khách và ngày giờ hiện tại được đặt trước cho mỗi tin nhắn được ghi lại.
- version_string()¶
Trả về chuỗi phiên bản của phần mềm máy chủ. Đây là sự kết hợp của thuộc tính
server_versionvàsys_version.
- date_time_string(timestamp=None)¶
Trả về ngày và giờ do timestamp cung cấp (phải là
Nonehoặc ở định dạng dotime.time()trả về), được định dạng cho tiêu đề thư. Nếu timestamp bị bỏ qua, nó sẽ sử dụng ngày và giờ hiện tại.Kết quả trông giống như
'Sun, 06 Nov 1994 08:49:37 GMT'.
- log_date_time_string()¶
Trả về ngày và giờ hiện tại, được định dạng để ghi nhật ký.
- address_string()¶
Trả về địa chỉ của khách hàng.
Thay đổi trong phiên bản 3.3: Trước đây, việc tra cứu tên đã được thực hiện. Để tránh sự chậm trễ trong việc phân giải tên, giờ đây nó luôn trả về địa chỉ IP.
- class http.server.SimpleHTTPRequestHandler(request, client_address, server, directory=None)¶
Lớp này phục vụ các tệp từ thư mục directory trở xuống hoặc thư mục hiện tại nếu directory không được cung cấp, ánh xạ trực tiếp cấu trúc thư mục tới các yêu cầu HTTP.
Thay đổi trong phiên bản 3.7: Đã thêm tham số directory.
Thay đổi trong phiên bản 3.9: Tham số directory chấp nhận path-like object.
Rất nhiều công việc, chẳng hạn như phân tích cú pháp yêu cầu, được thực hiện bởi lớp cơ sở
BaseHTTPRequestHandler. Lớp này thực hiện các hàmdo_GET()vàdo_HEAD().Sau đây được định nghĩa là thuộc tính cấp lớp của
SimpleHTTPRequestHandler:- server_version¶
Đây sẽ là
"SimpleHTTP/" + __version__, trong đó__version__được xác định ở cấp mô-đun.
- extensions_map¶
Hậu tố ánh xạ từ điển có các loại MIME, chứa các phần ghi đè tùy chỉnh cho ánh xạ hệ thống mặc định. Ánh xạ được sử dụng không phân biệt chữ hoa chữ thường và do đó chỉ nên chứa các phím viết thường.
Thay đổi trong phiên bản 3.9: Từ điển này không còn chứa các ánh xạ hệ thống mặc định mà chỉ chứa các phần ghi đè.
Lớp
SimpleHTTPRequestHandlerđịnh nghĩa các phương thức sau:- do_HEAD()¶
Phương thức này phục vụ loại yêu cầu
'HEAD': nó gửi các tiêu đề mà nó sẽ gửi cho yêu cầuGETtương đương. Xem phương phápdo_GET()để có giải thích đầy đủ hơn về các tiêu đề có thể có.
- do_GET()¶
Yêu cầu được ánh xạ tới một tệp cục bộ bằng cách diễn giải yêu cầu dưới dạng đường dẫn liên quan đến thư mục làm việc hiện tại.
Nếu yêu cầu được ánh xạ tới một thư mục, thư mục đó sẽ được kiểm tra tệp có tên
index.htmlhoặcindex.htm(theo thứ tự đó). Nếu tìm thấy, nội dung của tập tin sẽ được trả về; nếu không thì danh sách thư mục sẽ được tạo bằng cách gọi phương thứclist_directory(). Phương pháp này sử dụngos.listdir()để quét thư mục và trả về phản hồi lỗi404nếulistdir()không thành công.Nếu yêu cầu được ánh xạ tới một tệp, nó sẽ được mở. Bất kỳ ngoại lệ
OSErrornào khi mở tệp được yêu cầu đều được ánh xạ tới lỗi404,'File not found'. Nếu có tiêu đề'If-Modified-Since'trong yêu cầu và tệp không được sửa đổi sau thời gian này thì phản hồi304,'Not Modified'sẽ được gửi. Nếu không, loại nội dung sẽ được đoán bằng cách gọi phương thứcguess_type(), phương thức này sử dụng biến extensions_map và nội dung tệp được trả về.Tiêu đề
'Content-type:'với loại nội dung được đoán sẽ được xuất ra, theo sau là tiêu đề'Content-Length:'với kích thước của tệp và tiêu đề'Last-Modified:'với thời gian sửa đổi của tệp.Sau đó là một dòng trống biểu thị sự kết thúc của các tiêu đề và sau đó nội dung của tệp sẽ được xuất ra.
Ví dụ về cách sử dụng, hãy xem cách triển khai hàm
testtrong Lib/http/server.py.Thay đổi trong phiên bản 3.7: Hỗ trợ tiêu đề
'If-Modified-Since'.
Lớp SimpleHTTPRequestHandler có thể được sử dụng theo cách sau để tạo một máy chủ web rất cơ bản phục vụ các tệp liên quan đến thư mục hiện tại
nhập http.server
nhập khẩu máy chủ ổ cắm
PORT = 8000
Trình xử lý = http.server.SimpleHTTPRequestHandler
với socketserver.TCPServer(("", PORT), Handler) là httpd:
print("phục vụ tại cảng", PORT)
httpd.serve_forever()
SimpleHTTPRequestHandler cũng có thể được phân lớp để nâng cao hành vi, chẳng hạn như sử dụng các tên tệp chỉ mục khác nhau bằng cách ghi đè thuộc tính lớp index_pages.
- class http.server.CGIHTTPRequestHandler(request, client_address, server)¶
Lớp này được sử dụng để phục vụ các tệp hoặc đầu ra của tập lệnh CGI từ thư mục hiện tại trở xuống. Lưu ý rằng việc ánh xạ cấu trúc phân cấp HTTP sang cấu trúc thư mục cục bộ giống hệt như trong
SimpleHTTPRequestHandler.Ghi chú
Các tập lệnh CGI do lớp
CGIHTTPRequestHandlerchạy không thể thực thi chuyển hướng (mã HTTP 302), vì mã 200 (đầu ra tập lệnh theo sau) được gửi trước khi thực thi tập lệnh CGI. Điều này làm mất đi mã trạng thái.Tuy nhiên, lớp sẽ chạy tập lệnh CGI, thay vì phân phát nó dưới dạng tệp, nếu nó đoán đó là tập lệnh CGI. Chỉ sử dụng CGI dựa trên thư mục --- cấu hình máy chủ phổ biến khác coi các phần mở rộng đặc biệt là biểu thị các tập lệnh CGI.
Các hàm
do_GET()vàdo_HEAD()được sửa đổi để chạy các tập lệnh CGI và phân phát đầu ra, thay vì phân phối các tệp, nếu yêu cầu dẫn đến một nơi nào đó bên dưới đường dẫncgi_directories.CGIHTTPRequestHandlerxác định thành viên dữ liệu sau:- cgi_directories¶
Giá trị mặc định này là
['/cgi-bin', '/htbin']và mô tả các thư mục được coi là chứa tập lệnh CGI.
Zz000zz định nghĩa phương thức sau:
- do_POST()¶
Phương thức này phục vụ loại yêu cầu
'POST', chỉ được phép đối với tập lệnh CGI. Lỗi 501, "Chỉ có thể chuyển POST sang tập lệnh CGI", xuất hiện khi cố gắng chuyển POST sang url không phải CGI.
Lưu ý rằng tập lệnh CGI sẽ được chạy với UID của người dùng không ai vì lý do bảo mật. Các vấn đề với tập lệnh CGI sẽ được chuyển thành lỗi 403.
Không được dùng nữa kể từ phiên bản 3.13, sẽ bị xóa trong phiên bản 3.15:
CGIHTTPRequestHandlersẽ bị xóa trong phiên bản 3.15. CGI đã không được coi là một cách tốt để làm mọi việc trong hơn một thập kỷ qua. Mã này đã không được bảo trì trong một thời gian và có rất ít ứng dụng thực tế. Việc giữ lại nó có thể dẫn đến security considerations hơn nữa.
Giao diện dòng lệnh¶
http.server cũng có thể được gọi trực tiếp bằng cách sử dụng khóa chuyển -m của trình thông dịch. Ví dụ sau minh họa cách phân phát các tệp liên quan đến thư mục hiện tại:
python -m http.server [OPTIONS] [cổng]
Các tùy chọn sau được chấp nhận:
- port¶
Máy chủ nghe cổng 8000 theo mặc định. Giá trị mặc định có thể được ghi đè bằng cách chuyển số cổng mong muốn làm đối số:
python -m http.server 9000
- -b, --bind <address>¶
Chỉ định một địa chỉ cụ thể mà nó sẽ liên kết. Cả hai địa chỉ IPv4 và IPv6 đều được hỗ trợ. Theo mặc định, máy chủ tự liên kết với tất cả các giao diện. Ví dụ: lệnh sau khiến máy chủ chỉ liên kết với localhost:
python -m http.server --bind 127.0.0.1
Added in version 3.4.
Thay đổi trong phiên bản 3.8: Hỗ trợ IPv6 trong tùy chọn
--bind.
- -d, --directory <dir>¶
Chỉ định một thư mục mà nó sẽ phục vụ các tập tin. Theo mặc định, máy chủ sử dụng thư mục hiện tại. Ví dụ: lệnh sau sử dụng một thư mục cụ thể:
python -m http.server --directory /tmp/
Added in version 3.7.
- -p, --protocol <version>¶
Chỉ định phiên bản HTTP mà máy chủ tuân thủ. Theo mặc định, máy chủ tuân theo HTTP/1.0. Ví dụ: lệnh sau chạy máy chủ tuân thủ HTTP/1.1:
python -m http.server --protocol HTTP/1.1
Added in version 3.11.
- --cgi¶
CGIHTTPRequestHandlercó thể được kích hoạt trong dòng lệnh bằng cách chuyển tùy chọn--cgipython -m http.server --cgi
Không được dùng nữa kể từ phiên bản 3.13, sẽ bị xóa trong phiên bản 3.15: Dòng lệnh
http.serverhỗ trợ--cgiđang bị xóa vìCGIHTTPRequestHandlerđang bị xóa.
Cảnh báo
CGIHTTPRequestHandler và tùy chọn dòng lệnh --cgi không dành cho các máy khách không đáng tin cậy và có thể dễ bị khai thác. Luôn sử dụng trong môi trường an toàn.
- --tls-cert¶
Chỉ định chuỗi chứng chỉ TLS cho các kết nối HTTPS:
python -m http.server --tls-cert fullchain.pem
Added in version 3.14.
- --tls-key¶
Chỉ định tệp khóa riêng cho các kết nối HTTPS.
Tùy chọn này yêu cầu phải chỉ định
--tls-cert.Added in version 3.14.
- --tls-password-file¶
Chỉ định tệp mật khẩu cho các khóa riêng được bảo vệ bằng mật khẩu:
python -m http.server \ --tls-cert cert.pem \ --tls-key key.pem \ --tls-password-file pass.txt
Tùy chọn này yêu cầu phải chỉ định
--tls-cert.Added in version 3.14.
Cân nhắc về bảo mật¶
SimpleHTTPRequestHandler sẽ đi theo các liên kết tượng trưng khi xử lý các yêu cầu, điều này giúp các tệp bên ngoài thư mục được chỉ định có thể được phân phát.
Các phương thức BaseHTTPRequestHandler.send_header() và BaseHTTPRequestHandler.send_response_only() giả sử đầu vào đã được chọn lọc và không thực hiện xác thực đầu vào, chẳng hạn như kiểm tra sự hiện diện của chuỗi CRLF. Đầu vào không đáng tin cậy có thể dẫn đến các cuộc tấn công tiêm tiêu đề HTTP.
Các phiên bản trước của Python không xóa các ký tự điều khiển khỏi thông điệp tường trình được phát tới stderr từ python -m http.server hoặc triển khai BaseHTTPRequestHandler .log_message mặc định. Điều này có thể cho phép các máy khách từ xa kết nối với máy chủ của bạn gửi mã kiểm soát bất chính đến thiết bị đầu cuối của bạn.
Thay đổi trong phiên bản 3.12: Các ký tự điều khiển được xóa trong nhật ký stderr.