2013-10-21 4 views
1

내 웹 사이트에서 Ajax 로그인을 만들었지 만 최적화 할 수있는 것처럼 느껴졌지 만, 어떻게 그리고 어디서 왔는지는 잘 모르겠습니다.로그인 스크립트를 최적화하려면 어떻게해야합니까?

질문 :

  • 어떻게 내 코드를 최적화 할 수 있습니다

      ?
    • 코드가 안전합니까? 그것을 깰 수있는 어떤 방법 (주사 등)?

    또한 로그인을 시도 할 때 로그인을 처리하는 데 현재 (localhost에서) 약 1 초가 걸립니다. 오래 됐어? 여기

    $(document).ready(function() { 
        $(document).on("submit", "form", function(event) { 
        event.preventDefault(); 
        $.ajax({ 
         url: 'assets/php/login_script.php', 
         type: 'POST', 
         data: $(this).serialize(), 
         success: function(data) { 
         if (data == true) { 
          window.location.href = "index.php"; 
         } else { 
          $("input[name=password_field]").focus(); 
          $(".error").html(data); 
         } 
         } 
        }); 
        }); 
    }); 
    

    PHP 스크립트입니다 :

    가 여기 내 Ajax 호출의

    <?php 
    
        include_once("access.php"); 
    
        $cxn = mysqli_connect($host, $user, $pass, $db) or die ("Couldn't connect to the server. Please try again."); 
    
        $username = $_POST["username"]; 
        $password = $_POST["password"]; 
        $date = date('Y-m-d h:i:s', time()); 
        $ip_address = get_ip_address(); 
        $expire = time() + 86400 * 365; 
    
        $options = array('cost' => 12); 
        $hash_password = password_hash($password, PASSWORD_BCRYPT, $options); 
    
        /* Log the login request. */ 
        $stmt = $cxn->prepare("INSERT INTO login_logs (log_id, username, password, datetime, ip_address) VALUES ('', ?, ?, ?, ?)"); 
        $stmt->bind_param('ssss', $username, $hash_password, $date, $ip_address); 
        $stmt->execute(); 
    
        /* Get user information from database. */ 
        $stmt = $cxn->prepare('SELECT * FROM users WHERE username = ?'); 
        $stmt->bind_param('s', $username); 
        $stmt->execute(); 
        $result = $stmt->get_result(); 
    
        /* If a result exists, continue. */ 
        if ($result->num_rows > 0) { 
        while ($row = $result->fetch_assoc()) { 
         $db_username = $row['username']; 
         $db_password = $row['password']; 
         $random_hash = password_hash(time() . $db_username . time(), PASSWORD_BCRYPT, $options); 
    
         /* Password matches. */ 
         if (password_verify($password, $db_password)) { 
    
         /* Get user's cookie information in database. */ 
         $stmt2 = $cxn->prepare("SELECT * FROM cookies WHERE username = ?"); 
         $stmt2->bind_param('s', $db_username); 
         $stmt2->execute(); 
         $result2 = $stmt2->get_result(); 
    
         /* If a result exists, update the cookie. */ 
         if ($result2->num_rows > 0) { 
          $stmt = $cxn->prepare("UPDATE cookies SET hash = ? WHERE username = ?"); 
          $stmt->bind_param('ss', $random_hash, $db_username); 
          $stmt->execute(); 
    
          setcookie("user", $db_username, $expire, "/"); 
          setcookie("hash", $random_hash, $expire, "/"); 
         } else { 
          $stmt = $cxn->prepare("INSERT INTO cookies (cookie_id, username, hash) VALUES ('', ?, ?)"); 
          $stmt->bind_param('ss', $db_username, $random_hash); 
          $stmt->execute(); 
    
          setcookie("user", $db_username, $expire, "/"); 
          setcookie("hash", $random_hash, $expire, "/"); 
         } 
    
         echo true; 
         } else { 
         echo "Incorrect credentials."; 
         } 
        } 
        } else { 
        echo "Incorrect credentials."; 
        } 
    
        function get_ip_address() { 
        $ip_address = ''; 
        if (getenv('HTTP_CLIENT_IP')) 
         $ip_address = getenv('HTTP_CLIENT_IP'); 
        else if(getenv('HTTP_X_FORWARDED_FOR')) 
         $ip_address = getenv('HTTP_X_FORWARDED_FOR'); 
        else if(getenv('HTTP_X_FORWARDED')) 
         $ip_address = getenv('HTTP_X_FORWARDED'); 
        else if(getenv('HTTP_FORWARDED_FOR')) 
         $ip_address = getenv('HTTP_FORWARDED_FOR'); 
        else if(getenv('HTTP_FORWARDED')) 
         $ip_address = getenv('HTTP_FORWARDED'); 
        else if(getenv('REMOTE_ADDR')) 
         $ip_address = getenv('REMOTE_ADDR'); 
        else 
         $ip_address = 'UNKNOWN'; 
    
        return $ip_address; 
        } 
    
    ?> 
    

    가 어떻게 내 스크립트를 더 잘하기 위해 최적화 할 수 있습니다, 등, 더 빨리?

  • +0

    여기 codereview에서 질문해야합니다. –

    답변

    2

    1 초 지연 문제는 localhost에 대한 연결입니다.이 문제는 PDO에서 발생합니다. localhost127.0.0.1으로 변경하여 지연 문제를 해결하십시오.

    나머지 코드는 나에게 잘 보이고 깨끗하게 보입니다. :)

    +1

    아, '127.0.0.1'로 변경해 주셔서 감사합니다. :) – Burrows

    +0

    하하 그래, 나는 몇 년 동안 똑같은 문제가 있었다. Btw, 알고 싶다면 DNS와 관련이 있습니다. PDO는'localhost'에 연결하는 동안 DNS 항목을 새로 고치려고 노력하고 있습니다. 그래서 IP 주소를 사용해야합니다. 쉽고 효과적인 솔루션. –

    +0

    아 좋아. 추가 정보를 가져 주셔서 감사합니다. :) – Burrows

    1

    일반적으로 좋아 보인다. 첫눈에 일의 커플 :

    귀하의 0보다 큰하면 if 문에 중복 :

    if ($result->num_rows) { 
    if ($result2->num_rows) { 
    

    하나는 사용자 이름이 고유 한 가정 것이다. 따라서 결과를 반복 할 필요가 없습니다.

    _id 필드가 자동 증가 기본 키 필드라고 가정 할 때 검색어에 지정할 필요가 없습니다. 나는. 필드 및 값 목록에서 제거하십시오.

    IP 주소 사용을 검사하십시오. 로그인 보안을 위해 여기에서 사용하고 있지만 사용자가 제공하는 다양한 헤더에서 가져옵니다. 나는 '진짜'IP를 얻는 좋은 이유가 없으면 REMOTE_ADDR을 사용해야한다고 제안합니다.

    INSERT INTO ...를 사용하여 "SELECT 쿠키를 선택 했습니까? UPDATE 또는 INSERT"논리를 줄일 수 있습니다 ... 중복 키 업데이트시 ... 구문에 대해서는 INSERT의 MySQL 설명서를 참조하십시오.

    쿠키를 사용하여 사용자 이름/해시를 저장하고 있습니다. 쿠키의 사용자 이름이 필요할 때마다 필요한 것인지 확인해야하는 논리가 복잡해 지므로 실제로 이렇게해야하는지 고려하십시오. $ _SESSION을 사용하여 도망 갈 수 있다면 그렇게 할 것을 제안합니다.

    관련 문제