Problema con registro / whirlpool
#1

Que tal;

Espero alguien me pudiese ayudar con un pequeсo problema que tengo,
ya hace tiempo que he estado creando un GM y pues ya todo esta bien solo que decidн agregarle una Encriptaciуn
a la contraseсa lo que sucede es que asн como esta el cуdigo si encripta la contraseсa pero no guarda el nombre del jugador en la base de datos mysql... y de otra forma que lo tenia... guardaba el nombre del jugador pero no encriptaba la contraseсa

Aqui dejo el DIALOG, STOCK, OnPlayerRegister
PHP код:
//Dialogo al conectarse if not registered
        
case Registro_doc:
        {
        if(
response == 0)
            {
                  
Kick(playerid);
                  return 
1;
            }
            else
            {
                if(
strlen(inputtext))
                {
                    new 
tmppass[64];
                    
strmid(tmppassinputtext0strlen(inputtext), 255);
                    
OnPlayerRegister(playerid,inputtext);
                    return 
1;
                }
                else
                {
                    
ShowRegisterDialog(playerid);//Registro_doc
                    
return 1;
                }
            }
        } 
PHP код:
public OnPlayerRegister(playeridpassword[])
{
    if(
IsPlayerConnected(playerid))
    {
        
MySQLCheck();
         new 
playername3[MAX_PLAYER_NAME];
                         
GetPlayerName(playeridplayername3sizeof(playername3));
        new    
escapedPassword[129];
        
WP_Hash(escapedPasswordsizeof(escapedPassword), password);
        new 
newaccountsqlid InsertarJugador(playername3escapedPassword);
        if (
newaccountsqlid != 0)
        {
            
//Datos para registro
        
}
        else
        {
            
SendClientMessage(playeridCOLOR_RED"Ha ocurrido un error, desconectando.");
//            Kick(playerid);
            
return 0;
        }
    }
    return 
0;

PHP код:
//stock
stock InsertarJugador(pname[], password[])
{
    new 
query[200], escapednameMAX_PLAYER_NAME ],escapedPassword[129];
    
mysql_real_escape_stringpnameescapedname );
    
WP_Hash(escapedPasswordsizeof(escapedPassword), password);
     
format(querysizeof(query), "INSERT INTO "TABLENAME" (`"User_Name"`, `"P_Passswd"`) VALUES ('%s', '%s')"escapednameescapedPassword);
    
mysql_query(query);
    new 
newplayersid E_Usuario(pname);
    if (
newplayersid != 0)
    {
        return 
newplayersid;
    }
    return 
0;

Reply
#2

їcuбl es la longitud de la columna de la contraseсa en la base de datos?
Reply
#3

Quote:
Originally Posted by Jex_Lafer
Посмотреть сообщение
Que tal;

Espero alguien me pudiese ayudar con un pequeсo problema que tengo,
ya hace tiempo que he estado creando un GM y pues ya todo esta bien solo que decidн agregarle una Encriptaciуn
a la contraseсa lo que sucede es que asн como esta el cуdigo si encripta la contraseсa pero no guarda el nombre del jugador en la base de datos mysql... y de otra forma que lo tenia... guardaba el nombre del jugador pero no encriptaba la contraseсa

Aqui dejo el DIALOG, STOCK, OnPlayerRegister
PHP код:
//Dialogo al conectarse if not registered
        
case Registro_doc:
        {
        if(
response == 0)
            {
                  
Kick(playerid);
                  return 
1;
            }
            else
            {
                if(
strlen(inputtext))
                {
                    new 
tmppass[64];
                    
strmid(tmppassinputtext0strlen(inputtext), 255);
                    
OnPlayerRegister(playerid,inputtext);
                    return 
1;
                }
                else
                {
                    
ShowRegisterDialog(playerid);//Registro_doc
                    
return 1;
                }
            }
        } 
PHP код:
public OnPlayerRegister(playeridpassword[])
{
    if(
IsPlayerConnected(playerid))
    {
        
MySQLCheck();
         new 
playername3[MAX_PLAYER_NAME];
                         
GetPlayerName(playeridplayername3sizeof(playername3));
        new    
escapedPassword[129];
        
WP_Hash(escapedPasswordsizeof(escapedPassword), password);
        new 
newaccountsqlid InsertarJugador(playername3escapedPassword);
        if (
newaccountsqlid != 0)
        {
            
//Datos para registro
        
}
        else
        {
            
SendClientMessage(playeridCOLOR_RED"Ha ocurrido un error, desconectando.");
//            Kick(playerid);
            
return 0;
        }
    }
    return 
0;

PHP код:
//stock
stock InsertarJugador(pname[], password[])
{
    new 
query[200], escapednameMAX_PLAYER_NAME ],escapedPassword[129];
    
mysql_real_escape_stringpnameescapedname );
    
WP_Hash(escapedPasswordsizeof(escapedPassword), password);
     
format(querysizeof(query), "INSERT INTO "TABLENAME" (`"User_Name"`, `"P_Passswd"`) VALUES ('%s', '%s')"escapednameescapedPassword);
    
mysql_query(query);
    new 
newplayersid E_Usuario(pname);
    if (
newplayersid != 0)
    {
        return 
newplayersid;
    }
    return 
0;

їPorquй haces esto?

pawn Код:
new tmppass[64];
strmid(tmppass, inputtext, 0, strlen(inputtext), 255);
OnPlayerRegister(playerid,inputtext);
Esta parte de cуdigo no tiene sentido alguno, te registra mal porque estбs usando DEMASIADAS celdas їporquй?
analicemos el cуdigo de acб:
pawn Код:
public OnPlayerRegister(playerid, password[])
{
    if(IsPlayerConnected(playerid))
    {
        MySQLCheck();
        new playername3[MAX_PLAYER_NAME];
                        GetPlayerName(playerid, playername3, sizeof(playername3));
        new escapedPassword[129];
        WP_Hash(escapedPassword, sizeof(escapedPassword), password);

        new newaccountsqlid = InsertarJugador(playername3, escapedPassword);
        if (newaccountsqlid != 0)
        {
            //Datos para registro
        }
        else
        {
            SendClientMessage(playerid, COLOR_RED, "Ha ocurrido un error, desconectando.");
//          Kick(playerid);
            return 0;
        }
    }
    return 0;
}
Bien ahн hasheas la contraseсa dada para luego llamar a la funciуn InsertarJugador con los parбmetros de la contraseсa encriptada y si eso retorna un valor que de los datos para el registro. Ahora en InsertarJugador estas haciendo esto:

pawn Код:
stock InsertarJugador(pname[], password[])
{
    new query[200], escapedname[ MAX_PLAYER_NAME ],escapedPassword[129];

    mysql_real_escape_string( pname, escapedname );
    WP_Hash(escapedPassword, sizeof(escapedPassword), password);
    format(query, sizeof(query), "INSERT INTO "TABLENAME" (`"User_Name"`, `"P_Passswd"`) VALUES ('%s', '%s')", escapedname, escapedPassword);
    mysql_query(query);
    new newplayersid = E_Usuario(pname);
    if (newplayersid != 0)
    {
        return newplayersid;
    }
    return 0;
}
Ahн escapas la cadena de texto para evitar una inyecciуn SQL pero a ver hay un error estбs escapando el NOMBRE del jugador en ves de la contraseсa, por pura lуgica para hacer una inyecciуn SQL decente se necesita una cadena de caracteres mayor a 24 ademбs de tener algunos caracteres especiales los cuales no se pueden insertar en la API de SA-MP. Tendrнas que escapar la contraseсa del jugador pero igual no tendrнa sentido escaparla ya que ya la hasheaste anteriormente (en OnPlayerRegister) entonces lo que era la contraseсa del jugador anteriormente ahora es un texto COMPLETAMENTE distinto a lo que era y no se puede hacer una inyecciуn SQL asн.
Luego hasheas la contraseсa denuevo por lo cual tendrб muchнsimos mбs caracteres que antes y no entrarб en la base de datos cuando lo quieras enviar.
Lo que tendrнas que hacer serнa esto:

pawn Код:
public OnPlayerRegister(playerid, password[])
{
    if(IsPlayerConnected(playerid))
    {
        MySQLCheck();
        new playername3[MAX_PLAYER_NAME];
                        GetPlayerName(playerid, playername3, sizeof(playername3));
        new newaccountsqlid = InsertarJugador(playername3, password);
        if (newaccountsqlid != 0)
        {
            //Datos para registro
        }
        else
        {
            SendClientMessage(playerid, COLOR_RED, "Ha ocurrido un error, desconectando.");
//          Kick(playerid);
            return 0;
        }
    }
    return 0;
}

pawn Код:
stock InsertarJugador(pname[], password[])
{
    new query[200],escapedPassword[129];

    WP_Hash(escapedPassword, sizeof(escapedPassword), password);
    format(query, sizeof(query), "INSERT INTO "TABLENAME" (`"User_Name"`, `"P_Passswd"`) VALUES ('%s', '%s')", pname, escapedPassword);
    mysql_query(query);
    new newplayersid = E_Usuario(pname);
    if (newplayersid != 0)
    {
        return newplayersid;
    }
    return 0;
}
Eso deberнa funcionar.
Reply
#4

Tiene 129

Y

Esa parte que dices que no tiene sentido

OnPlayerRegister(playerid,inputtext);

Lo que sucede es que eso es un dialogo... al introducir la contraseсa manda a OnPlayerRegister
Reply
#5

Y porque en ves de usar strmid y despuйs llamar a la funciуn no llamas directamente a la funciуn con esos parбmetros

pawn Код:
CallLocalFunction("OnPlayerRegister", "is", playerid, inputtext);
Reply
#6

Lo modifique y lo puse tal como esta pero me sale el error

"Ha ocurrido un error, desconectado"

Hasheo el nombre de usuario
Reply
#7

Mostra la funciуn E_Usuario
Reply
#8

pawn Код:
stock E_Usuario(playername[])
{
    new escapedname[ MAX_PLAYER_NAME ], query[ 200 ];
    mysql_real_escape_string( playername, escapedname );
    format( query, sizeof( query ), "SELECT "ID_User" FROM `"TABLENAME"` WHERE LOWER("User_Name") = ('%s') LIMIT 1", escapedname );
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows() == 0)
    {
        return 0;
    }
    else
    {
        new strid[32];
        new intid;
        samp_mysql_fetch_row(strid);
        intid = strval(strid);
        return intid;
    }
}
Reply
#9

Quote:
Originally Posted by Jex_Lafer
Посмотреть сообщение
pawn Код:
stock E_Usuario(playername[])
{
    new escapedname[ MAX_PLAYER_NAME ], query[ 200 ];
    mysql_real_escape_string( playername, escapedname );
    format( query, sizeof( query ), "SELECT "ID_User" FROM `"TABLENAME"` WHERE LOWER("User_Name") = ('%s') LIMIT 1", escapedname );
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows() == 0)
    {
        return 0;
    }
    else
    {
        new strid[32];
        new intid;
        samp_mysql_fetch_row(strid);
        intid = strval(strid);
        return intid;
    }
}
їPara quй haces eso? si ya insertaste previamente al jugador en la base de datos.
Por cierto no hashees el nombre de usuario, igualmente si lo queres hashear ponele 256 caracteres al tamaсo de la cadena de texto en la base de datos.
Reply
#10

Eso solamente es para verficar si el jugador esta registrado

E_Usuario = Existe Usuario
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)