2012-10-04 62 views
1

그래서 나는 PHP 인증 스크립트를 가지고 있으며 모든 것이 잘 작동합니다. 그러나 나는 프로그래밍 된 방식에 대해 확신이 없다. (나는 어떤 것들을 하드 코딩했다.) 스택이 이것을 살펴보고 잠재적 인 문제점을 지적 할 수 있기를 바랬다. PHP 로그인 BCrypt 인증

<?php 
require_once 'Bcrypt.php'; 
class Mysql { 
    private $conn; 

    function __construct() { 
     $this->conn = new PDO('mysql:host=***;dbname=***;charset=UTF-8','***','***') or 
         die('There was a problem connecting to the database.'); 
    } 

    function verify_Username_and_Pass($un, $pwd) { 
     ini_set('display_errors', 'On'); 
     error_reporting(E_ALL | E_STRICT); 
     $query = "SELECT * 
       FROM Conference 
       WHERE Username = :un"; 

     $stmt = $this->conn->prepare($query); 

     $stmt->bindParam(':un', $un); 
     //$stmt->bindParam(':pwd', $pwd); 
     $stmt->execute(); 
     $row = $stmt->fetchAll(); 
     $hash = $row[0]["Password"]; 
     $is_correct = Bcrypt::check($pwd, $hash); 

     if ($is_correct) { 
      // User exist 
      $firstName = $row[0]["First Name"]; 
      $_SESSION["FirstName"] = $firstName; 
      return true; 
      $stmt->close(); 
     } 
     else { 
      // User doesn't exist 
      return false; 
      $stmt->close(); 
     } 
    } 
} 
?> 

그래서 어떻게 보는가 : 여기

스크립트입니까?

+2

http://codereview.stackexchange.com/에서이 질문을 시도해야합니다. – Tchoupi

답변

1

의 해시를 확인하기 위해 MySQL을 사용 할 수 있습니다, 내가 BCrypt의 사용은 합리적인 보이는, 당신의 코드가 작동한다고 생각합니다. 물론 향상시킬 수있는 몇 가지 사항이 있습니다. 일부 의견은 문제 일 수 있습니다.

  1. 쿼리에 행이 반환되지 않으면 (해당 사용자 이름이 없기 때문에) 잘못된 인덱스 $row[0]["Password"]에 액세스하게됩니다. 결과가 있다면 사용하기 전에 먼저 질문해야합니다.
  2. 데이터베이스를 닫으려는 호출은 return 문 뒤에 오므로 절대 실행되지 않습니다. PHP는 데이터베이스를 자동으로 닫으므로 return 문 앞에 닫거나 선을 제거하십시오.
  3. 함수 이름을 verify_username_and_password()으로 지정했으나 실제로는 데이터베이스에서 읽은 다음 세션에 씁니다. 이것은 숨겨진 활동이며, 다른 개발자는 전체 코드를 읽지 않으면 세션이 변경되었음을 알 수 없습니다. 이 문제를 해결할 수있는 한 가지 방법은 함수를 분리하는 것입니다.

검증되지 않은 예 :이 세 가지 기능의

$userRow = getUserRowFromDatabase($userName); 
if (!is_null($userRow)) 
{ 
    if (verifyPassword($password, $userRow["Password"])) 
    { 
    addLoggedInUserToSession($userRow["First Name"]) 
    } 
} 

각 해결하는 하나의 문제가있다. 이렇게하면 코드를 더 읽기 쉽고, 이상적으로는 책에서 이야기를 읽는 것과 같아야합니다.

희망은 당신에게 몇 가지 아이디어를 줄 수 있습니다.

0

당신은 실제로 그것을 테스트하지 않고 당신

SELECT COUNT(*) FROM Conference 
WHERE Username = :un 
AND Password = ENCRYPT(:pass, Password) 
LIMIT 1