Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Oi. no cadastro que tenho, eu cadastro as senhas no formato normal. então sem codificação alguma, por um lado me facilita, pois uso o recuperar senha, mas acho muito vulnerável. Como faço para cadastrar em md5 ou sha1? Seria o mesmo procedimento para ambos também?
No inserir ele está assim:
>
$_POST[form_login]','$_POST[form_senha]'
Já na edição ele está assim:
>
login='$_POST[form_login]',senha='$_POST[form_senha]'
Depois terei de fazer um redefinir senha, já que o recuperar não terá mais como ser usado trocando para md5 ou sha1
Se possível alguém puder me ajudar no exemplo que citei eu agradeço.
É só gerar o hash ao salvar no banco.
Na hora do login, gere o hash da senha digitada e o compare com o hash do banco
Mais detalhes neste artigo:
Ok, já me disseram em outro fórum como gravar em md5. Responderam o que eu precisava simplesmente.
Ah isso é bem simples, e outra md5 não é seguro, qualquer programa besta vai conseguir quebrar suas senhas..
E que forma de programar é essa?
login='$_POST[form_login]',senha='$_POST[form_senha]'
Desculpa pela forma de falar mas seria bom você ler o que Beraldo te mandou lá no link, eu aprendi muito com ele.
Nós queremos te passar a melhor forma possível do php..
Depois de você ler e comparar o que está fazendo vai ver que melhorar a segurança de seu
sistema vale muito a pena, isso por que ainda não teve a sorte de algum engraçado tentar algo nele.
Existe funções prontas que usar uma key para gerar a senha com encrypt única do seu sistema..
Qualquer coisa eu te mando a função por PM. marque o tópico como resolvido :)
Primeiro, esse cadastro que tenho vai ser trocado, então vai ficar como backup por uns tempos. Ele já está depreciado e não há interesse de fazer grandes melhorias nele. Então mudar todo o sistema que já vai ficar em desuso não da. Pedi uma coisa. Infelizmente aqui você pedi uma coisa e te mandam coisas que não estão nas suas necessidades..
Vale a dica sempre, mas sempre tem que focar na necessidade que a pessoa precisa. Estou precisando de algo mínimo para algo que não quero fazer mudanças maiores, me dão dicas para eu alterar várias coisas e o que pedi é deixado de lado. Aí nem adianta fórum para se ajudar.
>
Primeiro, esse cadastro que tenho vai ser trocado, então vai ficar como backup por uns tempos. Ele já está depreciado e não há interesse de fazer grandes melhorias nele. Então mudar todo o sistema que já vai ficar em desuso não da. Pedi uma coisa. Infelizmente aqui você pedi uma coisa e te mandam coisas que não estão nas suas necessidades..
Vale a dica sempre, mas sempre tem que focar na necessidade que a pessoa precisa. Estou precisando de algo mínimo para algo que não quero fazer mudanças maiores, me dão dicas para eu alterar várias coisas e o que pedi é deixado de lado. Aí nem adianta fórum para se ajudar.
require_once 'conexao-pdo.php';
$sql = "INSERT INTO `usuarios` (`usuario`, `senha`, `nivel`) VALUES (:usuario, :senha, :nivel)";
$stmt = $PDO->prepare($sql);
$stmt->bindParam(':usuario', $_POST['login']);
$stmt->bindParam(':senha', SHA1($senha));
$stmt->bindParam(':nivel', $_POST['nivel']);
$result = $stmt->execute();
if (!$result) {
var_dump($stmt->errorInfo());
exit;
}
Acho que é isso que vc quer. SO mudar os camposObrigada, mas já consegui a solução intermediária, e em PDO não ia me adiantar de nada. A solução tinha de ser dentro do que mostrei.
Apenas uma dúvida agora. O que adianta se criptografar uma senha, se caso o hacker ou pessoa com mais habilidade tiver acesso aos seus dados no banco?
Se codificar. Em um exemplo, se a pessoa cadastra uma senha simples. admin
Senha admin, e codificada no md5 por exemplo seria 21232f297a57a5a743894a0e4a801fc3
Se a pessoa adivinhar a senha, de nada adianta codificação seja ela em md5, sha1 ou esse hash.
Por outro lado se ele não adivinha a senha ou não descobre a senha, e ele visualiza essa senha no banco, ele simplesmente pega a senha codificada no banco e joga no campo de senha no login. Ele entra da mesma forma. E pra que ele vai querer descodificar essa senha se ela codificada já é a própria senha que ele faz o que quer?
Só me expliquem isso quem souber
Primeiramente, o link que te passei mostra exatamente como salvar um hash. É um artigo completo sobre Sistema De Login, que, dentre outras coisas, responde 100% à sua dúvida.
Em nenhum momento mostrei algo fora da sua pergunta. Você que não quis ler o artigo. São coisas diferentes.
Sobre sua última dúvida, o hash de um hash é um valor totalmente diferente. Ou seja, se um hacker sabe o hash da senha, se ele digitar esse hash no login, será gerado outro hash, que resultará em senha inválida.
Veja:
php > $password = 'Wjd7c$';
php > echo md5($password);
0a482eae67403ffc6bdcb0a576ecc4e7
php > echo md5('0a482eae67403ffc6bdcb0a576ecc4e7');
ed1142e01d8b93cc70edc47bc8891231
A senha "Wjd7c$" gera o hash "0a482eae67403ffc6bdcb0a576ecc4e7". O hash disso (que equivale a digitar esse valor no campo senha) gera o hash "ed1142e01d8b93cc70edc47bc8891231"
E outra: se um hacker acessa seu banco, não há motivos para ele querer fazer login. Acessar o banco significa acessar 100% do seu sistema, somente por que não está "bonitinho na tela". Por isso Segurança é tão importante.
Então na verdade essas codificações não adiantam de nada. Pois se a pessoa coloca uma senha fácil, de nada adianta, pois a codificação vai apenas a mascarar no banco, coisa que o hacker pode ter mais dificuldade de acessar,
Não entendo bem está parte, mas acaba que acho mais seguro que qualquer tipo de codificação dessas, aumentar o nível no login. Ao invez de codificação, colocar mais coisas. não só login e senha, mas ter um painel com login, senha e outro dado qualquer. Acho que isso aumenta muito mais a segurança que codificações que mascaram aonde a pessoa não ve mesmo. E a pessoa vai nas tentativas de senhas fáceis.
Consegui gravar perfeitamente a senha md5 no banco, porém creio que tenho de na hora de se logar fazer essa verificação no painel de logiin.
Ele está como abaixo.
>
<?
include "../config.php";
if ($_GET[acao] == "sair") {
unset($_SESSION['cliente']);
unset($_SESSION['id_cliente']);
echo "<script>window.location='index.php';</script>";
}
$sql = mysql_query("SELECT * FROM clientes WHERE login='$_POST[login]' AND senha='$_POST[senha]' AND ativo");
if (!@mysql_result($sql,0,cliente)) {
echo "<script>window.location='index.php?erro=sim';</script>";
} else {
$_SESSION['cliente'] = mysql_result($sql,0,cliente);
$_SESSION['id_cliente'] = mysql_result($sql,0,id_cliente);
echo "<script>window.location='index.php';</script>";
}
mysql_close();
?>Senhas fáceis são facilmente quebradas. Isso é fato e independe de hash ou criptografia. Um simples brute force faz isso, mesmo sem acesos ao banco.
Por isso é recomendável forçar o usuário a inserir senhas com 8 ou mais caracteres, com letras e números.
Acesso a um banco com senhas em hash é muito menos prejudicial que acesso a um banco com senhas em plain text. Quebrar um hash só é possível com brute-force. Ou seja, se forem hashes de senhas complexas, há poucas chances de que eles sejam quebrados.
Em suma, a Segurança depende de você e do usuário também.
Sobre esse "algo mais" que comentou, um simples salt muda totalmente o hash.
Veja
php > echo md5('123');
202cb962ac59075b964b07152d234b70
php > echo md5('123' . '8uha93');
14925075e7d7f2df20ee429899efcccf
O "8uha93" muda o hash e torna o brute-force mais complexo.
Falo sobre isso neste artigo: http://rberaldo.com.br/seguranca-em-sistemas-de-login-senhas-e-cookies/
Então, li sobre tudo para entender um pouco. Consegui fazer a inserção no banco em md5, fiz uma mudança na página de login, e com isso também resolvido me logar a senha estando em md5.
Mas no update não consigo gravar a senha em md5, tentei várias formas e nada. Meu update está assim.
> if ($_POST[Alterar] == "ok") {
mysql_query("UPDATE clientes SET cliente='$_POST[cliente]',nome='$_POST[nome]',email='$_POST[',telefone='$_POST[telefone]',celular='$_POST[celular]',sexo='$_POST[sexo]'cpf='$_POST[cpf]',login='$_POST[login]',senha='$_POST[senha]',obs='$_POST[obs]',ativo='$_POST[ativo]' WHERE id_cliente=$_POST[id]");](mailto:)Faça debug das suas consultas.
Use mysql_error(). Issi é mostrado neste tópico
Um erro é este:
'$_POST[sexo]'cpf
Faltou uma vírgula antes de "cpf"
E seu código está vulnerável a SQL Injection. Nunca insira um dado externo diretamente em uma query.
Veja mais aqui: http://rberaldo.com.br/seguranca-em-sistemas-de-login-protecao-contra-sql-injection/
if ($_POST[Alterar] == "ok") {
mysql_query("UPDATE clientes SET cliente='$_POST[cliente]',nome='$_POST[nome]',email='$_POST[email]',telefone='$_POST[telefone]',celular='$_POST[celular]',sexo='$_POST[sexo]',cpf='$_POST[cpf]',login='$_POST[login]',senha='md5($_POST[senha])',obs='$_POST[obs]',ativo='$_POST[ativo]' WHERE id_cliente=$_POST[id]");
faltou o md5()
Beraldo como ela já disse, ela não quer modificar o sistema dela.. ela já sabe as consequências..
Beraldo, esse vírgula errei quando postei aqui e fui ajustar, no sistema está tudo ok.
BlackMix, isso já tentei com o md5 ali, mas ele continua a gravar normal sem criptografar. O problema está sendo justamente esse, no Update não grava criptografado, no insert fiz normalmente. Colocar o md5 ali não adianta de nada.
tente assim
if ($_POST[Alterar] == "ok") {
$newpass = md5($_POST['senha']);
mysql_query("UPDATE clientes SET
cliente='$_POST[cliente]',
nome='$_POST[nome]',
email='$_POST[email]',
telefone='$_POST[telefone]',
celular='$_POST[celular]',
sexo='$_POST[sexo]',
cpf='$_POST[cpf]',
login='$_POST[login]',
senha='$newpass',
obs='$_POST[obs]',
ativo='$_POST[ativo]'
WHERE
id_cliente=$_POST[id]");>
tente assim
if ($_POST[Alterar] == "ok") {
$newpass = md5($_POST['senha']);
mysql_query("UPDATE clientes SET
cliente='$_POST[cliente]',
nome='$_POST[nome]',
email='$_POST[email]',
telefone='$_POST[telefone]',
celular='$_POST[celular]',
sexo='$_POST[sexo]',
cpf='$_POST[cpf]',
login='$_POST[login]',
senha='$newpass',
obs='$_POST[obs]',
ativo='$_POST[ativo]'
WHERE
id_cliente=$_POST[id]");
Perfeito, assim funcionou. Eu só estava conseguindo fazer no insert, talvez pelo tratamento, mas com o update não ia de jeito nenhum.
Mas agora tentei entrar para testar e não consigo. o login dele é este.
>
<?
include "../config.php";
if ($_GET[acao] == "sair") {
unset($_SESSION['cliente']);
unset($_SESSION['id_cliente']);
echo "<script>window.location='index.php';</script>";
}
$sql = mysql_query("SELECT * FROM clientes WHERE login='$_POST[login]' AND senha='$_POST[senha]' AND ativo");
if (!@mysql_result($sql,0,cliente)) {
echo "<script>window.location='index.php?erro=sim';</script>";
} else {
$_SESSION['cliente'] = mysql_result($sql,0,cliente);
$_SESSION['id_cliente'] = mysql_result($sql,0,id_cliente);
echo "<script>window.location='index.php';</script>";
}
mysql_close();
?>
Alterei para isso.
>
<?
include "../config.php";
if ($_GET[acao] == "sair") {
unset($_SESSION['cliente']);
unset($_SESSION['id_cliente']);
** $senha = md5($_POST['senha']);**
echo "<script>window.location='index.php';</script>";
}
$sql = mysql_query("SELECT * FROM clientes WHERE **login = '$login' AND senha = '$senha' AND ativo"**);
if (!@mysql_result($sql,0,cliente)) {
echo "<script>window.location='index.php?erro=sim';</script>";
} else {
$_SESSION['cliente'] = mysql_result($sql,0,cliente);
$_SESSION['id_cliente'] = mysql_result($sql,0,id_cliente);
echo "<script>window.location='index.php';</script>";
}
mysql_close();
?>
Mas não está entrando. Quando acerto algo outra da errado.
Mas está gravando certinho da forma que você explicou
>
tente assim
if ($_POST[Alterar] == "ok") {
$newpass = md5($_POST['senha']);
mysql_query("UPDATE clientes SET
cliente='$_POST[cliente]',
nome='$_POST[nome]',
email='$_POST[email]',
telefone='$_POST[telefone]',
celular='$_POST[celular]',
sexo='$_POST[sexo]',
cpf='$_POST[cpf]',
login='$_POST[login]',
senha='$newpass',
obs='$_POST[obs]',
ativo='$_POST[ativo]'
WHERE
id_cliente=$_POST[id]");
BlackMix, consegui resolver aqui a parte de login. Muito obrigada mesmo a ti e ao Beraldo também.
Sua dica aqui foi fundamental.
Você gerou o md5 no bloco que faz logout
Ou seja, $senha não existe e vai valor vazio para o SELECT
Se você habilitasse todas as exibições de erro, como mostrado neste tópico, na Orientação No. 3, como já foi sugerido antes, uma mensagem de aviso já teria sido exibida para alertá-la sobre o problema...
Mas não tinha problema algum. Apenas eu não sabia como gravar. Solucionado.
Só reabrindo aqui.
kkkkkkk, Mas como eu não deixo de editar a senha?
se eu coloco uma senha admin por exemplo, ele gera isso em sha1 d033e22ae348aeb5660fc2140aec35850c4da997
Até aí tudo bem, mas quando eu vou editar qualquer item do cadastro, ele altera essa senha. dessa d033e22ae348aeb5660fc2140aec35850c4da997 ele gera outra senha 7b2e9f54cdff413fcde01f330af6896c3cd7e6cd
Aí não consigo mais entrar no cadastro, pois ele já gera outra senha que nem sei o que é;
Oh loco.....
<?
include "../config.php";
if ($_GET[acao] == "sair") {
unset($_SESSION['cliente']);
unset($_SESSION['id_cliente']);
//$senha = md5($_POST['senha']); Aqui não lol
echo "<script>window.location='index.php';</script>";
}
$name = $_POST['login'];
$pass = md5($_POST['senha']); // Aqui Sim :)
$sql = mysql_query("SELECT * FROM clientes WHERE login='$name' AND senha='$pass' AND ativo");
if (!@mysql_result($sql,0,cliente)) {
echo "<script>window.location='index.php?erro=sim';</script>";
} else {
$_SESSION['cliente'] = mysql_result($sql,0,cliente);
$_SESSION['id_cliente'] = mysql_result($sql,0,id_cliente);
echo "<script>window.location='index.php';</script>";
}
mysql_close();
?>
Assim deve funcionar..
Baraldo já tinha falado que estava no lugar errado.
O problema mesmo é que esse jeito de programar já é deprecado..
Caso o php atualize no servidor vai parar tudo.
Pelo que entendi, o problema é outro: só deve incluir a senha no UPDATe se uma nova senha for digitada.
Para isso, é só fazer um if:
$sql = "UPDATE ... SET campo1 = valor";
if (!empty($_POST['senha']))
{
$sql .= ", senha = '" . md5($_POST['senha']) . "'";
}
$sql .= " WHERE id = <id_do_usuario>";
Assim, só é editada a senha se o usuário digitar um novo valor a ela
Utilize as funções abaixo, são muito mais seguras.
http://php.net/manual/pt_BR/function.password-hash.php
http://php.net/manual/pt_BR/function.password-verify.php