[SOURCE 5.2 BASE] Fix: Creación de Cuenta In-Game con Sistema Captcha - Source Mu - Mu Server Files
 

[SOURCE 5.2 BASE] Fix: Creación de Cuenta In-Game con Sistema Captcha

Publicado por Dakosmu, Mar 15, 2026, 05:10 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Dakosmu


[SOURCE 5.2 BASE] Fix: Creación de Cuenta In-Game con Sistema Captcha


Uno de los mayores problemas de permitir el registro de cuentas desde el cliente es el abuso por bots o el spam de paquetes. Este fix para la Source 5.2 BASE asegura que el proceso de registro sea validado correctamente, incluya controles de tiempo (cooldown) y refresque el sistema de Captcha tras cada intento.



¿Qué mejoras incluye este Fix?
Este código gestiona la petición de registro (RequsetDKTK) asegurando que los datos cumplan con los requisitos mínimos antes de ser enviados al GameServer:
  • Control de Spam: Añade un TimeSendRegTK de 5 segundos para evitar que un usuario envíe múltiples peticiones por segundo.
  • Validación de Seguridad: Verifica que el número de seguridad (Sno) tenga exactamente 7 dígitos y el teléfono 11.
  • Filtro de Caracteres: Utiliza la función CheckChuoiKyTuDacBiet para bloquear caracteres especiales en el ID y Password.
  • Refresco de Captcha: Genera un nuevo código Captcha automáticamente después de cada envío para mantener la seguridad.

Este código debe integrarse en tu archivo de interfaz de registro, usualmente CB_DangKyInGame.cpp.



Implementación del Código (Client Side)

Copia y reemplaza la función de petición de registro para asegurar la estabilidad de tu sistema:

bool CB_DangKyInGame::RequsetDKTK()
{
char szID[MAX_ID_SIZE + 1] = { 0, };
char szPass[MAX_PASSWORD_SIZE + 1] = { 0, };
char szSno[7 + 1] = { 0, };
char szSDT[11 + 1] = { 0, };

this->CInputData[Account]->GetText(szID, MAX_ID_SIZE + 1);
this->CInputData[Pass]->GetText(szPass, MAX_PASSWORD_SIZE + 1);
this->CInputData[Snonumber]->GetText(szSno, 7 + 1);
this->CInputData[Phone]->GetText(szSDT, 11 + 1);

// Anti-Spam Check
if (this->TimeSendRegTK > GetTickCount())
{
gInterface->OpenMessageBox("Error", "¡Realiza la acción más despacio!");
return 0;
}

// Validaciones de longitud
if (strlen(szID) < 1 || strlen(szPass) < 1)
{
gInterface->OpenMessageBox("Error", "Datos incompletos.");
return 0;
}

if (strlen(szSno) < 7)
{
gInterface->OpenMessageBox("Error", "Ingrese los 7 números de seguridad.");
return 0;
}

if (!CheckChuoiKyTuDacBiet(szID) || !CheckChuoiKyTuDacBiet(szPass))
{
gInterface->OpenMessageBox("Error", "No se permiten caracteres especiales.");
return 0;
}

// Estructura del mensaje para el GameServer
PMSG_REGISTER_MAIN_SEND pMsg;
pMsg.header.set(0xD3, 0x05, sizeof(pMsg));
pMsg.TypeSend = 0x01;

memcpy(&pMsg.account, szID, sizeof(pMsg.account));
memcpy(&pMsg.password, szPass, sizeof(pMsg.password));
memcpy(&pMsg.numcode, szSno, sizeof(pMsg.numcode));
memcpy(&pMsg.sodienthoai, szSDT, sizeof(pMsg.sodienthoai));

DataSend((LPBYTE)&pMsg, pMsg.header.size);

// Regeneración de Captcha tras el envío
gInterface->vCaptcha = gInterface->generateCaptcha(4);
this->TimeSendRegTK = GetTickCount() + 5000;

return 1;
}

Asegúrate de que la estructura PMSG_REGISTER_MAIN_SEND coincida exactamente entre tu Main y tu GameServer para evitar desconexiones al intentar registrarse.

Si la función CheckChuoiKyTuDacBiet no está definida en tu fuente, deberás crearla o comentarla para que el proyecto compile sin errores.

¡Sistema de registro blindado! Con este fix reduces el riesgo de cuentas creadas por software malintencionado y mejoras el flujo de usuario.



¿Créditos?
Agradecimientos especiales a @Odisk por compartir este fix con la comunidad.

Regístrate para ver el enlace
Bon Dia

🡱 🡳
Real Time Web Analytics