로그인 스크립트에 password_verify를 넣을 위치는 어디입니까?
PHP로그인 스크립트에 password_verify를 넣을 위치는 어디입니까?
또 다른 밤, 또 다른 질문!
암호가 일반 텍스트 인 경우 잘 작동하는 로그인 페이지를 만들었습니다.
내가 가진 문제는 내 가입 양식이 password_hash를 사용하여 암호화 된 암호를 테이블에 입력한다는 것입니다.
내 현재 스크립트는 아래에 있습니다.
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
<?php
session_start();
if(isset($_POST['email'], $_POST['password'])){
require('../../../private_html/db_connection/connection.php');
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = $conn->prepare("SELECT * FROM user_accounts WHERE email=:email AND password=:password");
$query->bindParam(':email', $_POST['email']);
$query->bindParam(':password', $_POST['password']);
$query->execute();
if($row = $query->fetch()){
$_SESSION['email'] = $row['email'];
$_SESSION['first_name'] = $row['first_name'];
header("Location: ../../myaccount/myaccount.php");
}
else {header("Location:../../login/login.php ");}
}
?>
이 질문에 대한 몇 가지 질문이 있습니다.
미리 감사드립니다.
CyrilWalrus
해결법
-
==============================
1.코드를 읽기 전에 위조 등록 블록이 코드에 없지만이 코드를 철저하게 보여줄 필요가 있음을 명심하십시오.
코드를 읽기 전에 위조 등록 블록이 코드에 없지만이 코드를 철저하게 보여줄 필요가 있음을 명심하십시오.
<?php session_start(); // Begin Vault // credentials from a secure Vault, not hard-coded $servername="localhost"; $dbname="login_system"; $username="dbUserName"; $password="dbPassword"; // End Vault // The following two variables would come from your form, naturally // as $_POST[] $formEmail="jsmith123@gmail.com"; $ctPassword="¿^?fish╔&®)"; // clear text password try { #if(isset($_POST['email'], $_POST['password'])){ #require('../../../private_html/db_connection/connection.php'); $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Begin Fake Registration // fake it that user already had password set (from some registration insert routine) // the registration routine had SSL/TLS, safely passing bound parameters. $hp=password_hash($ctPassword,PASSWORD_DEFAULT); // hashed password, using $conn->query("delete from user_accounts where email='jsmith123@gmail.com'"); $conn->query("insert user_accounts(first_name,last_name,email,password) values ('joe','smith','jsmith123@gmail.com','$hp')"); // we are done assuming we had a registration for somewhere in your system // End Fake Registration $query = $conn->prepare("SELECT * FROM user_accounts WHERE email=:email"); $query->bindParam(':email', $formEmail); $query->execute(); unset($_SESSION['email']); unset($_SESSION['first_name']); if(($row = $query->fetch()) && (password_verify($ctPassword,$row['password']))){ $_SESSION['email'] = $row['email']; $_SESSION['first_name'] = $row['first_name']; //header("Location: ../../myaccount/myaccount.php"); echo "hurray, you authenticated.<br/>"; } else { //header("Location:../../login/login.php "); echo "invalid login<br/>"; } #} } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); exit(); } ?>
브라우저 출력 :
password_hash () 함수는 명백한 것처럼 임의의 소금을 사용합니다. 이러한 해시 된 암호와 같은 clearText 입력으로 변경되는 해시 된 암호로 여러 번 실행하면 다음과 같이됩니다.
$2y$10$KywNHrGiPaK9JaWvOrc8UORdT8UXe60I2Yvj86NGzdUH1uLITJv/q $2y$10$vgJnAluvhfdwerIX3pAJ0u2UKi3J.pfvd0vIqAwL0Pjr/A0AVwatW
두 가지 모두 동일한 텍스트 암호에 대한 후속 해싱의 결과입니다. 소금 및 해시 비용은 해시 된 암호로 구워지고 저장됩니다. 이 전화는 아래의 링크에서 모두 읽으십시오.
Manual password_hash 및 password_verify에서.
create table user_accounts ( id int auto_increment primary key, first_name varchar(50) not null, last_name varchar(50) not null, email varchar(100) not null, password varchar(255) not null );
-
==============================
2.
$query = $conn->prepare("SELECT * FROM user_accounts WHERE email=?"); $query->execute([$_POST['email']]); if($row = $query->fetch() && password_verify($_POST['password'], $row['password'])){ $_SESSION['user'] = $row;
from https://stackoverflow.com/questions/32554085/where-to-put-password-verify-in-login-script by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
어떻게 링크에서 $ _GET 변수를 부트 스트랩 모달로 전달할 수 있습니까? (0) | 2018.09.18 |
---|---|
2 개의 mysqli 쿼리 (0) | 2018.09.18 |
멀티 바이트 문자열을 n 개의 문자로 잘림 (0) | 2018.09.18 |
ADOdb의 SQL 주입 및 일반적인 웹 사이트 보안 (0) | 2018.09.18 |
PHP 연관 배열 중복 키 (0) | 2018.09.18 |