25.07.2012, 01:00
(
Последний раз редактировалось TheChaoz; 26.07.2012 в 21:38.
)
Bueno recientemente se crearon varios temas solicitando ayuda en algunos de ellos para detener ataques hacia los servidores.
En este topic publicare algunos de los metodos que se utilizan para parar ataques desde el script (es decir que no son validos para ataques tipo DOS, DDOS, y agentes externos al servidor).
Evitar Bots desde una misma IP: por el equipo de SA-MP
Si bien existe un filterscript el cual viene por defecto con el servidor de SA-MP llamado maxip.pwn, mostrare el medoto, ya que no todos lo conocen.
Evitar Bots desde la misma IP que conectan y desconectan por JernejL
Evitar Flood de muertes: por Cessil
Todos son bienvenidos a subir los metodos que utilizen para estos u otros ataques en este tema.
En este topic publicare algunos de los metodos que se utilizan para parar ataques desde el script (es decir que no son validos para ataques tipo DOS, DDOS, y agentes externos al servidor).
Evitar Bots desde una misma IP: por el equipo de SA-MP
Si bien existe un filterscript el cual viene por defecto con el servidor de SA-MP llamado maxip.pwn, mostrare el medoto, ya que no todos lo conocen.
pawn Код:
#define MAX_IPS (3)
new IP[MAX_PLAYERS][16];
public OnPlayerConnect(playerid)
{
new contador;
GetPlayerIp(playerid, IP[playerid], 16);
for(new user; user<GetMaxPlayers(); user++)
if(IsPlayerConnected(user))
if(!strcmp(IP[playerid], IP[user]))
contador++;
if(contador>=MAX_IPS)
Kick(playerid);
return 1;
}
pawn Код:
#define MAX_BOTS (50)
enum bInfo
{
bIP,
bTime
};
new Bots[MAX_BOTS][bInfo], bCount;
public OnPlayerConnect(playerid)
{
new IP[16];
GetPlayerIp(playerid, IP, 16);
Bots[bCount][bIP] = IpToInt(IP);
Bots[bCount][bTime] = GetTickCount();
for(new i; i<MAX_BOTS; i++)
{
if(Bots[bCount][bIP] != Bots[i][bIP])
continue;
if(GetTimeDistance(Bots[bCount][bTime], Bots[i][bTime])<=1000)
Bots[bCount][bTimes]++;
}
if(Bots[bCount][bTimes]>3)Ban(playerid);
bCount++;
if(bCount>=MAX_BOTS)
bCount = 0;
return 1;
}
IpToInt(const szIP[])//by RyDeR`, JernejL
{
new aiBytes[4 char], iPos = 0;
aiBytes{0} = strval(szIP[iPos]);
while(szIP[iPos] != EOS && szIP[iPos++] != '.') {}
aiBytes{1} = strval(szIP[iPos]);
while(szIP[iPos] != EOS && szIP[iPos++] != '.') {}
aiBytes{2} = strval(szIP[iPos]);
while(szIP[iPos] != EOS && szIP[iPos++] != '.') {}
aiBytes{3} = strval(szIP[iPos]);
return aiBytes[0];
}
intabs(innumber)//by JernejL
{
if(innumber < 0)return -innumber;
return innumber;
}
Distance1Dint(fPos1, fPos2)//by JernejL
{
if (fPos1 > fPos2)return intabs(fPos1 - fPos2);
return intabs(fPos2 - fPos1);
}
GetTimeDistance(a, b)//by JernejL
{
if((a < 0) && (b > 0)){
new dist;
dist = Distance1Dint(a, b);
if(dist > 2147483647)return Distance1Dint(a - 2147483647, b - 2147483647);
return dist;
}
return Distance1Dint(a, b);
}
pawn Код:
new DeathSpam[MAX_PLAYERS char], LastDeath[MAX_PLAYERS];
public OnPlayerDeath(playerid, killerid, reason)
{
new time = gettime();
switch(time - LastDeath[playerid])
{
case 0 .. 3:
{
DeathSpam{playerid}++;
if(DeathSpam{playerid} >= 3)
Kick(playerid);
}
default:
DeathSpam{playerid} = 0;
}
LastDeath[playerid] = gettime();
return 1;
}