第四章 Socket安全 一.避免服务器被劫持(*) 当应用程序允许本地用户截取和处理那些传送给不是由此用户启动的服务器的信息时,服务器就会被劫持。 当一项服务启动时,它首先创建一个socket,并根据你想使用的协议来对该socket进行绑定。 bind()函数如下: int bind(SOCKET s, const struct sockaddr FAR *name, int namelen); 如果使用的是IPv4,socket地址变量是sockaddr_in结构,定义如下: struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; } 第四章 Socket安全 一.避免服务器被劫持 当你绑定一个socket时,重要的是sin_port和sin_addr成员变量。对于一台服务器来说,总能够设定一个端口来监听。但开始处理sin_addr时,如果我们绑定到INADDR_ANY(实际上是0),将监听到所有可能的接口,如果绑定到一个特定的IP地址,则只能监听发送到那个IP地址的数据包。 另外,同一个端口绑定多个socket是可能的。socket链接库通过比较谁的绑定最明确来决定谁赢出以获得传入的数据包。一个绑定到INADDR_ANY的socket与一个绑定到具体IP地址的socket在竞争时,会得不到传入的数据包。如果你的服务器有两个IP地址,157.34.32.56和172.101.92.44,socket软件将把传入的数据传送给绑定到172.101.92.44的应用程序socket,而不是绑定到INADDR_ANY的应用程序socket。 第四章 Socket安全 一.避免服务器被劫持 下面的程序说明服务器如何被劫持,及解决方法。 /*BindDemoSvr.cpp*/ #include winsock2.h #include stdio.h #include assert.h #include “SocketHelper.h” //If you have an older version of winsock2.h #ifndef SO_EXCLUSIVEADDRUSE #define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR)) #endif /* This application demonstrates a generic UDP-based server. It listens on port 8391. If you have something running there, change the port number and remember to change the client too. */ int main(int argc, char *argv[]) { SOCKET sock; sockaddr_in sin; DWORD packets; bool hijack=false; bool nohijack=false; 第四章 Socket安全 一.避免服务器被劫持 if(argc2||argc3) { printf(“Usage is %s [addres to bind]\n”,argv[0]); printf(“Options are:\n\t-nohijack\n”); return -1; } if(argc==3) { //check to see whether hijacking mode or //no-hijack mode is enable. if(strcmp(“-hijack”,argv[2])==0) hijack=true; else if(strcmp(“-nohijack”,argv[2])==0) nohijack=true; else { printf(“unrecognized argument %s\n”, argv[2]); return -1; } } 第四章 Socket安全 一.避免服务器被劫持 if(!InitWinsock()) return -1; //Create your socket. sock=
原创力文档

文档评论(0)