[php] session_regenerate_id ()는 언제, 왜 사용해야합니까?

왜 그리고 언제 session_regenerate_id()PHP 에서 함수를 사용해야 합니까? 를 사용한 후에는 항상 사용해야 session_start()합니까? 세션 고정을 방지하기 위해 사용해야한다고 읽었는데 이것이 유일한 이유입니까?



답변

무엇입니까 session_regenerate_id()?

함수 이름에서 알 수 있듯이 현재 세션 ID를 새 것으로 바꾸고 현재 세션 정보를 유지하는 함수입니다.

그것은 무엇을합니까?

주로 세션 고정 공격을 방지하는 데 도움이됩니다. 세션 고정 공격은 악의적 인 사용자가 시스템의 취약점을 악용하여 다른 사용자의 SID (세션 ID)를 고정 (설정)하려는 경우입니다. 이렇게하면 원래 사용자로서 완전한 액세스 권한을 얻고 인증이 필요한 작업을 수행 할 수 있습니다.

이러한 공격을 방지하려면 사용자가 session_regenerate_id()성공적으로 로그인 할 때 (또는 모든 X 요청에 대해) 사용하여 새 세션 ID를 할당합니다 . 이제 그는 세션 ID 만 가지고 있으며 이전 (고정 된) 세션 ID는 더 이상 유효하지 않습니다.

언제 사용해야 session_regenerate_id()합니까?

symbecean이 아래 설명에서 지적했듯이 세션 ID는 인증 상태 전환시 에만 변경되어야하며 인증 전환시 에만 변경되어야합니다 .

추가 읽기 :


답변

세션 하이재킹세션 고정session_regenerate_id() 을 중지하려면을 사용해야합니다 .

에서 이 Security.SE 대답 :

세션 하이재킹은 세션 쿠키를 훔치는 것을 말합니다. 이것은 다른 컴퓨터와 로컬 네트워크를 공유 할 때 가장 쉽게 수행 할 수 있습니다. 예 : Starbucks에서. 예 … 세션 Y의 사용자가 Starbucks에서 James의 웹 사이트를 탐색하고 있습니다. 나는 그들의 네트워크 트래픽을 듣고 내 라떼를 홀짝이고있다. 사용자에게 James의 웹 사이트에 대한 세션 Y의 쿠키를 가져 와서이를 사용하도록 브라우저를 설정합니다. 이제 James의 사이트에 액세스하면 James의 사이트입니다.

에서 이 웹 페이지 :

세션 고정은 사용자의 세션 ID를 명시적인 값으로 강제하는 공격 기술입니다. 대상 웹 사이트의 기능에 따라 여러 기술을 사용하여 세션 ID 값을 “수정”할 수 있습니다. 이러한 기술은 교차 사이트 스크립팅 공격에서 이전에 만들어진 HTTP 요청으로 웹 사이트를 뒤덮는 것까지 다양합니다. 사용자의 세션 ID가 수정 된 후 공격자는 해당 사용자가 로그인 할 때까지 기다립니다. 사용자가 그렇게하면 공격자는 미리 정의 된 세션 ID 값을 사용하여 동일한 온라인 ID를 가정합니다.

사용시기

사용자가 사이트 보안 또는 개인 정보 보호 정책을 손상시킬 수있는 중요한 입력 (암호, 자격 증명 변경, 암호 분실 등)을 편집 / 업데이트 할 때.

또한보십시오:

PHP 보안 가이드 : 세션

세션 고정 (좋은 읽기)


답변

세션 중독 문제는 꽤 잘 다루어 졌다고 생각합니다.

“언제 사용해야합니까?” 한 단계 뒤로 물러나 애플리케이션이 세션에서 수행하는 작업을 고려하는 것이 중요합니다. 또는 다른 말로하면 이것이 답해야 할 핵심 보안 질문입니다.

누군가이 세션을 보유하면 무엇을 얻을 수 있습니까?

익명의 데이터를 추적하기 만하면 (사용자가 사이트를 방문하여 방문을 추적하는 데 사용) 세션을 다시 생성 할 이유가 거의 없습니다. 납치범은 해당 세션을 잡아서 가치있는 것을 얻지 못합니다.

그러나 많은 사이트에서 로그인을 제공합니다. 로그인은 많은 것을 변경합니다. 내 프로필에 액세스 할 수 있습니다. 설정을 변경할 수 있습니다. 따라서 하이재커는 특히 일반 및 관리자 사용자가 모두 세션을 사용하여 로그인을 관리하는 경우 내 계정 액세스를 원할 수 있습니다. 그래서 사람들이 내 사이트를 방문하여 로그인하면 세션이 다시 생성됩니다. 새로 로그인 한 사용자가 탈취 당할 가능성이 적은 보안 계층을 추가합니다.

세션에 중요한 데이터를 추가 할 때마다 세션 ID 재생성을 고려해야합니다. 고정에 대해 응용 프로그램을 강화해야하는 경우 임의 재생성이 유용 할 수 있지만 모든 요청에 ​​대해 재생성하지는 않습니다. 기본적으로 PHP는 로컬 디스크의 파일에 세션을 저장합니다. 상대적으로 작은 공격 벡터를 완화하기 위해 많은 디스크 I / O를 추가하고 있습니다. 더 많은 보안이 필요한 경우 정기적으로 재생성하는 것보다 전체 HTTPS를 사용하는 것이 좋습니다 (HTTPS는 고정을 해제하기 매우 어렵게 만듭니다).


답변

왜 사용해야하나요 session_regenerate_id 합니까?

세션 고정 을 방지하기 위해 사용해야합니다. .

언제 사용해야합니까 session_regenerate_id합니까?

인증 상태가 변경 될 때마다 주로 로그인 및 로그 아웃에 있습니다.

Bob은 공용 컴퓨터에 앉아 stackoverflow.com을 검색하여 그곳에서 새 세션을 엽니 다. 세션 ID는 쿠키에 저장됩니다 ( httpOnly자바 스크립트를 통한 액세스를 방지 하는 플래그 포함). Stack Overflow가 항상 HTTPS를 활성화하고 secure쿠키에 플래그를 설정 했다고 가정 해 보겠습니다 .

지금 세션을 어떻게 훔칠 수 있습니까?

Bob은 세션 ID를 기록합니다. 그는 브라우저를 닫지 않고 컴퓨터를 떠납니다. 이제 Alice가이 컴퓨터에 와서 Stack Overflow가 이미로드 된 것을 확인합니다. 그녀는 지금 로그인합니다.

이제 우리는 당신이 사용해야 할 단계에 있습니다 session_regenerate_id. 로그인하는 동안 여기에서 새 세션 ID를 만들지 않으면 Bob은 기록한 이전 세션을 사용하여 Alice의 세션에 액세스 할 수 있으며 지금 Alice로 로그인 할 수 있습니다.


답변

더 나은 보안을 위해 사용할 수 있습니다.

이 방법으로 한 번 사용할 세션 ID를 생성합니다.

사용자 세션 ID가 3이라고 가정하겠습니다.

일부 해커가 클라이언트를 해킹하여 session_id를 얻었습니다. 따라서 해커는 해당 쿠키를 사용하여 세션을 사용할 수 있습니다.

다음과 같은 코드가있는 경우

session_start();
session_regenerate_id();

웹 사이트를 사용할 때마다 세션을 변경할 수 있습니다.

이제 해커는 sessionid = 3을 얻습니다.

하지만 그가 사용한 후에 세션을 변경 했으므로

user have sessionid = 4 // 인증

해커가 session = 3을 갖습니다. // null

그러나 재생성 방법을 사용하고 있으며 클라이언트가 웹 사이트에 로그인하고 브라우저를 닫거나 비활성 상태라고 가정 할 수 있습니다. 귀하의 클라이언트는 sessionid = 4를 가지며 해커가 해당 부분에서 쿠키를 받으면 동일한 sessionid를 갖게됩니다.

위에서 설명한 것처럼 이러한 방식으로 데이터 스니핑으로부터 클라이언트를 보호 할 수 있지만 여전히이 문제를 영구적으로 해결할 수는 없습니다.

그러나 SSL enc를 사용하면 훨씬 안전합니다.

나쁜 영어로 죄송합니다.


답변

간단한 사용 사례 :

// User visits a webshop
$shopcart = new Cart();

세션이 시작되고 데이터베이스에 항목이 작성됩니다. 사용자의 쇼핑 카트는 세션 ID로 식별됩니다.

// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);

추가 된 각 제품에 대해 내 shopcart 테이블에 기록이 생성됩니다. 세션 ID로도 식별됩니다.

// User saves cart in order to use it later
$shopcart->save();

사용자는 카트를 저장하기로 결정했습니다. 이제 그의 사용자 ID에 첨부됩니다.

// Regenerate session id for user to be able to make a new cart
session_regenerate_id();

세션 ID가 다시 생성되고 사용자는 이제 다른 쇼핑 카트 만들기를 다시 시작할 수 있습니다.


답변

session_regenerate_id () : 세션 ID를 다시 생성 할 수 없습니다. 세션이 활성 상태가 아닙니다.

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}