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

php 세션 ID는 얼마나 고유합니까?저는 여러 가지 글을 읽고 두 명의 사용자에게 결코 같은 세션 ID를 받지 말아야 한다는 인상을 받았습니다.GUID 아니야?



질문에 대한 답변



발송된 상품으로는 그다지 독특하지 않습니다.디폴트 설정에서는 get time of day의 결과 등 다양한 해시의 결과입니다만, 걱정이 되는 경우는, 다음과 같이 /dev/urandom 로부터 엔트로피를 취득하도록 설정할 필요가 있습니다.

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

사용 중인 실제 알고리즘의 코드에서 “syslog_create_id”를 검색합니다.

추가하도록 편집됨:PID에 의해 시드된 DFA 난수 발생기가 시간 단위와 혼합되어 있습니다.특히 보안의 관점에서 보면 확실한 고유성 조건은 아닙니다.위의 엔트로피 구성을 사용합니다.

업데이트:

PHP 5.4.0에서 session.entropy_file은 기본 /dev/urandom 또는 /dev/arandom(사용 가능한 경우)으로 설정됩니다.PHP 5.3.0 에서는, 이 디렉티브는 디폴트로 공백인 채로 있습니다.PHP 매뉴얼




Session_id는 실제로 복제할 수 있지만 가능성은 매우 낮습니다.트래픽이 균등한 웹 사이트가 있는 경우 웹 사이트 라이프에 한 번 발생할 수 있으며 한 세션 동안 한 명의 사용자만 성가시게 할 수 있습니다.

이것은, 매우 높은 트래픽의 Web 사이트나 은행업계를 위한 서비스를 구축하는 것을 상정하고 있지 않는 한, 신경 쓸 필요가 없습니다.




PHP가 디폴트로 세션 ID를 생성하는 방법을 알고 싶다면 Github에서 소스 코드를 확인하십시오.이것은 랜덤이 아니고, 이러한 성분의 해시(기본값: md5)에 근거하고 있습니다(코드 스니펫의 310행 참조).

  1. 클라이언트의 IP 주소
  2. 현재 시각
  3. PHP 선형 일치 생성기 – 의사 난수 생성기(PRNG)
  4. OS 고유의 랜덤 소스 – OS에 랜덤 소스가 있는 경우(예: /dev/urandom)

OS에 랜덤소스가 있는 경우 세션 ID를 목적으로 생성된 ID의 강도는 높아집니다(/dev/urandom 기타 OS 랜덤소스는 (통상) 암호화로 안전한 PRNG입니다).만약 그렇지 않다면 그것은 만족스럽다.

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

  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가 균일하게 분포되어 있고 size=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

그래서 한 번 또는 그 이상의 충돌이 일어날 확률은 70,000억분의 1보다 작습니다.따라서 session_id의 128비트 사이즈는 충분히 커야 합니다.다른 코멘트에서 설명한 것처럼 session_manager는 새로운 session_id가 아직 존재하지 않는지 확인할 수도 있습니다.

랜덤성
따라서 중요한 질문은 session_id:s가 양호한 의사 랜덤성으로 생성되었는지 여부입니다.그 점에 대해서는 확실히 알 수 없지만, 잘 알려져 있고 자주 사용되는 표준 솔루션을 사용하는 것을 추천합니다(아마도 이미 사용하고 있을 것입니다.

체크에 의해 충돌을 회피하더라도 session_id의 랜덤성과 사이즈가 중요하기 때문에 해커는 정규 추측을 하지 못하고 가능성이 큰 액티브 session_id:s를 찾을 수 없습니다.