fix(libhttp): 服务器读超时防 Slowloris (P1-4)
- 新增 setHeaderTimeout()(default 10s) / setReadTimeout()(default 30s),对齐 WAF - doSSLHandshake 设置头超时覆盖握手,doRead 拆分为 async_read_header (头超时) + async_read (体超时) - doWsRead 每次读取设置空闲超时,自动清理长期空闲连接 - 更新审计文档 P1-4 状态、README v3.4.2
This commit is contained in:
1 parent
507054c4b2
commit
37c6d401d6
6 files changed
+64
-4
No files matched your search
@@ -167,6 +167,13 @@ void HttpServer::Session::doSSLHandshake() {
|
||||
std::cout << "[SSL] Starting handshake for "
|
||||
<< remote_ip_ << ":" << remote_port_ << std::endl;
|
||||
|
||||
// P1-4:设置头超时(TCP 连接完成后,覆盖 SSL 握手 + 请求头读取)
|
||||
if (ssl_enabled_ && ssl_stream_) {
|
||||
ssl_stream_->next_layer().expires_after(server_->getHeaderTimeout());
|
||||
} else {
|
||||
stream_.expires_after(server_->getHeaderTimeout());
|
||||
}
|
||||
|
||||
ssl_stream_->async_handshake(
|
||||
asio::ssl::stream_base::server,
|
||||
[self](beast::error_code ec) {
|
||||
@@ -193,6 +200,37 @@ void HttpServer::Session::doRead() {
|
||||
parser_.emplace();
|
||||
parser_->body_limit(server_->max_body_size_);
|
||||
|
||||
// P1-4:阶段1 读请求头(头超时,防 Slowloris)
|
||||
if (ssl_enabled_ && ssl_stream_) {
|
||||
ssl_stream_->next_layer().expires_after(server_->getHeaderTimeout());
|
||||
} else {
|
||||
stream_.expires_after(server_->getHeaderTimeout());
|
||||
}
|
||||
|
||||
auto on_header = [self](beast::error_code ec, std::size_t) {
|
||||
if (ec) {
|
||||
self->handleRead(ec);
|
||||
return;
|
||||
}
|
||||
// 阶段2 读请求体:切换到体超时
|
||||
if (self->ssl_enabled_ && self->ssl_stream_) {
|
||||
self->ssl_stream_->next_layer().expires_after(self->server_->getReadTimeout());
|
||||
} else {
|
||||
self->stream_.expires_after(self->server_->getReadTimeout());
|
||||
}
|
||||
self->doReadBody();
|
||||
};
|
||||
|
||||
if (ssl_enabled_ && ssl_stream_) {
|
||||
http::async_read_header(*ssl_stream_, buffer_, *parser_, on_header);
|
||||
} else {
|
||||
http::async_read_header(stream_, buffer_, *parser_, on_header);
|
||||
}
|
||||
}
|
||||
|
||||
void HttpServer::Session::doReadBody() {
|
||||
auto self = shared_from_this();
|
||||
|
||||
auto on_read = [self](beast::error_code ec, std::size_t) {
|
||||
if (!ec) self->request_ = self->parser_->release();
|
||||
self->handleRead(ec);
|
||||
|
||||
Reference in new issue
Block a user