[php] PHP 세션 ID는 얼마나 고유합니까?

PHP 세션 ID는 얼마나 고유합니까? 나는 내가 읽은 여러 가지에서 두 명의 사용자에게 결코 동일한 세션 ID를 가져서는 안된다는 인상을 받았습니다. GUID 아닌가요?



답변

Session_id는 실제로 복제 될 수 있지만 확률은 매우 낮습니다. 트래픽이 공정한 웹 사이트를 가지고 있다면, 웹 사이트 생활에서 한 번 발생할 수 있으며 한 세션 동안 한 사용자를 짜증나게 할 것입니다.

트래픽이 매우 많은 웹 사이트 나 은행 업계를위한 서비스를 구축 할 것으로 기대하지 않는 한 이것은 신경 쓸 가치가 없습니다.


답변

배송시 고유하지 않습니다. 기본 구성에서는 gettimeofday (매우 고유하지 않음)의 결과를 포함하여 다양한 항목의 해시 결과이지만 걱정이되는 경우 / dev / urandom에서 일부 엔트로피를 가져 오도록 구성해야합니다.

ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");

사용중인 실제 알고리즘 에 대한 코드 에서 “php_session_create_id”를 검색하십시오 .

추가 수정 : pid로 시드 된 DFA 난수 생성기가 usecs의 시간과 혼합되어 있습니다. 특히 보안 관점에서 볼 때 확고한 고유성 조건이 아닙니다 . 위의 엔트로피 구성을 사용하십시오.

최신 정보:

PHP 5.4.0부터 session.entropy_file의 기본값은 / dev / urandom 또는 / dev / arandom입니다. PHP 5.3.0에서이 지시문은 기본적으로 비어 있습니다. PHP 매뉴얼


답변

PHP가 기본적으로 세션 ID를 생성하는 방법을 알고 싶다면 Github 의 소스 코드를 확인하십시오 . 확실히 무작위가 아니며 다음 성분의 해시 (기본값 : md5)를 기반으로합니다 (코드 스 니펫의 310 행 참조).

  1. 클라이언트의 IP 주소
  2. 현재 시간
  3. PHP Linear Congruence Generator- 의사 난수 생성기 (PRNG)
  4. OS 별 임의 소스 -OS에 사용 가능한 임의 소스가있는 경우 (예 : / dev / urandom)

OS에 사용 가능한 임의의 소스가있는 경우 세션 ID가 될 목적으로 생성 된 ID의 강도가 높습니다 ( / dev / urandom 및 기타 OS 임의 소스는 (일반적으로) 암호화 보안 PRNG ). 그러나 그렇지 않다면 만족 스럽습니다.

세션 식별 생성의 목표는 다음과 같습니다.

  1. 동일한 값으로 두 개의 세션 ID를 생성 할 가능성을 최소화합니다.
  2. 임의의 키를 생성하고 사용중인 키를 누르는 것은 계산적으로 매우 어렵습니다 .

이것은 세션 생성에 대한 PHP의 접근 방식에 의해 달성됩니다.

고유성을 절대적으로 보장 할 수는 없지만 동일한 해시를 두 번 칠 확률이 너무 낮아 일반적으로 걱정할 가치가 없습니다.


답변

ID가 생성되는 방식을 사용자 지정하려는 경우 대체 해시 생성 기능을 설치할 수 있습니다 (기본적으로 MD5를 통해 생성되는 128 비트 번호). 참조 http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function를

PHP 세션에 대한 자세한 내용 은 세션 고정 및 하이재킹에 대한 다른 기사로 연결되는 이 훌륭한 기사 http://shiflett.org/articles/the-truth-about-sessions 를 참조 하십시오 .


답변

session_id의 크기
seesion_id가 균일하게 분포되고 크기가 128 비트라고 가정합니다. 지구상의 모든 사람이 1000 년 동안 지속적으로 새로운 세션으로 하루에 한 번 로그인한다고 가정합니다.

num_sesion_ids  = 1000*365.25 *7*10**9 < 2**36
collission_prob < 1 - (1-1/2**82)**(2**36)  ≈ 1 - e**-(1/2**46)
                ≈ 1/2**46

따라서 하나 이상의 충돌 확률은 7 천억 분의 1 미만입니다. 따라서 session_id의 128 비트 크기는 충분히 커야합니다. 다른 의견에서 언급했듯이 session_manager는 새 session_id가 이미 존재하지 않는지 확인할 수도 있습니다.

임의성
따라서 내가 생각하는 가장 큰 질문은 session_id : s가 좋은 의사 임의성으로 생성되는지 여부입니다. 확신 할 수는 없지만이 목적을 위해 잘 알려져 있고 자주 사용되는 표준 솔루션을 사용하는 것이 좋습니다 (아마도 이미 사용했듯이).

검사로 인해 충돌을 피하더라도 session_id의 임의성과 크기가 중요하므로 해커는 할 수 없기 때문에 어떻게 든 자격을 갖춘 추측을 수행하고 큰 확률로 활성 session_id : s를 찾습니다.


답변

나는 이것에 대한 확인을 찾지 못했지만 PHP는 해당 ID로 세션 ID를 만들기 전에 세션 ID가 이미 존재하는지 확인한다고 생각합니다.

사람들이 걱정하는 세션 하이재킹 문제는 누군가가 활성 사용자의 세션 ID를 알아낼 때입니다. 이것은 php.net 에서이 페이지 를 볼 수 있고 세션 고정에 대한이 문서에서 볼 수있는 더 많은 정보를 위해 여러 가지 방법으로 방지 할 수 있습니다.


답변

아니요, 세션 ID는 GUID가 아니지만 두 사용자는 서버 측에 저장된 것과 동일한 세션 ID를 가져서는 안됩니다.