Jump to content

Dúvida criptografia md5()


AndreLC
 Share

Recommended Posts

Boa noite,

Ao fazer update de um campo de um formulário, por exemplo, do username, o campo relativo à password ( que está criptografado com o uso da função md5() ) também está a faz update na BD, o que não faz sentido, pois só estou a editar o username. Isto é inconveniente, pois altera para outro hash igual, mas ao fazer login não valida e eu só quero mesmo editar aquele campo necessário não intervindo no campo relativo à password.

Curioso é que se não usar a função md5() já só altera o campo relativo ao username.

Já experimentei verificar nos outros formulários que tenho e se tiver algo criptografado com a função md5() acontece o mesmo - quando altero um registo, também vai alterar o que está com a criptografia.

Já testei, também, com sha1() e acontece a mesma situação. Já vos aconteceu algo semelhante? Onde estará o problema?

Obrigado pela vossa ajuda.

Cumprimentos,

AndreLC

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Link to comment
Share on other sites

Nem o md5() nem o sha1() mexem na base de dados. Deves estar a fazer confusao com outra parte do teu codigo.

Se fazes confusao com outra parte do codigo a olhar para ele, imagina a gente que nem o conhece !!! 😁

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

A Parte do formulário:

<form method="post" action="editar_user.php?id=<?php echo $id ?>">

        Nome do utilizador: <input name="nome" type="text" id="nome" value="<?php echo $nome ; ?>" size="32" /><br /><br />
        Login: <input name="login" type="text" id="login" size="20" value="<?php echo $login ; ?>" /><br /><br />
Senha: <input type="password" name="senha" id="senha" size="20" value="<?php echo $senha ; ?>" onfocus="if (this.value == '<?php echo $senha ; ?>') {this.value = '';}" onblur="if (this.value == '') {this.value = '<?php echo $senha ; ?>';}" />

<input class="ok_btn1" type="submit" name="button" id="button" value="Actualizar" />
         
</form> 

E o ficheiro editar_user.php:

<?php

require '../config/connect.php';

    $id 	  = mysql_real_escape_string($_GET['id']);

    $nome	  =	$_POST['nome'];                                 //Nome do utilizador
    $login	  =	$_POST['login'];  			           //Login
    $senha    = md5(addslashes($_POST['senha']));   //Palavra-Passe

    $sql   = mysql_query("UPDATE utilizador SET nome = '$nome', login = '$login', senha = '$senha' WHERE id = '$id'");

     print "<META HTTP-EQUIV=REFRESH CONTENT='0; URL=edita_user.php'>
				<script type=\"text/javascript\">
					alert(\"A alteração dos dados foi realizada com sucesso.\");
			        </script>";
?>

Aparentemente não vejo onde esteja o problema...

Obrigado pela ajuda.

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Link to comment
Share on other sites

Digamos que a senha é "foobar" (md5 é "3858f62230ac3c915f300c664312c63f").

No form esta "3858f62230ac3c915f300c664312c63f" com bolinhas ... e no action vais fazer md5("3858f62230ac3c915f300c664312c63f") ... que da "9e71fc2a99a71b722ead746b776b25ac"

Sugestao: verifica no lado do servidor se a password introduzida é igual ao hash que esta na base de dados. Se for nao actualizes, se nao for, aplica o md5() ao valor do form e actualiza.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Esse código está a atualizar o nome, login e senha do utilizador. Qual é a dúvida?

@pmg: Nem tinha reparado que estava a colocar o md5 da password no form lol

A minha dúvida é qualquer campo que edite, na BD está a editar também o campo relativo à senha. Não percebi porque está a mudar o hash...

Se o que querias dizer era o facto de não estar elegante, qual a maneira alternativa / o que acnselhas para a edição não colocando o md5 da password no form?

Digamos que a senha é "foobar" (md5 é "3858f62230ac3c915f300c664312c63f").

No form esta "3858f62230ac3c915f300c664312c63f" com bolinhas ... e no action vais fazer md5("3858f62230ac3c915f300c664312c63f") ... que da "9e71fc2a99a71b722ead746b776b25ac"

Sugestao: verifica no lado do servidor se a password introduzida é igual ao hash que esta na base de dados. Se for nao actualizes, se nao for, aplica o md5() ao valor do form e actualiza.

No action onde estou a fazer "md5("3858f62230ac3c915f300c664312c63f")" ?

Não percebi como verificar...

Obrigado pela ajuda.

--

Edit(brunoais):

Calma com os 2x posts! Cria um post só após um tempo razoável em relação ao post anterior (>10h). 2 minutos não é um tempo razoável.

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Link to comment
Share on other sites

Como é que podes dizer que qualquer campo que edites também está a editar o campo relativo à senha com surpresa??? O teu código altera a senha sempre. Se não queres que altere a senha, não faças senha = '$senha' no UPDATE...

Mas também tenho nome = '$nome' no update e se não alterar o nome, não faz a alteração o que está correcto ou não é a melhor maneira?

Que aconselhas então a proceder? Colocando vários if's, é isso?

Obrigado pela ajuda.

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Link to comment
Share on other sites

O pmg já te explicou porque é que o valor da senha é modificado. Na form tu estás a colocar o valor da variável $senha. Presumo que esse valor venha da base de dados (que está hashed), e como tal, se a senha for "a minha password", tens $senha = md5("a minha password").

Quando o utilizador submete essa form, na variável $_POST['senha'], tens o valor de md5("a minha password"). Ao fazeres md5 disso ficas com md5(md5("a minha password")) que é diferente do que está na base de dados: md5("a minha password"), pelo que vais alterar o valor que está na base de dados.

Nunca deves colocar o valor da password hashed num formulário, qualquer campo com a password deve ser apresentado vazio ao utilizador.

Assim só modificas o valor da password na base de dados se o utilizador preencher esse campo. É também aconselhável ter dois campos para a password, para o caso da pessoa se enganar a escrever a password não modificares para uma coisa que a pessoa não quer.

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Obrigado pela explicação, já percebi  o que está a acontecer com a vossa ajuda.

Sim o campo de verificação será posteriormente colocado, obrigado pela dica. Pois não faz sentido, mas o utilizador final quer o campo hashed no form e com isto como faço a tal validação que o pmg falou para contornar esta situação?

E quanto ao resto que referiste que estava sempre a alterar a senha, não percebi, estavas a aconselhar fazer validações verificando se tal campo foi alterado é isso?

Obrigado pela ajuda.

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Link to comment
Share on other sites

Sim o campo de verificação será posteriormente colocado, obrigado pela dica. Pois não faz sentido, mas o utilizador final quer o campo hashed no form e com isto como faço a tal validação que o pmg falou para contornar esta situação?

Fazes um select da password do utilizador e verificas se o valor da password no $_POST é igual à que está na base de dados. Se for, então é esse mesmo hash e não precisas de usar o md5().

E quanto ao resto que referiste que estava sempre a alterar a senha, não percebi, estavas a aconselhar fazer validações verificando se tal campo foi alterado é isso?

Com licença  :wallbash:.

Agora que já acordei, tu não usavas a password para verificar o que seja. Tu pegavas em todos os dados do formulário e indiscriminadamente metias diretamente na db. Como o que estava no formulário era um hash, tu executavas um hash sobre um hash o que alterava a password na DB.

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Link to comment
Share on other sites

Algo do género:

<?php

require '../config/connect.php';

if (isset($_POST['button']) && $_POST['button'] == "Actualizar"){

    $id 	  = mysql_real_escape_string($_GET['id']);

    $nome	  =	$_POST['nome'];                     //Nome do Administrador
    $login	  =	$_POST['login'];  		       //Login
    $senha  = addslashes($_POST['senha']);  //Palavra-Passe

    $qry = mysql_query("SELECT * FROM utilizador WHERE id = '$id'");
  
       while($linha1 = mysql_fetch_array($qry)){

                        $senha1  = $linha1['senha'];
               }

    //Verifica as senhas
    if ($senha != $senha1){

$sql   = mysql_query("UPDATE utilizador SET nome = '$nome', login = '$login', senha = md5('$senha') WHERE id = '$id'");

print "<META HTTP-EQUIV=REFRESH CONTENT='0; URL=edita_user.php'>
			    <script type=\"text/javascript\">
					alert(\"A alteração dos dados foi realizada com sucesso.\");
			    </script>";
    }else{

    $sql   = mysql_query("UPDATE utilizador SET nome = '$nome', login = '$login', senha = '$senha1' WHERE id = '$id'");

    print "<META HTTP-EQUIV=REFRESH CONTENT='0; URL=edita_user.php'>
			    <script type=\"text/javascript\">
					alert(\"A alteração dos dados foi realizada com sucesso.\");
			    </script>";
    }

}else{
 print "<META HTTP-EQUIV=REFRESH CONTENT='0; URL=edita_user.php'>
			    <script type=\"text/javascript\">
					alert(\"Não foi possível elaborar a alteração dos dados.\");
			    </script>";
}

?>

Seria assim que estavam a falar?

Aceitam-se críticas para melhorar o código para torná-lo mais clean.

Obrigado pela ajuda, críticas, sugestões.

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Link to comment
Share on other sites

Destroi esse while e use um if.

Cria a variável $senha1 fora do if/while e dá-lhe um valor.

Não vale a pena alterar algo que não foi alterado. I.e. Se a senha não foi alterada, pq é que a vais gravar?

Eu detesto as meta tags com o @HTTP-EQUIV! Se é para usar um header, então envia num header.

Ser enviado para uma página para receber um alert em js para indicar tudo bem é chato. Escreve o resultado na página de destino, em vez disso. Dica: Podes usar o método do SMF que é criar uma variável em GET que faz aparecer algo no HTML que indica a mensagem de confirmação de que foi alterado com sucesso. Ao usar isto já podes enviar o status code 303 em vez do 200 para enviar o utilizador para outra página que mostra tudo estar bem.

Vês os 2 1º prints? Não repitas código, não vale a pena. Põe simplesmente depois do if e só 1x.

Esse addslashes na password serve para....?

Devias de usar uma proteção como passando por mysql_real_escape_string() que dá-te +-99,999% de certeza que podes usar diretamente na query. De qq modo, sempre que estejas perante algo que é um numero podes fazer cast ou se for passado por algo como md5() que cria uma string nova não precisas de usar o mysql_real_escape_string(). O cast para int ou double ou usar algo como o md5() é 100% seguro para meter na string da query.

Isto é o principal que encontrei. Ainda há mais coisas mas n é tão importante

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Link to comment
Share on other sites

Obrigado pelas dicas e criticas que são sempre bem vindas brunoais.

Como ficaria com o if? Qual o valor da senha1 que iria atribuir?

Podes explicar melhor o método do SMF? Pois a ideia era apresentar uma caixa de diálogo ao utilizador a informar a alteração.

A ideia do cast, percebi.

Podes referir as outras coisas menos importantes pois queria mesmo optimizar o código e como disse todas as sugestões são bem-vindas.

Para melhor compreensão, poderias exemplificar em código o que referiste?

Obrigado pela ajuda e pela atenção.

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Link to comment
Share on other sites

Obrigado pelas dicas e criticas que são sempre bem vindas brunoais.

Como ficaria com o if? Qual o valor da senha1 que iria atribuir?

Podes explicar melhor o método do SMF? Pois a ideia era apresentar uma caixa de diálogo ao utilizador a informar a alteração.

No SMF, quando a variável GET reportsent está definida e se está-se a ver um tópico, ele faz mostrar uma "caixa" de texto a indicar que o relatório(?) foi enviado, mesmo sem que se tenha enviado um. (experimenta nesta página (escreve ?reportsent depois do .html)

Podes referir as outras coisas menos importantes pois queria mesmo optimizar o código e como disse todas as sugestões são bem-vindas.

"$login        =    $_POST['login']; " <- Redefinir variáveis é má ideia. É só fazer com que o mesmo dado ocupe o dobro do espaço. Aliás, eu uso sempre o array $_GET ou $_POST para identificar todos os dados do exterior. Quando eu quero algo do exterior vou diretamente a esses arrays. Eu assumo que qualquer variável que eu tenho no sistema que não esteja no $_GET ou no $_POST é algo limpo e seguro de usar.

Apaga a linha: $senha  = addslashes($_POST['senha']);

Mais em baixo compara diretamente $_POST['senha'] com (a atual) $senha1. Ou melhor: compara com $linha1['senha'].

Id => numero !=0, certo?

Apaga: $id          = mysql_real_escape_string($_GET['id']);. Usa: (int) $_GET['id'] na query.

Substitui os 2 1ºs prints por:

header('location:edita_user.php?changeSuccess', true, 303);

E mete o código depois do if em que estão.

e o outro por

header('location:edita_user.php?changeFailed', true, 303);

Faz só 1 query à DB e, só se necessário é que fazes duas.

Para saberes se houve alterações, verificas se o registo existe.

Basta meter tudo o que recebes no where (id, nome, login, senha) verificar se há resultados. Se ao houver, então editas para o id q recebeste. (Isto é uma maneira de resolver simples. Há outras um pouco melhores mas n sei como explicar).

Isto é o que eu consegui reparar agora.

Para melhor compreensão, poderias exemplificar em código o que referiste?

Que parte? Tudo? Isso dá muito trabalho e posso acabar por cometer erros (de certeza?).

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Link to comment
Share on other sites

No SMF, quando a variável GET reportsent está definida e se está-se a ver um tópico, ele faz mostrar uma "caixa" de texto a indicar que o relatório(?) foi enviado, mesmo sem que se tenha enviado um. (experimenta nesta página (escreve ?reportsent depois do .html)

Experimentei nesta página e apareceu, mas não percebi como aplicar ao código que tenho para que apareça a caixa de texto com a mensagem. Como faço essa parte?

Substitui os 2 1ºs prints por:

header('location:edita_user.php?changeSuccess', true, 303);

E mete o código depois do if em que estão.

e o outro por

header('location:edita_user.php?changeFailed', true, 303);

.

Realmente aqui nota-se uma diferença enorme em termos de rapidez, ficou bem mais rápido com o ?changeSucess.

Faz só 1 query à DB e, só se necessário é que fazes duas.

Para saberes se houve alterações, verificas se o registo existe.

Basta meter tudo o que recebes no where (id, nome, login, senha) verificar se há resultados. Se ao houver, então editas para o id q recebeste. (Isto é uma maneira de resolver simples. Há outras um pouco melhores mas n sei como explicar).

Pois, esta parte deixou-me confuso porque estou a misturar com aquele while, aqui preciso de ajuda.

O que tenho agora com a tua ajuda:

<?php

require '../config/connect.php';

if (isset($_POST['button']) && $_POST['button'] == "Actualizar"){


$qry = mysql_query("SELECT * FROM utilizador WHERE id = ".(int) $_GET['id']);
  
$linha1 = mysql_fetch_array($qry);

// vai para aqui uma confusao

//$resultados = mysql_num_rows($qry);
       
    //if ($resultados != 0)

//Verifica as senhas
if ($_POST['senha'] != $linha1['senha']){

mysql_query("UPDATE utilizador SET nome = '".mysql_real_escape_string($_POST['nome'])."', login = '".mysql_real_escape_string($_POST['login'])."', senha = '".md5($_POST['senha'])."' WHERE id = ".(int) $_GET['id']);


}else{

mysql_query("UPDATE utilizador SET nome = '".mysql_real_escape_string($_POST['nome'])."', login = '".mysql_real_escape_string($_POST['login'])."', senha = '".$linha1['senha']."' WHERE id = ".(int) $_GET['id']);


}

header('location:edita_user.php?changeSuccess', true, 303);

}else{

header('location:edita_user.php?changeFailed', true, 303);
}

?>

Que parte? Tudo? Isso dá muito trabalho e posso acabar por cometer erros (de certeza?).

De certeza. Se pudesses fazer os ajustes que referiste ao que tenho, por favor. Agradeço a tua ajuda.

Obrigado brunoais.

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Link to comment
Share on other sites

Experimentei nesta página e apareceu, mas não percebi como aplicar ao código que tenho para que apareça a caixa de texto com a mensagem. Como faço essa parte?

Realmente aqui nota-se uma diferença enorme em termos de rapidez, ficou bem mais rápido com o ?changeSucess.

Pois, esta parte deixou-me confuso porque estou a misturar com aquele while, aqui preciso de ajuda.

Aonde tens:

if ($_POST['senha'] != $linha1['senha']){
?>

Usa:

if (	$_POST['senha'] != $linha1['senha'] || 
$_POST['login'] != $linha1['login'] || 
$_POST['nome'] != $linha1['nome']
  ){
?>

E apaga o q tens no else.

E aí q eu estou interessado que chegues.

Edit: Obg pelo aviso, AndreLC

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Link to comment
Share on other sites

Tens um operador lógico a mais. Está assim:

<?php

require '../config/connect.php';

if (isset($_POST['button']) && $_POST['button'] == "Actualizar"){
        
        $qry = mysql_query("SELECT * FROM utilizador WHERE id = ".(int)$_GET['id']);
        $linha1 = mysql_fetch_array($qry);

//Verifica se os campos a introduzir são diferentes
if ($_POST['senha'] != $linha1['senha'] || $_POST['login'] != $linha1['login'] || $_POST['nome'] != $linha1['nome']){

		mysql_query("UPDATE utilizador SET nome = '".mysql_real_escape_string($_POST['nome'])."', login = '".mysql_real_escape_string($_POST['login'])."', senha = '".md5($_POST['senha'])."' WHERE id = ".(int)$_GET['id']);

		header('location:edita_user.php?changeSuccess', true, 303);	 

}else{

		header('location:edita_user.php?changeFailed', true, 303);
}

}
?>

Está a aplicar a mesma md5 sobre md5.

echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.