2012-08-12 5 views
0

간단한 사용자 이름/비밀번호 로그인 체계를 사용하는 작은 웹 앱이 있습니다. 나는 암호를 정확하게 입력 할 때 사용자가 로그인하는 것을 허용하지 않을 것이라는 것을 여러 번 알아 차렸다.PHP 비밀번호 확인

원래대로 초기 등록에서 사용자의 암호를 입력을 암호화 된 코드 :

function encode5t($str) { 
    for($i=0; $i<5;$i++) { 
    $str=strrev(base64_encode($str)); //apply base64 first and then reverse the string 
    } 
    return $str; 
} 

$password=mysql_real_escape_string($_POST['password']); 
$pass=encode5t($password); 

다음 $ 패스 MySQL 데이터베이스에 삽입됩니다. 그런 다음 같은 기능은 로그인에 암호화에 암호를 사용하고,과 같이 데이터베이스에 대해 판정한다

$username = $_POST['username']; 
$psw = $_POST['password']; 
$npsw=encode5t($psw); 

$query = sprintf("SELECT * FROM members WHERE username='%s' AND password='%s'", 
    mysql_real_escape_string($username), 
    mysql_real_escape_string($npsw)); 

문제는 암호 형태로 입력하는 방법에 따라 발생한다. 단순히 입력 한 경우 문제는 없지만 새로 생성 된 비밀번호가 포함 된 이메일에서와 같이 비밀번호가 양식에 복사/붙여 넣어지면 실패합니다. 암호화 기능은 완전히 다른 해시를 만들고 일치하지 않으므로 사용자가 로그인하지 않았습니다.

인코딩을 사용하여이를 사용하여 md5()를 사용했지만 동일한 결과를 얻었습니다 결과 - 잘라 내기/붙여 넣기로 인해 양식에 암호를 입력하는 것과는 다른 해시가 발생합니다.

페이지 인코딩에 입력 된 것과 다른 텍스트가 복사 될 수 있습니까?

+0

복사 - 붙여 넣기로 공백을 둘 수 있습니까? 암호를 저장하는 것은 좋지 않은 접근법입니다. 예를 들어 bcrypt와 같이 느린 소금과 해시를 사용하십시오 (예 : bcrypt). http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing -passwords-in-php, http://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely –

답변

3

사용자가 사용자 이름/암호를 붙여 넣을 때 문제가 발생하기 쉽기 때문에 종종 앞이나 뒤에 공백이 있습니다. 이 필드를 수정하려면 trim()을 실행하십시오.

또 다른 메모에서 당신이 갖고있는 것이 모두 안전하지는 않습니다. base64 문자열은 아무도 오랫동안 속일 수 없으며 특히 해시되지 않은 경우 md5를 암호 해시로 사용하면 안됩니다. 소용돌이와 같은 좀 더 견고한 것을 시도하십시오. 마지막으로 PDO로 준비된 쿼리를 사용하여 주입 문제를 피하는 것이 좋습니다. 현재 데이터를 탈출하고 있습니다 ... 좋습니다! 그러나 어딘가에서 탈출구를 놓치는 기회를 포착하지 않는 것이 가장 좋습니다.

+0

예,이 사이트의 보안은 무시 무시하지만 사용하여 무엇을 받아 들일지 조정합니다. 사용자 입력이 즉각적인 문제를 해결했습니다. 감사합니다!. 독특한 염장을 다음 번에 시행 할 예정입니다. – Martin