gpt4 book ai didi

c - 使本地 HTTP 服务器无法从外部访问

转载 作者:太空狗 更新时间:2023-10-29 12:10:33 26 4
gpt4 key购买 nike

我想在我的 Linux 机器上编写一个具有 HTTP 服务器功能的程序,以便它可以与我的浏览器交互以显示格式化输出等。

经过一些研究,我决定使用 libmicrohttpd .使用这个库很容易实现一个非常基本的服务器。基于tutorial ,下面的代码已经可以解决问题了。

#include <sys/types.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <string.h>
#include <microhttpd.h>
#include <stdio.h>

#define PORT 8888

static int
answer_to_connection(void *cls, struct MHD_Connection *connection,
const char *url, const char *method,
const char *version, const char *upload_data,
size_t *upload_data_size, void **con_cls)
{
const char *page = "<html><body>Hello, browser!</body></html>";
struct MHD_Response *response;
int ret;
response = MHD_create_response_from_buffer(strlen(page), (void*)page,
MHD_RESPMEM_PERSISTENT);
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
MHD_destroy_response(response);
return ret;
}


int main()
{
struct MHD_Daemon *daemon;
daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, PORT, NULL, NULL,
&answer_to_connection, NULL, MHD_OPTION_END);
if (NULL == daemon) return 1;
(void)getchar();
MHD_stop_daemon(daemon);
return 0;
}

现在我的问题是我不知道如何通过运行此服务器并让它提供真实数据来确保我不会意外地通过网络暴露我的任何数据。我对网络编程不是很有经验,在这种情况下我很难找到关于它的明确信息。

所以更准确地说,我的问题:我是否必须在上面的程序/我的系统/我的路由器中更改某些内容以确保打开的端口 8888 仅可见和可访问来自本地主机?

注意:用 libmicrohttpd 完成这个会很好,但不是绝对必要的。如果其他方法/库更安全,我准备尝试一下。

最佳答案

您应该使用 MHD_OPTION_SOCK_ADDR 仅绑定(bind)到 INADDR_LOOPBACK。这将确保您不会监听环回地址以外的任何内容,并保证没有外部机器可以连接。

修改后的代码如下所示

int main()
{
struct MHD_Daemon *daemon;
struct sockaddr_in loopback_addr;

memset(&loopback_addr, 0, sizeof(loopback_addr));
loopback_addr.sin_family = AF_INET;
loopback_addr.sin_port = htons(PORT);
loopback_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY,
PORT,
NULL,
NULL,
&answer_to_connection,
NULL,
MHD_OPTION_SOCK_ADDR, (struct sockaddr *)(&loopback_addr),
MHD_OPTION_END);

if (daemon == NULL) return 1;
(void)getchar();
MHD_stop_daemon(daemon);
return 0;
}

此外,man bind 将有助于了解如何绑定(bind)到要收听的地址。

您可以在运行服务器后运行 netstat -ln -tcp 来测试它。

关于c - 使本地 HTTP 服务器无法从外部访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46023399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com