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


95

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


세션 시작
후이

@HaRsH 우? Session_regenerate_id는 이전 세션 ID를 제거하고 예를 들어 XSS로 세션을 가로 채지 않도록 새 세션 ID를 만듭니다. 다른 문서에서 SESSION 변수의 가시성에는 영향을주지 않습니다.
Xatenev

그래 난 내가 다른 변수에 영향을 미치지 않는다는 것을 알고 있지만 거기 페이지에서 세션을 시작하지 않으면 변수가 코어 PHP의 해당 페이지에 존재하지 않습니다
HaRsH

1
하지만이 ...하지으로 session_start에 대해,에도 session_regenerate_id에 관한 것입니다
Xatenev

1
: 나는이 제안 된 RFC 읽는 게 좋을 것 wiki.php.net/rfc/precise_session_management
jankal

답변:


96

무엇입니까 session_regenerate_id()?

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

그것은 무엇을합니까?

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

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

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

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

추가 읽기 :


2
그리고 해커가 20 번째 호출을하면 무엇이 추가됩니까? 세션 ID가 변경되고 그는 세션을 소유하는 유일한 사람입니다.))
fred727

@ fred727 해커가 20 번째 호출을 할만큼 운이 좋으면 사용자는 잘못된 ID를 갖게되며 더 이상 인증되지 않습니다. 전혀 재생성하지 않으면 해커와 사용자 모두 인증됩니다.
Bradmage

세션에 민감한 정보를 저장할 때 session_regenerate_id를 호출하는 것도 유용 할 수 있습니다 (인증 tansitions뿐만 아니라)
Adam

세션 정보가 쿠키에없는 경우 세션을 고정 할 수 있습니까? 세션 정보를 서버의 파일에 저장하고 있는데 ID를 다시 생성해야합니까?
곤잘로

"다른 사용자의 세션 ID (SID)를 고정 (설정)하려면" .... "다른 사용자의 컴퓨터에 세션 ID (SID)를 고정 (설정)하려면"로 바꾸고 인증 한 후 사용해야합니다. "
회계사 م

25

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

에서 이 Security.SE 대답 :

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

에서 이 웹 페이지 :

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

사용시기

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

또한보십시오:

PHP 보안 가이드 : 세션

세션 고정 (좋은 읽기)


22

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

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

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

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

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

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


2
HTTPS는 고정에 대해 아무것도 변경하지 않습니다.
kelunik 2015

4
그러나 처음부터 세션 ID를 얻는 데 사용할 수있는 스니핑 공격을 더 어렵게 만듭니다.
demonkoryu

내 PHP 앱이 몇 초 내에 로그 아웃되고, 재생성을 사용하고 있습니다. 만들 수있는 세션 파일에 제한이 있습니까? 아니면 로그 아웃을 유발할 수있는 재생성 ID에 제한이 있습니까?
sqlchild

일반적으로 아닙니다. 당신은 그것에 대해 별도의 질문을 게시 할 수 있습니다
Machavity

17

왜 사용해야하나요 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로 로그인 할 수 있습니다.


그런데 그 때까지 session_regenerate_id()발행 된 Alice는 bobs 계정에 액세스 할 수 있습니까? 맞습니까?
Akam

2
@akam-늦었지만 응답할만한 가치가 있습니다 ... 1. Bob이 로그 아웃하지 않고 Alice가 로그인을 사용할 수 있습니다.-2. Bob이 로그 아웃하고 Alice가 로그인하지 않으며 Alice가 세션 ID를 사용할 수 있지만 자신의 데이터에 액세스하기위한 활성 로그인이 없습니다. 3. Bob이 로그 아웃하고 Alice가 로그인하고 Bob이 세션 ID를 사용하고 활성 로그인이 있고 Bob이 Alice의 데이터에 액세스합니다. 그러나 구체적으로 말하자면, 스크립트 보안에 의존하는 세션 ID는 반드시 로그 아웃 한 사용자의 데이터에 액세스 할 수 있다는 것을 의미하지는 않지만 일반적으로 가능하고 위험성이 높다고 말합니다.
codekandis

15

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

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

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

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

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

session_start();
session_regenerate_id();

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

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

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

user have sessionid = 4 // 인증

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

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

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

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

나쁜 영어로 죄송합니다.


12

간단한 사용 사례 :

// 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가 다시 생성되고 사용자는 이제 다른 쇼핑 카트 만들기를 다시 시작할 수 있습니다.


4

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

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.