2016-09-30 4 views
0

나는 password_verify()를 작동 시키려고 밤새도록 50 개 이상의 링크를 심각하게 통과 했으므로이 질문을 가볍게 묻지 않았다.PHP password_verify()

1- 해시가 100 % 맞습니다.
2- 일반 텍스트 Verison은 100 % 정확합니다.
해시 길이가 사실임 60.
4- 시도 암호 설명 및 암호 _Bcrypt
5 데이터베이스에서 암호를 성공적으로 가져 왔습니다.

if(password_verify($answer,$secAnswer)){ } IS ALWAYS false. 


하지만

다음은 내 코드입니다.

function anti_injection_login($sql, $formUse = true){ 
$sql = preg_replace("/(from|select|insert|delete|where|drop table|show tables|,|'|#|\*|--|\\\\)/i","",$sql); 
$sql = trim($sql); 
$sql = strip_tags($sql); 
if(!$formUse || !get_magic_quotes_gpc()) 
    $sql = addslashes($sql); 
return $sql; 
} 


    $email = anti_injection_login($_POST['email']); 
    $answer = anti_injection_login($_POST['answer']); 
    $queryAccount = mysqli_query($conn, "SELECT * FROM Accounts where email= '$email'"); 
    $count = mysqli_num_rows($queryAccount); 
    if($count == 1){ 
    $rows = mysqli_fetch_array($queryAccount); 
    $secAnswer = $rows['secretkey']; 

    if(password_verify($answer,$secAnswer)){ 
     echo "Successful"; 
    }else{ 
     echo "Try Again"; 
    } 
    } 

anti_injection_login은 사람들이 주사를 멈추는 것입니다. 이것은 문제가 아닙니다.
$ secAnswer 및 $ answer를 사용하여 에코를 넣는 위치에 상관없이 항상 예상대로 정확합니다.

내가 누락 된 사람이 있습니까? 나는 지금이 문제에 심각하게 뒤죽박죽이다.

(예, 전체 스크립트입니다.) 그래서 나는 아무것도 남기지 않을거야. 그러나 언급했듯이, 데이터베이스 버전에 따라 해시를 성공적으로 가져오고 있습니다 (올바른).

그리고 내가 해시에 사용하는 단어는 동일합니다 (대문자와 소문자를 모두 시도 함).

+3

준비된 문구를 사용하십시오. 자신의 위생을 굴릴 필요가 없습니다. –

+1

'$ rows [ 'secretkey']'에는 무엇이 포함되어 있습니까 (예를 들어). 그리고 어떻게'secretkey' 해시를 생성하는지 보여줍니다. 또한 패스워드가'aliform_at_insert'와 같다면'anti_injection_login'은 내 로그인을 망칠 것입니다 – Justinas

+2

죄송합니다.'anti_injection_login()'은 귀하의 사이트가 해킹 될 것을 요구하고 있습니다. 준비된 진술은 * 필요한 * 것입니다. – alex

답변

1

PHP Manual은 매우 명확 예를 제공합니다 모든

<?php 
// See the password_hash() example to see where this came from. 
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; 

if (password_verify('rasmuslerdorf', $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 
?> 

먼저, 비밀번호 해시는 password_hash() 기능 할 때 사용자 레지스터에 의해 생성 될 필요가있다.

로그인하면 양식의 비밀번호를 데이터베이스의 저장된 해시와 함께 password_verify()으로 전달합니다.

그러나 코드는 양식 데이터를 anti_injection_login()을 통해 전달하며 이는 주어진 입력에 대해 누가 아는지를 수행합니다. 비밀번호를 password_verify()에 곧바로 전달하려는 경우 비밀번호를 삭제하지 않아도됩니다. 준비된 명령문을 사용하여 데이터베이스에서 해시를 검색하고 $_POST['answer']password_verify()으로 곧바로 전달하는 것이 좋습니다.

관련 문제