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행 참조).
- 클라이언트의 IP 주소
- 현재 시각
- PHP 선형 일치 생성기 – 의사 난수 생성기(PRNG)
- OS 고유의 랜덤 소스 – OS에 랜덤 소스가 있는 경우(예: /dev/urandom)
OS에 랜덤소스가 있는 경우 세션 ID를 목적으로 생성된 ID의 강도는 높아집니다(/dev/urandom 및 기타 OS 랜덤소스는 (통상) 암호화로 안전한 PRNG입니다).만약 그렇지 않다면 그것은 만족스럽다.
세션 ID 생성의 목표는 다음과 같습니다.
- 동일한 값으로 두 개의 세션 ID를 생성할 가능성을 최소화합니다.
- 랜덤 키를 생성하여 사용 중인 키를 입력하는 것은 계산적으로 매우 어렵습니다.
이는 세션 생성에 대한 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를 찾을 수 없습니다.