2012-11-23 4 views
0

우리 앞에이 멋진 사용자 시스템이 있다고 가정 해 보겠습니다. 사용자가 세션 키 (user_id)로 로그인되어 있습니다. 그러나 사용자가 "금지"되면 해당 세션이 만료 될 때까지 사용자는 계속 로그인됩니다. 이를 방지하기 위해작업 수행시 특정 작업 수행

방법은 다음과 같습니다 사용자가 금지되었다 경우

  1. 항상 확인

  2. 데이터를 쉽게 제거 할 수 아마도 데이터베이스에 세션 데이터를 저장 (모든 요청) (온 사용자가 금지됨).

이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

두 번째 방법을 선택하면 데이터베이스에 세션 식별자 만 저장 한 다음 [이 세션을 종료 할 때 사용할 수 있습니다] (http://stackoverflow.com/questions/6703842/unset-a- specefic-session-using-session-id)를 사용합니다. – Furgas

+0

누군가가 금지령이 집행되기까지 일정 기간이 걸린다는 사실이 중요합니까? –

답변

1

을 선택합니다. 요청할 때마다 데이터베이스에서 사용자 정보를 검색하지 않으면 사용자가 데이터를 업데이트하는 데 문제가있을 수 있습니다. 예를 들어 집에서 로그인하고 내 프로필 설명을 'foo'로 변경하고 직장에 갈 수 있습니다. 거기서도 다른 세션에서 로그인하게됩니다. 나는 데이터베이스와 작업 세션에 저장된 '바'로 정보를 변경합니다. 그런 다음 집에 돌아가서 이전에 열었던 홈 세션을 계속 탐색합니다. 여전히 'foo'가 포함됩니다.

그렇기 때문에 각 요청에 대해 사용자 데이터베이스에 대해 최소한 검사를 수행해야한다고 생각합니다. 따라서 해당 단계에서 사용자가 금지되어 있는지 확인할 수 있습니다.

이 속도를 높이려면 저장 영역 유형이 MEMORY 인 특수 테이블을 유지하여 세션 정보를 유지해야합니다.이 테이블은 매우 빠르게 액세스 할 수 있으므로 성능이 향상 될 수 있습니다. 사용자가 '실제'데이터베이스에서 변경된 경우에만 정보를 이동해야합니다. 유사한 방식으로 memcache를 사용할 수 있습니다. 둘 다 데이터베이스 IO를 최소로 유지하면서 동일한 결과를 유지하는 솔루션입니다. 필요할 때만 이러한 최적화를 추가 할 것입니다. 각 요청에 대해 사용자에게 쿼리 만하면됩니다.

0

마지막으로 세션이 금지되었는지 확인하기 위해 세션에 포함 시키십시오. 그런 다음 주기적으로 사용자 테이블의 금지 된 목록과 대조하여 확인하십시오.

0

모든 요청을 user_id으로 확인해야합니다. 그것은 많은 계산이 아닙니다. Redis 또는 Memcached과 같은 메모리 내장형 저장소를 사용하면 user_id=>banned 쌍을 저장하여 신속하게 확인할 수 있습니다. 세션이 안정적이지 않아 다른 컴퓨터, 심지어 브라우저에서 로그인 할 수 있기 때문에 두 번째 작업이 작동하지 않으며 이러한 작업을 수행하기 위해 복잡한 로직과 훨씬 많은 리소스가 필요합니다.

0

모든 요청에 ​​대해 데이터베이스에 연결하고 싶지는 않습니다. 많은 사용자가있는 서버에서로드 시간이 크게 늘어나므로 - 최선의 방법은 아닙니다.

그러나 Memcache을 사용하면 금지 된 사용자 목록을 저장하고 검색 할 수 있으므로 데이터 요청 시간이 빨라집니다.

if((isset($_SESSION['isloggedin']) && $memcache->get('banneduserid') === true)) 
{ 
    session_unset(); 
    session_destroy(); 
} 

Memcache 당신이 전에 그것을 사용하지 않은 경우 배우기 정말 사용하기 쉽고, 재미있다.

memcache 개체를 $ memcache로 인스턴스화 한 다음 $memcache->set()$memcache->get()과 같은 메서드를 실행하면됩니다. 그게 다야!

+0

Memcache를 금지 된 사용자 목록으로 업데이트하는 데이터 처리는 서버에서 5 분마다 cron say를 통해 실행할 수 있다는 것도 좋은 제안입니다. 이것은 관심사를 분리하고 일반적으로 보안 관점에서 더 좋습니다. 나는 너와 똑같은 일을 했어. 내 방법은 완벽하게 작동한다. :) – Jimbo

관련 문제