문제

I 을 방지하려면 여러 로그인이 php 응용 프로그램.

첫째,내가 만들기 로그인 상태(active,notactive)사용자의 테이블.

사용자는 로그는 사용자의 상태를 설정됩니다'active',그리고 경우에는 사용자가 로그아웃 상태를 설정하는 것입니다'notactive'.다른 클라이언트 안죽을 사용하여 로그인한 동일한 사용자 acount,나는 체크인 사용자는 테이블.는 경우에는 사용자가 여전히 활성 오류 로그인이 사용자에게 전달됩니다.

은 문제가 발생한 경우에는 사용자가 브라우저를 닫은 상태에서는 사용자의 테이블 수 있습니다 업데이트하기 때문에 사용자지 않은 로그아웃을 클릭합니다.

당신은 어떤 제안에 대해 이?

도움이 되었습니까?

해결책

(주시기 바랍는 동안 기술은 여전히 약간 유효;PHP 샘플하지 않아야 그대로 복사가 안전한 수단을 통합하는 사용자가 제공하는 값에 SQL 쿼리)


를 저장하는 대신 사용자가 활성화\,비활성 그것은 더 나은 상점 몇 가지 특성할 수 있는 검사에 대한 사용자에 행동으로;으로서,모든 시간을 사용자에 뭔가 하려고 하는 인증이 필요한지를 확인하는 이 특성과 일치하기 전에 그것이 진행됩니다.

내가 권하면 다음을 수행할 수 있습니다;

첫째,만드 해당 사용자를 고유하게 식별할 때마다 로그인합니다.내가 상상하는 sha1time() 될 것입을 피하기 위해 충분히 충돌 사고로 이어질 수 있습니다.당신은 무엇을 선택는지 확인 그것은 다양하도록 충분히 다른 사용자 로그인이 믿을 수 없을 만큼 낮은 기회가를 받은 같은 해시(예를 들어,지 않아 해시 IP 주소나 사용자 브라우저의 사용자 에이전트로서,이들은 다양한 충분히).

둘째,저장 이 해시에 데이터베이스와 사용자의 세션 시에 로그인합니다.이렇게 하면 효과적으로'로'이전 사용으로 해시야마다 다른 누군가 로그에.

때문에 우리가 사용하여 세션을,쿠키를 자동으로 배치되어야 하는 사용자의 브라우저에서 어떤 것을 포함한 고유 ID 를 식별하는 사용자가 자신의 세션이다.내 쿠키의하지 않은 정말의 관심사입니다.

다음 함수를 만들라 authenticateUser() 또는 이와 유사한 것,이는 불에서 시작하의 모든 스크립트를 지키는 사용자를 인증하게 됩니다.이 스크립트는 쿼리 데이터베이스,유무를 확인하는 사용자와 사용자의 ID 를 해쉬와 일치하는 사용자 해시입니다.

예를 들어:

function authenticateUser($id, $hash, $databaseLink) {
    # SQL
    $sql = 'SELECT EXISTS(
               SELECT 1
               FROM `tbl_users`
               WHERE `id` = \''.mysql_real_escape_string($id).'\'
               AND `hash` = \''.mysql_real_escape_string($hash).'\'
               LIMIT 1
           );';

    # Run Query
    if ($query = mysql_query($sql, $databaseLink)) {
        # Get the first row of the results
        # Assuming 'id' is your primary key, there
        # should only ever be one row anyway.       
        $result = mysql_fetch_row($query);

        # Casting to boolean isn't strictly necessary here
        # its included to indicate the mysql result should
        # only ever been 1 or 0.
        return (bool)($result[0]);
    } else {
        # Query error :(
        return false;
    }
}

그런 다음 우리는 단순히 전달 authenticateUser() 사용자의 ID, hash (당신의 세션 데이터)및 database link (를 위한 데이터베이스 연결이 있어야 할 것이 열 이전).

는 경우 authenticateUser()true, 사용자 인증 됩니다.는 경우 false, 지 않은 이용자 또는 데이터베이스를 사용할 수 없거나 SQL 오류가 있습니다.

그러나 유의하시기 바랍니 이 증가 서버의 부하로 데이터베이스에 요청을 한 페이지당 요청을 합니다.그것은 아마도 모든 것이 현명 할 이에 거대한 프로젝트 수천 명의 사람들은 로깅에서 주어진 시간이다.나는 확신할 수 있 개선 사항을 제안합니다.

또한,를 기다리고 쿠키를 만료하지 않는 최선의 방법을 강제로 사람들이 비활성하는 로그아웃,같은 쿠키가 있습니다.대신,추가할 수 있습에서 열 last_active 입 업데이트할 수 있습니다 매번 사용자를 인증하게 됩니다.이것은 또한 증가 서버의 부하지만,당신 수동으로 재정의 오래된 로그 기능을 제거하여 hash 는 사용자를 위한었,말씀,비활성 상태 3 시간입니다.

다른 팁

여기에 해결책이 있습니다 그렇지 않습니다 일정해야합니다 데이터베이스 액세스 일하다...

(페이지를 요청/새로 고침, DB/Server 응력 완화 할 때마다 데이터베이스 값에 대해 Session_id ()를 확인 해야하는 요구 사항을 피할 수 있습니다) ...

1. 로그인시이 사용자를 위해 DB에 저장된 기존 세션 _id를 잡고 다음을 수행하십시오.

session_id("the pre-existing session id in the database goes here");
session_start();
session_destroy();

2. 그런 다음 새 세션을 시작 하고이 새 세션을 데이터베이스에 저장하여 이전 세션을 덮어 씁니다. 활성이 하나 인 경우이 사용자의 이전 세션이 로그 아웃됩니다 (이 계정을 사용하여 다른 사람을 효과적으로 로그 아웃).

시도해보고 그것이 트릭을 수행하는지 알려주세요 !!

최신 사용자 만 로그인 할 수 있도록 모델을 변경할 수 있습니다.

각 사용자에 대해 가장 최근의 세션 ID를 녹음하면 두 번째로 로그인하면 현재 기존 세션을 쓰레기로 쓰러 뜨릴 수 있으며 효과적으로 로그 아웃 할 수 있습니다.

정상적인 사용자의 경우 상황이 "그냥 작동"하는 것으로 보입니다. "비정상적인"사용자가 로그인 자격 증명을 배포하는 것을 막고 싶다면 이는 불일치가되어야합니다.

당신이해야 할 일은 로그인을 시도 할 때 마지막 몇 분 동안 활동했는지 확인하는 것입니다. 이것은 LastOnline 스탬프로 수행 할 수 있으며 사용자 테이블의 모든 페이지 요청에서 설정해야합니다.

JavaScript로 완료되지 않은 경우 로그온 할 때 사용자가 지난 15 분 동안 활성화 된 경우 확인할 수 있습니다. 그렇지 않은 경우 새 사용자로 로그인 할 수 있습니다.

JavaScript로도 할 수도 있습니다. 1 분마다 해고되는 ajax 호출을 만드십시오.

<script>
setInterval(function() {
  // do the ajax call
}, 60000);
</script>

이 호출은 사용자 DB의 LastOnline 스탬프를 편집하는 스크립트로 가도록하십시오. 로그인하려고 할 때 LastOnline 스탬프가 분을 초과 한 경우 사용자 DB를 확인하고 로그인 할 수 있는지 확인하십시오. 이것은 페이지에있을 때 도움이되지만 지난 15 분 동안 활동하지 않으며 다른 사람이 로그인하기를 원하지 않습니다.

고유 한 ID를 생성하고 데이터베이스에 저장해야합니다. 내가 한 일은 또한 창조 한 것입니다. 세션 변수에 하나를 저장하고 세션 납치를 방지하는 데 사용하고 다른 로그인을 방지하기 위해 데이터베이스에서 다른 하나를 사용합니다. 다음 코드는 고유 한 ID를 만듭니다.

$unique_id = sha1('xzr4'.gethostbyaddr($_SERVER['REMOTE_ADDR']).$random_string.$_SERVER['HTTP_USER_AGENT'].'f8k2');

고유 한 ID가 일치하지 않으면 사용자를 로그 아웃합니다.

로그인 한 사용자를 추적하기 위해 클라이언트 측 JavaScript를 사용하는 것은 신뢰할 수 없습니다.

DB에서 LastLogindate 필드를 작성하고 사용자의 마지막 로그인 타임 스탬프로 업데이트하여 동일한 결과를 얻을 수 있습니다.

모든 로그인 시도에서 지금 ()-$ lastlogindate> predfined_timeout이면 새 로그인을 수락하고 그렇지 않으면 거부해야합니다.

이 솔루션은 Prograhammer와 유사하지만 전환 세션을 엉망으로 만들 필요는 없습니다. 모든 페이지에서 데이터베이스에 액세스 할 필요는 없으며 로그 아웃하지 않은 후에 사용자를 잠그지 않습니다.

데이터베이스의 사용자 테이블에 SessionID의 필드를 추가하십시오.

호출하기 전에 기본 세션 핸들러를 설정하십시오.

session_set_save_handler(new \SessionHandler());

모든 성공적인 로그인에서 데이터베이스에서 저장된 $ SessionID를 검색하십시오. 다음과 함께 이전 세션을 파괴하십시오.

(new \SessionHandler())->destroy($sessionID);

새로운 세션 ID를 가져옵니다.

$sessionID = session_id();

새 세션 ID를 데이터베이스에 저장하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top