Jump to content

Query UPDATE não funciona e nao vejo o erro


Peter
 Share

Recommended Posts

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) ;
	}
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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??

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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;
}
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

é 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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

...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.

Link to comment
Share on other sites

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

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.