Peter Posted June 24, 2010 at 02:47 PM Report #335865 Posted June 24, 2010 at 02:47 PM sou grande newbie nisto eu sei ? function novapassword($password,$email) {//função de alteração da password mysql_select_db("belapizza", $this->ligacao) ; $query = "UPDATE users SET password = '".$password."' WHERE email= ".$email."" ; $resultado = mysql_query($query, $this->ligacao) ; } pa nao vejo o erro e ja passei 15 min a olhar pa isto no entanto tenho algo parecido noutro projecto que funciona muito bem function insert_into_aprovado($aprovado,$id) {//função de alteração da coluna aprovado mysql_select_db("calendario", $this->ligacao) ; $query = "UPDATE calendario SET aprovado = '".$aprovado."' WHERE id= ".$id."" ; $resultado = mysql_query($query, $this->ligacao) ; }
mjamado Posted June 24, 2010 at 02:51 PM Report #335866 Posted June 24, 2010 at 02:51 PM function novapassword($password,$email) {//função de alteração da password mysql_select_db("belapizza", $this->ligacao) ; $query = "UPDATE users SET password = '".$password."' WHERE email= ".$email."" ; $resultado = mysql_query($query, $this->ligacao) ; } pa nao vejo o erro e ja passei 15 min a olhar pa isto Em primeiro lugar, espero que não estejas a guardar as passwords em texto simples, mas sim uma hash delas! ? Depois, tens que colocar umas plicas à volta do e-mail, porque é uma string. no entanto tenho algo parecido noutro projecto que funciona muito bem function insert_into_aprovado($aprovado,$id) {//função de alteração da coluna aprovado mysql_select_db("calendario", $this->ligacao) ; $query = "UPDATE calendario SET aprovado = '".$aprovado."' WHERE id= ".$id."" ; $resultado = mysql_query($query, $this->ligacao) ; } Funciona porque o $id é numérico, ao contrário do e-mail (que é uma string). "Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.
IceBrain Posted June 24, 2010 at 02:52 PM Report #335867 Posted June 24, 2010 at 02:52 PM Já agora, espero que esses valores, caso venham do cliente ($_GET, $_POST, $_COOKIE, etc) tenham sido passados pela mysql_real_escape_string... ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps
Peter Posted June 24, 2010 at 02:56 PM Author Report #335868 Posted June 24, 2010 at 02:56 PM eu estou a usar addslashes() serve certo? o que eu tenho é um formulario de recuperação de password. é logo "directo". mas de qualquer forma nao sei passar para hash. é uma questão de procurar mas haverá problema de nao utilizar hash neste caso??
scorch Posted June 24, 2010 at 03:14 PM Report #335872 Posted June 24, 2010 at 03:14 PM Hash é só: (estas são as duas mais usadas, mas há mais.) sha1($variavel); //ou md5($variavel); PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
IceBrain Posted June 24, 2010 at 03:16 PM Report #335873 Posted June 24, 2010 at 03:16 PM eu estou a usar addslashes() serve certo? o mysql_real_escape_string "limpa" mais caracteres, por isso é mais segura. Visto que estás a usar diretamente as funções mysql_, não há vantagens em não usares essa. o que eu tenho é um formulario de recuperação de password. é logo "directo". mas de qualquer forma nao sei passar para hash. é uma questão de procurar mas haverá problema de nao utilizar hash neste caso?? Há, porque se alguém conseguir fazer uma SQL injection (e a regra é sempre assumir que sim), ficam logo com a pass. Passar por uma hash é muito mais seguro, principalmente se usares "sal" (http://www.mhavila.com.br/topicos/seguranca/senharmazena.html)Em geral, recuperação da pass é uma má ideia. Em vez disso, quando o utilizador se esquece da sua pass, devias criar uma nova pass aleatória e mandá-la para o mail. ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps
Peter Posted June 24, 2010 at 03:17 PM Author Report #335874 Posted June 24, 2010 at 03:17 PM mas isso não será igual? quem quiser hackear algo nao vai parar por ter de desencriptar algo
IceBrain Posted June 24, 2010 at 03:19 PM Report #335875 Posted June 24, 2010 at 03:19 PM mas isso não será igual? quem quiser hackear algo nao vai parar por ter de desencriptar algo "Desencriptar" uma hash significa gerar todas as passes possíveis até encontrar uma que tenha a mesma hash (não há nenhuma forma matemática de encontrar a pass original a partir da hash, porque ela perde dados ao transformar). Se usares sal, ele tem que repetir o processo para cada pass. Na prática, demoraria anos. ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps
mjamado Posted June 24, 2010 at 03:21 PM Report #335877 Posted June 24, 2010 at 03:21 PM mas isso não será igual? quem quiser hackear algo nao vai parar por ter de desencriptar algo As hashs não são passíveis de serem desencriptadas. Uma operação MD5 ou SHA1 é destrutiva, isto é, os dados originais são irrecuperáveis partindo do resultado final. A única hipótese é um ataque por rainbow table, mas aí é que entra o salt, que inutiliza as mesmas. A última hipótese é uma ataque brute force, mas ninguém faz isso (até porque é apanhado por DoS primeiro). "Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.
Peter Posted June 24, 2010 at 03:38 PM Author Report #335879 Posted June 24, 2010 at 03:38 PM As hashs não são passíveis de serem desencriptadas. Uma operação MD5 ou SHA1 é destrutiva, isto é, os dados originais são irrecuperáveis partindo do resultado final. A única hipótese é um ataque por rainbow table, mas aí é que entra o salt, que inutiliza as mesmas. A última hipótese é uma ataque brute force, mas ninguém faz isso (até porque é apanhado por DoS primeiro). sim mas eu pus o meu nome em MD5 fui a um site qualquer que apanhei no google a procurar md5 decrypter e aquilo retornou o meu nome
Peter Posted June 24, 2010 at 03:40 PM Author Report #335880 Posted June 24, 2010 at 03:40 PM o mysql_real_escape_string "limpa" mais caracteres, por isso é mais segura. Visto que estás a usar diretamente as funções mysql_, não há vantagens em não usares essa. Há, porque se alguém conseguir fazer uma SQL injection (e a regra é sempre assumir que sim), ficam logo com a pass. Passar por uma hash é muito mais seguro, principalmente se usares "sal" (http://www.mhavila.com.br/topicos/seguranca/senharmazena.html) Em geral, recuperação da pass é uma má ideia. Em vez disso, quando o utilizador se esquece da sua pass, devias criar uma nova pass aleatória e mandá-la para o mail. é isso que tou a fazer. já agora o codigo function generatePassword($length, $strength) { $vowels = 'aeuy'; $consonants = 'bdghjmnpqrstvz'; if ($strength & 1) { $consonants .= 'BDGHJLMNPQRSTVWXZ'; } if ($strength & 2) { $vowels .= "AEUY"; } if ($strength & 4) { $consonants .= '23456789'; } if ($strength & 8) { $consonants .= '@#$%'; } $password = ''; $alt = time() % 2; for ($i = 0; $i < $length; $i++) { if ($alt == 1) { $password .= $consonants[(rand() % strlen($consonants))]; $alt = 0; } else { $password .= $vowels[(rand() % strlen($vowels))]; $alt = 1; } } return $password; }
yoda Posted June 24, 2010 at 03:43 PM Report #335881 Posted June 24, 2010 at 03:43 PM sim mas eu pus o meu nome em MD5 fui a um site qualquer que apanhei no google a procurar md5 decrypter e aquilo retornou o meu nome porque mais gente fez o mesmo e o serviço guardou o hash associado ao original. before you post, what have you tried? - http://filipematias.info sense, purpose, direction
mjamado Posted June 24, 2010 at 03:51 PM Report #335882 Posted June 24, 2010 at 03:51 PM porque mais gente fez o mesmo e o serviço guardou o hash associado ao original. Exactamente, é uma rainbow table. Por isso é que se usa o salt. "Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.
Peter Posted June 24, 2010 at 03:54 PM Author Report #335883 Posted June 24, 2010 at 03:54 PM já percebi!! obrigado! _o_
IceBrain Posted June 24, 2010 at 04:08 PM Report #335885 Posted June 24, 2010 at 04:08 PM é isso que tou a fazer. já agora o codigo function generatePassword($length, $strength) { $vowels = 'aeuy'; $consonants = 'bdghjmnpqrstvz'; if ($strength & 1) { $consonants .= 'BDGHJLMNPQRSTVWXZ'; } if ($strength & 2) { $vowels .= "AEUY"; } if ($strength & 4) { $consonants .= '23456789'; } if ($strength & 8) { $consonants .= '@#$%'; } $password = ''; $alt = time() % 2; for ($i = 0; $i < $length; $i++) { if ($alt == 1) { $password .= $consonants[(rand() % strlen($consonants))]; $alt = 0; } else { $password .= $vowels[(rand() % strlen($vowels))]; $alt = 1; } } return $password; } Não é má, mas vai gerar sempre com uma consoante e uma vogal alternadamente, o que reduz a complexidade inutilmente. Eu uso esta, mas não tem parâmetros para complexidade: function makepass($length) { $chars = 'aeuybdghjmnpqrstvzAEUYBDGHJLMNPQRSTVWXZ23456789@#$%'; return implode('', array_rand(array_flip(str_split($chars)), $length)); } Já agora, quando enviares um mail, põe o link principal para a página de mudança de password (protegida pela nova pass, claro), porque senão o pessoal não a muda e depois estão sempre a recuperá-la 🙂 ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps
ResoDUTE Posted June 30, 2010 at 12:04 AM Report #336905 Posted June 30, 2010 at 12:04 AM Não é má, mas vai gerar sempre com uma consoante e uma vogal alternadamente, o que reduz a complexidade inutilmente. Eu uso esta, mas não tem parâmetros para complexidade: function makepass($length) { $chars = 'aeuybdghjmnpqrstvzAEUYBDGHJLMNPQRSTVWXZ23456789@#$%'; return implode('', array_rand(array_flip(str_split($chars)), $length)); } Já agora, quando enviares um mail, põe o link principal para a página de mudança de password (protegida pela nova pass, claro), porque senão o pessoal não a muda e depois estão sempre a recuperá-la 😄 E o porquê de não criar caracteres aleatórios? Caracteres esses, que nem o programador sabe a possível combinação? $salt=uniqid(mt_rand(), 2); //Output: Ex. 7025129634c2a88555cc6e8.48189020 encriptação de passwords com o salt: function encriptar($password){ $password=sha1($password.$salt); $password=md5($salt.$password); return $password; } Imaginemos que a password é: t3st3P@assword Um dos resultados prováveis com uma improvável combinação do uniqid: d38a9d8ed8dfc9f70432632d02864a31 Como o uniqid gera uma nova combinação sempre que é executado, recomendo que guardes o salt na BD junto com o utilizador... Assim, quando o user se tentar logar, vais buscar o SALT baseado no username, e juntas à PW e depois comparas o HASH que gerou com o hash que está associado ao user.
IceBrain Posted June 30, 2010 at 09:45 AM Report #336965 Posted June 30, 2010 at 09:45 AM E o porquê de não criar caracteres aleatórios? Caracteres esses, que nem o programador sabe a possível combinação? Já experimentaste o código sequer? <? function makepass($length) { $chars = 'aeuybdghjmnpqrstvzAEUYBDGHJLMNPQRSTVWXZ23456789@#$%'; return implode('', array_rand(array_flip(str_split($chars)), $length)); } echo makepass(40)."\n"; echo makepass(40)."\n"; echo makepass(40)."\n"; ?> Resultado: XvH3g2dpQ%WG46@MADqS8UYZ#zRN97mEjbe5LJ$a X#La5WSJyDmP9@N8u2%YtQThvrMGHzAUb6sZqRB7 73$vga5Anb%rpzjTMWu8URJLPN@Q69mS#EVsy4Bd Isto não é aleatório? Já agora, estás a usar o uniqid de forma incorrecta. A assinatura é uniqid (string $prefix, bool $more_entropy), portanto não faz sentido passar (int, int). ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps
ruidias Posted July 1, 2010 at 10:17 AM Report #337163 Posted July 1, 2010 at 10:17 AM Gente... Para quem não é um tarado por segurança, nem trabalha para a NASA, ou tão pouco necessita de um sistema maluco de gerar/guardar passwords, há uma forma bem mais simples e igualmente segura..... ...o próprio MySQL já inclui uma função de HASH que funciona muito bem para a grande maioria dos sites... ...a função chama-se (imagine-se) "Password", heheheeh Pegando no exemplo em cima, ficaria algo como: $query = "UPDATE users SET password = PASSWORD('".$password."') WHERE email= '".$email."';" ; Para verificar o user, ficaria algo como: $query = "SELECT * From users WHERE password = PASSWORD('".$password."') AND email= '".$email."';" ; 😄 simples, não acham??? Esta função é de HASH, portanto não pode ser revertida. Caso o user esqueça a pass, o site deverá gerar uma nova (aleatória) e devolver ao user, tal como já foi dito mais em cima. Abraço
mjamado Posted July 1, 2010 at 10:23 AM Report #337165 Posted July 1, 2010 at 10:23 AM ...o próprio MySQL já inclui uma função de HASH que funciona muito bem para a grande maioria dos sites... ...a função chama-se (imagine-se) "Password", heheheeh 😄 simples, não acham??? The PASSWORD() function is used by the authentication system in MySQL Server; you should not use it in your own applications. For that purpose, consider MD5() or SHA1() instead. Ler a documentação oficial do MySQL: simples, não acham? 👍 "Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.
ruidias Posted July 1, 2010 at 10:40 AM Report #337174 Posted July 1, 2010 at 10:40 AM Ler a documentação oficial do MySQL: simples, não acham? 😄 Eu escrevi bem.... não é para tarados pela segurança... nem para os sites da NASA... Na grande maioria dos sites a segurança não tem que ser algo por ai além... Com estas confusões que para ai Postaram não estão a prestar um bom serviço à comunidade (é a minha opinião). Desviaram-se COMPLETAMENTE da duvida inicial do rapaz.... Nota-se que é alguém que não está muito à vontade na programação (pelo tipo de duvida, a falta de plicas), logo, as respostas que aqui estão a ser dadas apenas servem para confundir... não há necessidade... Play it simple... keep it clean... Abraço
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