Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- define( 'SECURITY_HASH', 'uma frase qualquer ou letras aleatórias com números e simbolos' )
- id
- email
- username
- password
- keymaster
- last_ip
- last_access
- active
- created_at
- uptaded_at
- if ( filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
- echo "This ($email_a) email address is considered valid.";
- }
- crypt( rand(99999) . time() . $_SERVER["REMOTE_ADDR"], SECURITY_HASH );
- crypt( rand(99999) . time() . $_SERVER["REMOTE_ADDR"], '$2a$07$' . SECURITY_HASH );
- $_SERVER["REMOTE_ADDR"] // Obtem o IP do usuário
- http://www.dominio.com.br/validateuser.php?key={hash do resultado da concatenação do keymaster e SECURITY_HASH}
- $banco = new PDO(...);
- $comando = $banco->prepare("SELECT ID, NOME FROM USUARIOS WHERE LOGIN = :login AND SENHA = :senha");
- // Vamos considerar que você já pegou o sal daquele usuário e já aplicou os esquemas.
- // Dá para fazer dentro do banco, se você preferir. É até melhor...
- $comando->execute(array(':login' => $login, ':senha' => $senha_com_sal));
- if ($comando->fetch()) { // Usuário logado!
- } else { // Usuário incorreto ou a senha está incorreta!
- }
- CREATE DATABASE `secure_login`;
- CREATE USER 'sec_user'@'localhost' IDENTIFIED BY 'eKcGZr59zAa2BEWU';
- GRANT SELECT, INSERT, UPDATE ON `secure_login`.* TO 'sec_user'@'localhost';
- CREATE TABLE `secure_login`.`members` (
- `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
- `username` VARCHAR(30) NOT NULL,
- `email` VARCHAR(50) NOT NULL,
- `password` CHAR(128) NOT NULL,
- `salt` CHAR(128) NOT NULL
- ) ENGINE = InnoDB;
- CREATE TABLE `secure_login`.`login_attempts` (
- `user_id` int(11) NOT NULL,
- `time` VARCHAR(30) NOT NULL
- ) ENGINE=InnoDB
- INSERT INTO `secure_login`.`members` VALUES(1, 'test_user', 'test@example.com', '00807432eae173f652f2064bdca1b61b290b52d40e429a7d295d76a71084aa96c0233b82f1feac45529e0726559645acaed6f3ae58a286b9f075916ebf66cacc', 'f9aab579fc1b41ed0c44fe4ecdbfcdb4cb99b9023abb241a6db833288f4eea3c02f76e0d35204a8695077dcf81932aa59006423976224be0390395bae152d4ef');
- define("HOST", "localhost"); // O host no qual você deseja se conectar.
- define("USER", "sec_user"); // O nome de usuário do banco de dados.
- define("PASSWORD", "eKcGZr59zAa2BEWU"); // A senha do usuário do banco de dados.
- define("DATABASE", "secure_login"); // O nome do banco de dados.
- $mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
- // Se você estiver se conectando via TCP/IP ao invés de um socket UNIX, lembre-se de adicionar o número da porta como um parâmetro.
- function sec_session_start() {
- $session_name = 'sec_session_id'; // Define um nome padrão de sessão
- $secure = false; // Defina como true (verdadeiro) caso esteja utilizando https.
- $httponly = true; // Isto impede que o javascript seja capaz de acessar a id de sessão.
- ini_set('session.use_only_cookies', 1); // Força as sessões a apenas utilizarem cookies.
- $cookieParams = session_get_cookie_params(); // Recebe os parâmetros atuais dos cookies.
- session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly);
- session_name($session_name); // Define o nome da sessão como sendo o acima definido.
- session_start(); // Inicia a sessão php.
- session_regenerate_id(true); // regenerada a sessão, deleta a outra.
- }
- function login($email, $password, $mysqli) {
- // utilizar declarações preparadas significa que a injeção de código SQL não será possível.
- if ($stmt = $mysqli->prepare("SELECT id, username, password, salt FROM members WHERE email = ? LIMIT 1")) {
- $stmt->bind_param('s', $email); // Vincula "$email" ao parâmetro.
- $stmt->execute(); // Executa a query preparada.
- $stmt->store_result();
- $stmt->bind_result($user_id, $username, $db_password, $salt); // obtém variáveis do resultado.
- $stmt->fetch();
- $password = hash('sha512', $password.$salt); // confere o hash de "$password" e "$salt"
- if($stmt->num_rows == 1) { // se o usuário existe
- // Nós checamos se a conta está bloqueada devido a várias tentativas de login
- if(checkbrute($user_id, $mysqli) == true) {
- // Conta está bloqueada
- // Envia um email ao usuário comunicando que sua conta foi bloqueada
- return false;
- } else {
- if($db_password == $password) { // Checa se a senha na base de dados confere com a senha que o usuário digitou.
- // Senha está correta!
- $ip_address = $_SERVER['REMOTE_ADDR']; // Pega o endereço IP do usuário.
- $user_browser = $_SERVER['HTTP_USER_AGENT']; // Pega a string de agente do usuário.
- $user_id = preg_replace("/[^0-9]+/", "", $user_id); // Proteção XSS conforme poderíamos imprimir este valor
- $_SESSION['user_id'] = $user_id;
- $username = preg_replace("/[^a-zA-Z0-9_-]+/", "", $username); // Proteção XSS conforme poderíamos imprimir este valor
- $_SESSION['username'] = $username;
- $_SESSION['login_string'] = hash('sha512', $password.$ip_address.$user_browser);
- // Login com sucesso.
- return true;
- } else {
- // Senha não está correta
- // Nós armazenamos esta tentativa na base de dados
- $now = time();
- $mysqli->query("INSERT INTO login_attempts (user_id, time) VALUES ('$user_id', '$now')");
- return false;
- }
- }
- } else {
- // Nenhum usuário existe.
- return false;
- }
- }
- }
- function checkbrute($user_id, $mysqli) {
- // Retorna a data atual
- $now = time();
- // Todas as tentativas de login são contadas pelas 2 últimas horas.
- $valid_attempts = $now - (2 * 60 * 60);
- if ($stmt = $mysqli->prepare("SELECT time FROM login_attempts WHERE user_id = ? AND time > '$valid_attempts'")) {
- $stmt->bind_param('i', $user_id);
- // Executa a query preparada.
- $stmt->execute();
- $stmt->store_result();
- // Se houver mais de 5 tentativas falhas de login
- if($stmt->num_rows > 5) {
- return true;
- } else {
- return false;
- }
- }
- }
- function login_check($mysqli) {
- // Verifica se todas as variáveis das sessões foram definidas
- if(isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) {
- $user_id = $_SESSION['user_id'];
- $login_string = $_SESSION['login_string'];
- $username = $_SESSION['username'];
- $ip_address = $_SERVER['REMOTE_ADDR']; // Pega o endereço IP do usuário
- $user_browser = $_SERVER['HTTP_USER_AGENT']; // Pega a string do usuário.
- if ($stmt = $mysqli->prepare("SELECT password FROM members WHERE id = ? LIMIT 1")) {
- $stmt->bind_param('i', $user_id); // Atribui "$user_id" ao parâmetro
- $stmt->execute(); // Executa a tarefa atribuía
- $stmt->store_result();
- if($stmt->num_rows == 1) { // Caso o usuário exista
- $stmt->bind_result($password); // pega variáveis a partir do resultado
- $stmt->fetch();
- $login_check = hash('sha512', $password.$ip_address.$user_browser);
- if($login_check == $login_string) {
- // Logado!!!
- return true;
- } else {
- // Não foi logado
- return false;
- }
- } else {
- // Não foi logado
- return false;
- }
- } else {
- // Não foi logado
- return false;
- }
- } else {
- // Não foi logado
- return false;
- }
- }
- include 'db_connect.php';
- include 'functions.php';
- sec_session_start(); // Nossa segurança personalizada para iniciar uma sessão php.
- if(isset($_POST['email'], $_POST['p'])) {
- $email = $_POST['email'];
- $password = $_POST['p']; // A senha em hash.
- if(login($email, $password, $mysqli) == true) {
- // Login com sucesso
- echo 'Sucesso: Você efetuou login.';
- } else {
- // Falha de login
- header('Lozalização: ./login.php?error=1');
- }
- } else {
- // As variáveis POST corretas não foram enviadas para esta página.
- echo 'Requisição Inválida';
- }
- include 'functions.php';
- sec_session_start();
- // Zera todos os valores da sessão
- $_SESSION = array();
- // Pega os parâmetros da sessão
- $params = session_get_cookie_params();
- // Deleta o cookie atual.
- setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
- // Destrói a sessão
- session_destroy();
- header('Lozalização: ./');
- // A senha em hash do formulário
- $password = $_POST['p'];
- // Cria um salt randômico
- $random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true));
- // Cria uma senha pós hash (Cuidado para não re-escrever)
- $password = hash('sha512', $password.$random_salt);
- // Adicione sua inserção ao script de base de dados aqui
- // Certifique-se de utilizar declarações preparadas
- if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)")) {
- $insert_stmt->bind_param('ssss', $username, $email, $password, $random_salt);
- // Execute a query preparada.
- $insert_stmt->execute();
- }
- function formhash(form, password) {
- // Cria um novo elemento de entrada, como um campo de entrada de senha sem hash.
- var p = document.createElement("input");
- // Adiciona o novo elemento ao nosso formulário.
- form.appendChild(p);
- p.name = "p";
- p.type = "hidden"
- p.value = hex_sha512(password.value);
- // Certifica que senhas em texto plano não sejam enviadas.
- password.value = "";
- // Finalmente, submete o formulário.
- form.submit();
- }
- <script type="text/javascript" src="sha512.js"></script>
- <script type="text/javascript" src="forms.js"></script>
- <?php
- if(isset($_GET['error'])) {
- echo 'Erro ao Logar!';
- }
- ?>
- <form action="process_login.php" method="post" name="login_form">
- Email: <input type="text" name="email" /><br />
- Password: <input type="password" name="password" id="password"/><br />
- <input type="button" value="Login" onclick="formhash(this.form, this.form.password);" />
- </form>
- // Inclua a conexão com a base de dados e as funções aqui.
- sec_session_start();
- if(login_check($mysqli) == true) {
- // Adicione o conteúdo de sua página protegida aqui.
- } else {
- echo 'Você não está autorizado a acessar esta página. Por favor, efetue login. <br/>';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement