Title. 내가 테스트 한 사용자 이름 확인을 통과시킵니다. 필자는 SQL 삽입을 피하기 위해 일부 트리밍/스트립 태그를 사용했습니다. 그러나 지금은 관심있는 유일한 부분은 매번 확인에 실패한 password_hash 및 password_verify입니다.password_verify는 매번 false를 반환합니다.
데이터베이스 암호 필드는 BLOB이지만 VARCHAR 255와 CHAR 255도 시도했습니다.
관련 로그인 확인 :
if(isset($_POST["login"])){
$username = trim($_POST['username']);
$username = strip_tags($username);
$username = htmlspecialchars($username);
$loginpassword = trim($_POST['password']);
$loginpassword = strip_tags($loginpassword);
$loginpassword = htmlspecialchars($loginpassword);
$loginQuery= "SELECT * FROM members where username='$username'";
$result = mysqli_query($conn, $loginQuery);
$row = mysqli_fetch_assoc($result);
$hash = $row['password'];
if(password_verify($loginpassword, $hash)){
$_SESSION['username'] = $username;
header("Location: index.php");
}
else{
$loginErrorExists= TRUE;
}
}
관련 등록 코드 :
if(isset($_POST["register"])){
$username = trim($_POST['username']);
$username = strip_tags($username);
$username = htmlspecialchars($username);
$password = trim($_POST['password']);
$password = strip_tags($username);
$password = htmlspecialchars($username);
$email = trim($_POST['email']);
$email = strip_tags($email);
$email = htmlspecialchars($email);
$conflictUserQuery = "SELECT username FROM members WHERE username='$username'";
$conflictUserResult = mysqli_query($conn, $conflictUserQuery);
$conflictUserRow = mysqli_fetch_array($conflictUserResult, MYSQLI_ASSOC);
$conflictMailQuery = "SELECT email FROM members WHERE email='$email'";
$conflictMailResult = mysqli_query($conn, $conflictMailQuery);
$conflictMailRow = mysqli_fetch_array($conflictMailResult, MYSQLI_ASSOC);
if(mysqli_num_rows($conflictUserResult) ==1){
$userConflictExists = TRUE;
}
elseif(mysqli_num_rows($conflictMailResult) ==1){
$mailConflictExists = TRUE;
}
else{
$hash = password_hash($password, PASSWORD_DEFAULT);
$registerQuery = mysqli_query($conn, "INSERT INTO members (username, password, email) VALUES ('$username', '$hash', '$email')");
if($registerQuery){
$_SESSION['username']= $username;
header("Location: index.php");
}
}
}
태그를 트리밍 및 스트라이핑한다고해서 SQL 삽입으로부터 보호받을 수는 없습니다. 사용자는 쿼리를 준비하고 매개 변수화해야합니다. .. Mysqli는 그것을 지원합니다 .. – JimL
트리밍/스트리핑은 SQL 주입을 피하기에 충분하지 않습니다. password_hash 오용과는 관련이 없습니다. 일부 데이터베이스 발췌/입력/출력 샘플이 유용 할 수 있습니다. – mario
인증 라이브러리를 사용하는 것이 좋습니다. 코딩 방법이 안전하지 않은 경우이를 확인하십시오. https://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication –