GM

[sql] Proteção Contra Ddos / Flood / Nuke

Por GM Volcano, 20 de mar. de 2008 em Linguagens de Programação

10
6.2k
GM VolcanoG
20 de março de 2008 às 17:20

Tá aí um code feito pelo programador Brasileiro Proglin(membro de outro fórum)

Feito para servidores SQL..

Foi testado na svn de dezembro(12/07)

 

Bom, vamos ao codigo :

 

 

Em game.cpp, depois de :

#include "talkaction.h"
#include "spells.h"
#include "configmanager.h"

 

Adicione :

#include "tools.h"

 

Depois de :

Game::Game()
{

 

Adicione :

#ifdef __UCB_DDOS_PROTECTION__
connectionTestFalseValidUntil = std::time(NULL) + 2*60; //Ignore verification in first 2 minutes
   connectionTestTrueValidUntil = connectionTestFalseValidUntil;
connectionTestOk = true;
#endif

 

Adicione no final :

#ifdef __UCB_DDOS_PROTECTION__
bool Game::isOutSideWorldResponding(){
OTSYS_THREAD_LOCK_CLASS lockClass(gameLock, "Game::isOutSideWorldResponding()");
uint32_t now = std::time(NULL);
if( !connectionTestOk ){
	if( now > connectionTestFalseValidUntil ){
		//Redo test
		connectionTestOk = isWorldReachable();
		connectionTestFalseValidUntil = now + 60; //False result is valid for 60 seconds
	}
} else {
	if( now > connectionTestTrueValidUntil ){
		//Redo test
		connectionTestOk = isWorldReachable();
		connectionTestTrueValidUntil = now + 10; //Ok result is valid for 10 secongs
	}
}
return connectionTestOk;
}
#endif

 

Agora em game.h, depois de :

void internalCreatureChangeVisible(Creature* creature, bool visible);
void changeLight(const Creature* creature);

#ifdef __SKULLSYSTEM__
void changeSkull(Player* player, Skulls_t newSkull);
#endif

 

Adicione :

#ifdef __UCB_DDOS_PROTECTION__
bool isOutSideWorldResponding();
#endif

 

Depois de :

uint32_t inFightTicks;
uint32_t exhaustionTicks;
uint32_t fightExhaustionTicks;

 

Adicione :

#ifdef __UCB_DDOS_PROTECTION__
bool connectionTestOk;
   uint32_t connectionTestTrueValidUntil;
   uint32_t connectionTestFalseValidUntil;
#endif

 

Agora em tools.cpp, adicione no final :

#ifdef __UCB_DDOS_PROTECTION__
bool isWorldReachable(){
int32_t ret;
#if defined __WINDOWS__	
ret = system("ping -n 1 -w 500 google.com > NUL");
#else
ret = system("ping -q -c 1 -w 1 google.com > /dev/null");	
#endif
return (ret == 0);
}
#endif

 

Agora em tools.h, adicione no final :

#ifdef __UCB_DDOS_PROTECTION__
bool isWorldReachable();
#endif

 

Agora em players.cpp, substitua :

if(skillLoss){

 

Por :

#ifdef __UCB_DDOS_PROTECTION__
if(skillLoss && g_game.isOutSideWorldResponding()){
#else
if(skillLoss){
#endif

 

Substitua :

experience -= getLostExperience();

 

Por :

#ifdef __UCB_DDOS_PROTECTION__
if( g_game.isOutSideWorldResponding() ){
 experience -= getLostExperience();
}
#else
experience -= getLostExperience();
#endif

 

Agora vá em Projeto > Opções do Projeto > Parâmetros > Compilador C++ e adicione no final :

-D__UCB_DDOS_PROTECTION__

 

Agora Recompile tudo (Ctrl + F11)!

 

Créditos constam no inicio do tópico..

Natanael BeckmanN
21 de março de 2008 às 17:47

Muito legal, é um topico muito importante para sevidores serios ou mesmo pra curti =D.

2 semanas depois...
uboU
30 de março de 2008 às 23:23

muitu bom

 

continue trazendu codes boms assin

 

nos agradecemos

 

valew!!!

1 mês depois...
Matheus galloM
18 de abril de 2008 às 20:10

mto bom msm!!

 

parabens

1 mês depois...
jorgesamuelJ
12 de maio de 2008 às 17:45

Otimo !

 

Gostei em !

 

Mais so uma pergunta , ele realmente bloqueia nukers !?

BananexxB
17 de maio de 2008 às 10:28
Otimo !

 

Gostei em !

 

Mais so uma pergunta , ele realmente bloqueia nukers !?

 

Bom, pelo que vi, não é bem assim!

 

Parece que ele só não deixa o player perder skills/level, caso o server seja nukado e o player morra.

 

;P

 

Acho que é isso mesmo!

 

Mais mesmo assim, muito bom! É bem útil, só que pode gerar alguns bug's né ? Ou não.. ;P

 

Att.

God Jotape

8 meses depois...
iiiI
03 de janeiro de 2009 às 22:32

i como eu faço isso . poderia postar tutor?

2 anos depois...
Negu96N
09 de dezembro de 2011 às 17:19

não entendi nda desse começo "depois de:"

k2lanK
09 de dezembro de 2011 às 18:48

não entendi nda desse começo "depois de:"

 

é antigo isso amigo, não funciona mais, pois existe maneiras atualizadas de burlar isso

dhenisD
09 de dezembro de 2011 às 22:22

É pra servidores mysql?

Consegue fazer?

 

Abraços.