Forum poświęcone powstawaniu Belxena OTS
Domyślnie [C++]Blokowanie ip tak jak na rl tibi
Skrypt by Tom
Skrypt działa na takiej zasadzie że blokuje ip oraz konto jeśli ktoś ciągle wpisuje złe passy, bo jeśli tak masowo dużo osób wpisuje złe passy to powoduje to crash serva a ten skrypt jest po to aby temu zapobiec.
W otserv.cpp
Po:
Kod:
Actions actions(&g_game);
Commands commands(&g_game);
Monsters g_monsters;
Dodaj to:
Kod:
#ifdef UCB_SUSPEND_SYSTEM struct AccSuspensaUCB { unsigned int conta; unsigned int tentativas; std::time_t tempo; bool bloqueado; }; struct IpSuspensoUCB { unsigned long ip; unsigned int tentativas; std::time_t tempo; bool bloqueado; }; std::vector< struct AccSuspensaUCB > ListaAccSuspensas; std::vector< struct IpSuspensoUCB > ListaIpsSuspensos; std::time_t tempo_reciclagem = std::time(NULL) + 3600; #endif // UCB_SUSPEND_SYSTEM
Po:
Kod:
bool isclientBanished(SOCKET s) { sockaddr_in sain; socklen_t salen = sizeof(sockaddr_in); if (getpeername(s, (sockaddr*)&sain, &salen) == 0) { unsigned long clientip = *(unsigned long*)&sain.sin_addr; for (size_t i = 0; i < bannedIPs.size(); ++i) { if ((bannedIPs[i].first & bannedIPs[i].second) == (clientip & bannedIPs[i].second)) return true; } } return false; }
Dodaj to:
Kod:
#ifdef UCB_SUSPEND_SYSTEM // Ulisses (Proglin) - IP/ACC Suspend System // April / 2006 for turion.no-ip.info bool isAccIPSuspend(int acc, SOCKET s) { bool suspensa = false; bool achouip = false; bool achouacc = false; sockaddr_in sain; socklen_t salen = sizeof(sockaddr_in); std::time_t now = std::time(NULL); /* Recycling Lists (to save memory wink ) */ if( now > tempo_reciclagem ){ OTSYS_THREAD_LOCK(g_game.gameLock, "UCB_IP_Seach"); OTSYS_THREAD_LOCK(g_game.gameLock, "UCB_ACC_Seach"); tempo_reciclagem = now + 3600; bool achou = true; std::cout << "Ips suspend before recycling: " << ListaIpsSuspensos.size() << std::endl; std::cout << "Accs suspend before recycling: " << ListaAccSuspensas.size() << std::endl; /* Ips list */ std::vector< struct IpSuspensoUCB >::iterator i = ListaIpsSuspensos.begin(); while( achou ){ achou = false; while(i != ListaIpsSuspensos.end()){ if((*i).tempo < now){ ListaIpsSuspensos.erase(i); achou = true; break; } i++; } } /* Acc list */ achou = true; std::vector< struct AccSuspensaUCB >::iterator ii = ListaAccSuspensas.begin(); while( achou ){ achou = false; while(ii != ListaAccSuspensas.end()){ if((*ii).tempo < now){ ListaAccSuspensas.erase(ii); achou = true; break; } ii++; } } OTSYS_THREAD_UNLOCK(g_game.gameLock, "UCB_ACC_Seach"); OTSYS_THREAD_UNLOCK(g_game.gameLock, "UCB_IP_Seach"); std::cout << "Ips suspend after recycling: " << ListaIpsSuspensos.size() << std::endl; std::cout << "Accs suspend after recycling: " << ListaAccSuspensas.size() << std::endl; } /* Search for IP */ OTSYS_THREAD_LOCK(g_game.gameLock, "UCB_IP_Seach"); if (getpeername(s, (sockaddr*)&sain, &salen) == 0 ){ unsigned long clientip = *(unsigned long*)&sain.sin_addr; for (size_t i = 0; i < ListaIpsSuspensos.size(); ++i) { if( ListaIpsSuspensos[i].ip == clientip ){ achouip = true; if( ListaIpsSuspensos[i].tempo < now ){ ListaIpsSuspensos[i].tentativas = 0; ListaIpsSuspensos[i].bloqueado = false; ListaIpsSuspensos[i].tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); } if( !ListaIpsSuspensos[i].bloqueado ){ if( ListaIpsSuspensos[i].tentativas > g_config.getGlobalNumber("suspend_ip_tries", 4) - 1 ){ ListaIpsSuspensos[i].bloqueado = true; ListaIpsSuspensos[i].tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); } } ListaIpsSuspensos[i].tentativas++; suspensa = ListaIpsSuspensos[i].bloqueado; } } if( !achouip ){ struct IpSuspensoUCB candidatoip; candidatoip.ip = clientip; candidatoip.tentativas = 1; candidatoip.tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); candidatoip.bloqueado = false; ListaIpsSuspensos.push_back(candidatoip); } } OTSYS_THREAD_UNLOCK(g_game.gameLock, "UCB_IP_Seach"); /* Search for Account */ OTSYS_THREAD_LOCK(g_game.gameLock, "UCB_ACC_Seach"); for (size_t i = 0; i < ListaAccSuspensas.size(); ++i) { if( ListaAccSuspensas[i].conta == acc ){ achouacc = true; if( ListaAccSuspensas[i].tempo < now ){ ListaAccSuspensas[i].tentativas = 0; ListaAccSuspensas[i].bloqueado = false; ListaAccSuspensas[i].tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); } if( !ListaAccSuspensas[i].bloqueado ){ if( ListaAccSuspensas[i].tentativas > g_config.getGlobalNumber("suspend_acc_tries", 2) - 1 ){ ListaAccSuspensas[i].bloqueado = true; ListaAccSuspensas[i].tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); } } ListaAccSuspensas[i].tentativas++; if( !suspensa ) suspensa = ListaAccSuspensas[i].bloqueado; } } if( !achouacc ){ struct AccSuspensaUCB candidatoacc; candidatoacc.conta = acc; candidatoacc.tentativas = 1; candidatoacc.tempo = now + 60*g_config.getGlobalNumber("suspend_time_max", 15); candidatoacc.bloqueado = false; ListaAccSuspensas.push_back(candidatoacc); } OTSYS_THREAD_UNLOCK(g_game.gameLock, "UCB_ACC_Seach"); return suspensa; } #endif // UCB_SUSPEND_SYSTEM
Zmieniając ten Kod
Kod:
if(isclientBanished(s)) {
msg.AddByte(0x0A);
msg.AddString("Your IP is banished!");
}
Na ten kod:
Kod:
#ifdef UCB_SUSPEND_SYSTEM bool recebeuban = false; if(isclientBanished(s)) { recebeuban = true; msg.AddByte(0x0A); msg.AddString("Your IP is banished!"); } if( isAccIPSuspend(accnumber, s) || recebeuban ){ if( !recebeuban ){ msg.AddByte(0x0A); msg.AddString(g_config.getGlobalString("suspendmsg","Your IP/ACC has been suspended for some minuts\n\nTry again later.")); } } #else if(isclientBanished(s)) { msg.AddByte(0x0A); msg.AddString("Your IP is banished!"); } #endif // UCB_SUSPEND_SYSTEM
W config.lua dodaj:
---- UCB Suspend System (April/2006) -- Suspend time period (in minuts) suspend_time_max = 10 -- Acc tries to be suspended in the period suspend_acc_tries = 2 -- Same IP loggin tries to be suspended in the period suspend_ip_tries = 4 -- Message to user when he got suspended suspendmsg = "Your IP/ACC has been suspended for 10 minuts."
Dodać do parametrĂłw:
Kod:
-DUCB_SUSPEND_SYSTEM
Pozdrawiam, GM Macgates
Offline