Advertisement
Guest User

Untitled

a guest
Jun 1st, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.29 KB | None | 0 0
  1. define( 'SECURITY_HASH', 'uma frase qualquer ou letras aleatórias com números e simbolos' )
  2.  
  3. id
  4. email
  5. username
  6. password
  7. keymaster
  8. last_ip
  9. last_access
  10. active
  11. created_at
  12. uptaded_at
  13.  
  14. if ( filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
  15. echo "This ($email_a) email address is considered valid.";
  16. }
  17.  
  18. crypt( rand(99999) . time() . $_SERVER["REMOTE_ADDR"], SECURITY_HASH );
  19.  
  20. crypt( rand(99999) . time() . $_SERVER["REMOTE_ADDR"], '$2a$07$' . SECURITY_HASH );
  21.  
  22. $_SERVER["REMOTE_ADDR"] // Obtem o IP do usuário
  23.  
  24. http://www.dominio.com.br/validateuser.php?key={hash do resultado da concatenação do keymaster e SECURITY_HASH}
  25.  
  26. $banco = new PDO(...);
  27. $comando = $banco->prepare("SELECT ID, NOME FROM USUARIOS WHERE LOGIN = :login AND SENHA = :senha");
  28.  
  29. // Vamos considerar que você já pegou o sal daquele usuário e já aplicou os esquemas.
  30. // Dá para fazer dentro do banco, se você preferir. É até melhor...
  31.  
  32. $comando->execute(array(':login' => $login, ':senha' => $senha_com_sal));
  33.  
  34. if ($comando->fetch()) { // Usuário logado!
  35.  
  36. } else { // Usuário incorreto ou a senha está incorreta!
  37.  
  38. }
  39.  
  40. CREATE DATABASE `secure_login`;
  41.  
  42. CREATE USER 'sec_user'@'localhost' IDENTIFIED BY 'eKcGZr59zAa2BEWU';
  43. GRANT SELECT, INSERT, UPDATE ON `secure_login`.* TO 'sec_user'@'localhost';
  44.  
  45. CREATE TABLE `secure_login`.`members` (
  46. `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  47. `username` VARCHAR(30) NOT NULL,
  48. `email` VARCHAR(50) NOT NULL,
  49. `password` CHAR(128) NOT NULL,
  50. `salt` CHAR(128) NOT NULL
  51. ) ENGINE = InnoDB;
  52.  
  53. CREATE TABLE `secure_login`.`login_attempts` (
  54. `user_id` int(11) NOT NULL,
  55. `time` VARCHAR(30) NOT NULL
  56. ) ENGINE=InnoDB
  57.  
  58. INSERT INTO `secure_login`.`members` VALUES(1, 'test_user', 'test@example.com', '00807432eae173f652f2064bdca1b61b290b52d40e429a7d295d76a71084aa96c0233b82f1feac45529e0726559645acaed6f3ae58a286b9f075916ebf66cacc', 'f9aab579fc1b41ed0c44fe4ecdbfcdb4cb99b9023abb241a6db833288f4eea3c02f76e0d35204a8695077dcf81932aa59006423976224be0390395bae152d4ef');
  59.  
  60. define("HOST", "localhost"); // O host no qual você deseja se conectar.
  61. define("USER", "sec_user"); // O nome de usuário do banco de dados.
  62. define("PASSWORD", "eKcGZr59zAa2BEWU"); // A senha do usuário do banco de dados.
  63. define("DATABASE", "secure_login"); // O nome do banco de dados.
  64.  
  65. $mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
  66. // 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.
  67.  
  68. function sec_session_start() {
  69. $session_name = 'sec_session_id'; // Define um nome padrão de sessão
  70. $secure = false; // Defina como true (verdadeiro) caso esteja utilizando https.
  71. $httponly = true; // Isto impede que o javascript seja capaz de acessar a id de sessão.
  72.  
  73. ini_set('session.use_only_cookies', 1); // Força as sessões a apenas utilizarem cookies.
  74. $cookieParams = session_get_cookie_params(); // Recebe os parâmetros atuais dos cookies.
  75. session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly);
  76. session_name($session_name); // Define o nome da sessão como sendo o acima definido.
  77. session_start(); // Inicia a sessão php.
  78. session_regenerate_id(true); // regenerada a sessão, deleta a outra.
  79. }
  80.  
  81. function login($email, $password, $mysqli) {
  82. // utilizar declarações preparadas significa que a injeção de código SQL não será possível.
  83. if ($stmt = $mysqli->prepare("SELECT id, username, password, salt FROM members WHERE email = ? LIMIT 1")) {
  84. $stmt->bind_param('s', $email); // Vincula "$email" ao parâmetro.
  85. $stmt->execute(); // Executa a query preparada.
  86. $stmt->store_result();
  87. $stmt->bind_result($user_id, $username, $db_password, $salt); // obtém variáveis do resultado.
  88. $stmt->fetch();
  89. $password = hash('sha512', $password.$salt); // confere o hash de "$password" e "$salt"
  90. if($stmt->num_rows == 1) { // se o usuário existe
  91. // Nós checamos se a conta está bloqueada devido a várias tentativas de login
  92. if(checkbrute($user_id, $mysqli) == true) {
  93. // Conta está bloqueada
  94. // Envia um email ao usuário comunicando que sua conta foi bloqueada
  95. return false;
  96. } else {
  97. if($db_password == $password) { // Checa se a senha na base de dados confere com a senha que o usuário digitou.
  98. // Senha está correta!
  99.  
  100. $ip_address = $_SERVER['REMOTE_ADDR']; // Pega o endereço IP do usuário.
  101. $user_browser = $_SERVER['HTTP_USER_AGENT']; // Pega a string de agente do usuário.
  102.  
  103. $user_id = preg_replace("/[^0-9]+/", "", $user_id); // Proteção XSS conforme poderíamos imprimir este valor
  104. $_SESSION['user_id'] = $user_id;
  105. $username = preg_replace("/[^a-zA-Z0-9_-]+/", "", $username); // Proteção XSS conforme poderíamos imprimir este valor
  106. $_SESSION['username'] = $username;
  107. $_SESSION['login_string'] = hash('sha512', $password.$ip_address.$user_browser);
  108. // Login com sucesso.
  109. return true;
  110. } else {
  111. // Senha não está correta
  112. // Nós armazenamos esta tentativa na base de dados
  113. $now = time();
  114. $mysqli->query("INSERT INTO login_attempts (user_id, time) VALUES ('$user_id', '$now')");
  115. return false;
  116. }
  117. }
  118. } else {
  119. // Nenhum usuário existe.
  120. return false;
  121. }
  122. }
  123. }
  124.  
  125. function checkbrute($user_id, $mysqli) {
  126. // Retorna a data atual
  127. $now = time();
  128. // Todas as tentativas de login são contadas pelas 2 últimas horas.
  129. $valid_attempts = $now - (2 * 60 * 60);
  130.  
  131. if ($stmt = $mysqli->prepare("SELECT time FROM login_attempts WHERE user_id = ? AND time > '$valid_attempts'")) {
  132. $stmt->bind_param('i', $user_id);
  133. // Executa a query preparada.
  134. $stmt->execute();
  135. $stmt->store_result();
  136. // Se houver mais de 5 tentativas falhas de login
  137. if($stmt->num_rows > 5) {
  138. return true;
  139. } else {
  140. return false;
  141. }
  142. }
  143. }
  144.  
  145. function login_check($mysqli) {
  146. // Verifica se todas as variáveis das sessões foram definidas
  147. if(isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) {
  148. $user_id = $_SESSION['user_id'];
  149. $login_string = $_SESSION['login_string'];
  150. $username = $_SESSION['username'];
  151. $ip_address = $_SERVER['REMOTE_ADDR']; // Pega o endereço IP do usuário
  152. $user_browser = $_SERVER['HTTP_USER_AGENT']; // Pega a string do usuário.
  153.  
  154. if ($stmt = $mysqli->prepare("SELECT password FROM members WHERE id = ? LIMIT 1")) {
  155. $stmt->bind_param('i', $user_id); // Atribui "$user_id" ao parâmetro
  156. $stmt->execute(); // Executa a tarefa atribuía
  157. $stmt->store_result();
  158.  
  159. if($stmt->num_rows == 1) { // Caso o usuário exista
  160. $stmt->bind_result($password); // pega variáveis a partir do resultado
  161. $stmt->fetch();
  162. $login_check = hash('sha512', $password.$ip_address.$user_browser);
  163. if($login_check == $login_string) {
  164. // Logado!!!
  165. return true;
  166. } else {
  167. // Não foi logado
  168. return false;
  169. }
  170. } else {
  171. // Não foi logado
  172. return false;
  173. }
  174. } else {
  175. // Não foi logado
  176. return false;
  177. }
  178. } else {
  179. // Não foi logado
  180. return false;
  181. }
  182. }
  183.  
  184. include 'db_connect.php';
  185. include 'functions.php';
  186. sec_session_start(); // Nossa segurança personalizada para iniciar uma sessão php.
  187.  
  188. if(isset($_POST['email'], $_POST['p'])) {
  189. $email = $_POST['email'];
  190. $password = $_POST['p']; // A senha em hash.
  191. if(login($email, $password, $mysqli) == true) {
  192. // Login com sucesso
  193. echo 'Sucesso: Você efetuou login.';
  194. } else {
  195. // Falha de login
  196. header('Lozalização: ./login.php?error=1');
  197. }
  198. } else {
  199. // As variáveis POST corretas não foram enviadas para esta página.
  200. echo 'Requisição Inválida';
  201. }
  202.  
  203. include 'functions.php';
  204. sec_session_start();
  205. // Zera todos os valores da sessão
  206. $_SESSION = array();
  207. // Pega os parâmetros da sessão
  208. $params = session_get_cookie_params();
  209. // Deleta o cookie atual.
  210. setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
  211. // Destrói a sessão
  212. session_destroy();
  213. header('Lozalização: ./');
  214.  
  215. // A senha em hash do formulário
  216. $password = $_POST['p'];
  217. // Cria um salt randômico
  218. $random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true));
  219. // Cria uma senha pós hash (Cuidado para não re-escrever)
  220. $password = hash('sha512', $password.$random_salt);
  221.  
  222. // Adicione sua inserção ao script de base de dados aqui
  223. // Certifique-se de utilizar declarações preparadas
  224. if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)")) {
  225. $insert_stmt->bind_param('ssss', $username, $email, $password, $random_salt);
  226. // Execute a query preparada.
  227. $insert_stmt->execute();
  228. }
  229.  
  230. function formhash(form, password) {
  231. // Cria um novo elemento de entrada, como um campo de entrada de senha sem hash.
  232. var p = document.createElement("input");
  233. // Adiciona o novo elemento ao nosso formulário.
  234. form.appendChild(p);
  235. p.name = "p";
  236. p.type = "hidden"
  237. p.value = hex_sha512(password.value);
  238. // Certifica que senhas em texto plano não sejam enviadas.
  239. password.value = "";
  240. // Finalmente, submete o formulário.
  241. form.submit();
  242. }
  243.  
  244. <script type="text/javascript" src="sha512.js"></script>
  245. <script type="text/javascript" src="forms.js"></script>
  246. <?php
  247. if(isset($_GET['error'])) {
  248. echo 'Erro ao Logar!';
  249. }
  250. ?>
  251. <form action="process_login.php" method="post" name="login_form">
  252. Email: <input type="text" name="email" /><br />
  253. Password: <input type="password" name="password" id="password"/><br />
  254. <input type="button" value="Login" onclick="formhash(this.form, this.form.password);" />
  255. </form>
  256.  
  257. // Inclua a conexão com a base de dados e as funções aqui.
  258. sec_session_start();
  259. if(login_check($mysqli) == true) {
  260.  
  261. // Adicione o conteúdo de sua página protegida aqui.
  262.  
  263. } else {
  264. echo 'Você não está autorizado a acessar esta página. Por favor, efetue login. <br/>';
  265. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement