AndreLC Posted February 23, 2012 at 10:58 PM Report Share #440936 Posted February 23, 2012 at 10:58 PM 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 More sharing options...
pmg Posted February 23, 2012 at 11:13 PM Report Share #440938 Posted February 23, 2012 at 11:13 PM 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 More sharing options...
AndreLC Posted February 23, 2012 at 11:26 PM Author Report Share #440942 Posted February 23, 2012 at 11:26 PM 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 More sharing options...
pedrosorio Posted February 23, 2012 at 11:37 PM Report Share #440943 Posted February 23, 2012 at 11:37 PM 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 Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
pmg Posted February 23, 2012 at 11:38 PM Report Share #440944 Posted February 23, 2012 at 11:38 PM 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 More sharing options...
AndreLC Posted February 23, 2012 at 11:48 PM Author Report Share #440946 Posted February 23, 2012 at 11:48 PM 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 More sharing options...
pedrosorio Posted February 23, 2012 at 11:51 PM Report Share #440948 Posted February 23, 2012 at 11:51 PM 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... Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
AndreLC Posted February 23, 2012 at 11:56 PM Author Report Share #440950 Posted February 23, 2012 at 11:56 PM 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 More sharing options...
pedrosorio Posted February 24, 2012 at 12:14 AM Report Share #440951 Posted February 24, 2012 at 12:14 AM 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 More sharing options...
AndreLC Posted February 24, 2012 at 12:38 AM Author Report Share #440953 Posted February 24, 2012 at 12:38 AM 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 More sharing options...
brunoais Posted February 24, 2012 at 06:53 AM Report Share #440970 Posted February 24, 2012 at 06:53 AM 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 . 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 More sharing options...
AndreLC Posted February 24, 2012 at 09:58 AM Author Report Share #440982 Posted February 24, 2012 at 09:58 AM 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 More sharing options...
brunoais Posted February 24, 2012 at 08:15 PM Report Share #441062 Posted February 24, 2012 at 08:15 PM 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 More sharing options...
AndreLC Posted February 25, 2012 at 03:07 AM Author Report Share #441100 Posted February 25, 2012 at 03:07 AM 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 More sharing options...
brunoais Posted February 25, 2012 at 08:57 AM Report Share #441108 Posted February 25, 2012 at 08:57 AM 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 More sharing options...
AndreLC Posted February 26, 2012 at 11:11 PM Author Report Share #441263 Posted February 26, 2012 at 11:11 PM 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 More sharing options...
yoda Posted February 27, 2012 at 03:37 PM Report Share #441336 Posted February 27, 2012 at 03:37 PM A confusão anula-se se for usada uma abordagem OOP. before you post, what have you tried? - http://filipematias.info sense, purpose, direction Link to comment Share on other sites More sharing options...
AndreLC Posted February 27, 2012 at 04:13 PM Author Report Share #441341 Posted February 27, 2012 at 04:13 PM A confusão anula-se se for usada uma abordagem OOP. Numa próxima abordagem irei optar por POO, mas neste projecto ainda não irei utilizar. Agradeço, se me puderem ajudar da maneira que está neste momento. echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious."; Link to comment Share on other sites More sharing options...
brunoais Posted February 28, 2012 at 02:34 PM Report Share #441460 Posted February 28, 2012 at 02:34 PM 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 More sharing options...
AndreLC Posted February 28, 2012 at 04:41 PM Author Report Share #441481 Posted February 28, 2012 at 04:41 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now