【发布时间】:2020-09-08 15:44:21
【问题描述】:
我正在编写一个使用 C 套接字的应用程序。我对send() 和recv() 都进行了一些检查(请参阅下面的代码),但我不确定它们是否就足够了。应该执行哪些其他检查来保护 C 套接字的安全编码?
ssize_t nbytes;
void send_stuff(int socket_fd, TYPE stuff, size_t EXP_BYTES){
nbytes = send(socket_fd, (void*)stuff, EXP_BYTES, 0);
if(nbytes < 0){
fprintf(stderr, "Error in sending stuff from socket %d. Error: %s\n", socket_fd, strerror(errno));
exit(1);
}
if((unsigned long) nbytes < EXP_BYTES){
fprintf(stderr, "Stuff not entirely sent on socket %d. Error: %s\n", socket_fd, strerror(errno));
exit(1);
}
}
recv() 也一样,比照了
【问题讨论】:
-
取决于“安全”的含义。您的代码与安全性无关,只是一种理智。
-
是的,它有。但是机密性、完整性、身份验证等不在我的问题范围之内。我指的是代码清理以消除其可能的漏洞
-
计算机只做你告诉它的事情。你不必告诉它不要做错事。你只需要不要告诉它做错事。大多数“不安全代码”都是一个错误,程序员告诉计算机要做的事情是愚蠢的。例如,在这里你告诉它如果没有一次性发送整个消息就放弃。因此,攻击者可以通过故意建立慢速连接来使您的程序崩溃。这是你想要的吗?
-
没有“删除可能的漏洞”。有漏洞,也有没有漏洞的代码。可能的漏洞列表很有用,因此您可以检查您是否不小心写了一个。但是如果没有漏洞,您将无法删除!
-
这是用于 TCP 套接字还是 UDP?如果是前者,您需要为小于预期大小的读取做好准备——这种情况发生是正常的,而不是错误。
标签: c sockets secure-coding