Forget SHA1 and MD5
Before you start, it's good to make it clear. Do not use any of these encryption methods. You will understand why in the course of this answer.
Important information
I recommend that you read this response, then read this Thiago Belem article, then this article from the PHP documentation itself.
The links above will show why you should not use sha1 or MD5.
In the case of the second link I passed, do not just read, but execute what was taught and run again until you know what is being done. After that, I also recommend the process using the instructions from the third link, password_hash
I will not reinvent the wheel here, because the first link already has everything you need to know and the rest are the encryption exercises.
I'll give you an example solution for your case, simple and commented for you to understand. In the example I will use password_hash
, which is the safest method currently.
Example usage
No HTML
<form action="" method="post">
<label for="login">Login</label>
<input type="text" name="login" id="login">
<label for="senha">Senha</label>
<input type="password" name="password" id="password">
<button type="submit">Fazer login</button>
<input type="hidden" name="hidden" <?php echo "value='" . $_SESSION['formKey'] . "'" ?>>
</form>
No action
does not need to put anything, since we will use the same form page to validate the data.
If you've read the first link I've passed, you should know that the input field of type hidden
is used to make it difficult for% (Cross-site Request Forgery), where the form will only be validated if the value of ataques do tipo CSRF
is equal to the value of hidden
. Remember that this $_SESSION['formKey']
should be changed every time the page is updated, after passing the $_SESSION
method validation, of course. In PHP code you will understand.
I recommend that you read this article on CSRF attacks.
The labels issue is just an aspect of $_POST
, where you allow the user to click the label, and the focus is directed to the input.
In PHP
<?php
//Possibilita que trabalhemos com sessões, vai ser útil para validar o campo
//hidden, e também para manter o usuário logado no sistema.
//mas isso é outro ponto e não vou abordá-lo aqui.
session_start();
//Dados do banco
$hostname = 'localhost';
$username = 'root';
$password = '123456';
$database = 'meusite';
//Se conecta ao banco de dados
$mysql = mysqli_connect($hostname, $username, $password, $database);
mysqli_set_charset($mysql, 'utf8');
//Se o usuário clicar em submit, ele faz uma requisição POST e aciona
//essa condição
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
//Verifica se o valor do campo hidden bate com o valor da session.
if (isset($_POST['hidden']) && $_POST['hidden'] == $_SESSION['formKey']) {
//Verifica se existe um POST chamado login e senha respectivamente e,
//se existir, remove os espaços no começo e final da string usando a função
//trim() e atribui o valor deles as respectivas variáveis.
//Se não existir, define o valor da variável como null.
//Se não entendeu como funciona, pesquise sobre OPERADOR TERNÁRIO e função TRIM
$login = (isset($_POST['login'])) ? trim($_POST['login']) : null;
$password = (isset($_POST['password'])) ? trim($_POST['password']) : null;
if (empty($login)) {
//Se a variável $login estiver vazia, faça:
echo 'Por favor, preencha o campo de login';
exit;
}
if (empty($password)) {
//Se a variável $password estiver vazia, faça:
echo 'Por favor, preencha o campo de senha';
exit;
}
//Antes de comparar qualquer dado com o banco, fazemos escape para dificultar
//SQL injections.
$login = mysqli_real_escape_string($mysql, $login);
$password = mysqli_real_escape_string($mysql, $password);
//Seleciona os campos login e password na tabela usuarios, cujo login seja
//igual ao login informado no formulário.
//Lembre-se de marcar a coluna login no banco de dados como UNIQUE ID
//para que não seja possível existir mais de um login igual.
$result = mysqli_query($mysql,
"SELECT 'login', 'password' FROM 'usuarios' WHERE 'login' = '" . $login . "'");
if(!mysqli_num_rows($result)) {
echo "Usuário não encontrado";
exit;
} else {
//Coloca os dados retornados pelo banco em um array chamado $data
while ($r = mysqli_fetch_assoc($result)) {
$data[] = $r;
}
}
//Chegando neste ponto, entede-se que o login informado existe, agora temos que
//validar a senha.
//Vamos supor que você usou password_hash para criptografar a senha no
//momento do cadastro do usuário.
if (password_verify($password, $data[0]['password'])) {
echo "Logado com sucesso!";
} else {
echo "Senha incorreta!";
exit;
}
//Fazendo isso, estamos dizendo pro PHP verificar se a senha informada
//corresponde ao hash (senha criptografada) que estava no banco.
}
}
//Toda vez que ele atualizar a página, o value do campo hidden será alterado
//Abaixo fizemos o sha1 de um número randomico usando a função rand().
$_SESSION['formKey'] = sha1(rand());
//Eu usei sha1, porque? Simples. O valor do campo hidden não tem importancia
//pra gente. Ele não precisa ser seguro, até porque ele será visível caso
//o usuário clique em visualiar o código fonte, ele só precisa mudar e ser
//impossível de se acertar num "chute".
?>
The recipe for the cake is there, just use it.