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행 참조).
- 클라이언트의 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를 참조하십시오.
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를 찾을 수 없습니다.
확인은 되지 않았지만 php는 해당 ID로 세션 ID를 작성하기 전에 세션 ID가 이미 존재하는지 여부를 확인합니다.
사람들이 걱정하는 세션 하이잭 문제는 활성 사용자의 세션 ID를 누군가 발견했을 때입니다.이는 여러 가지 방법으로 방지할 수 있습니다.이 페이지의 자세한 내용은 php.net 및 세션 고정에 관한 이 문서를 참조하십시오.
아니요, 세션 ID는 GUID가 아니지만 두 사용자가 서버 측에 저장되어 있는 세션 ID와 동일한 세션 ID를 얻을 수 없습니다.
다양한 세션을 DB generate unique 필드와 함께 DB에 저장하도록 선택할 수 있습니다.이 두 세션을 병합하여 세션 변수에 저장한 후 세션 ID 대신 세션 ID를 확인할 수 있습니다.
저는 이 게시물이 매우 오래되었다는 것을 알고 있지만, 제가 비슷한 질문을 올렸음에도 불구하고 이 질문에 대한 적절한 해결책을 찾지 못했기 때문에 여기에 답변을 덧붙입니다.하지만 나는 내 게시물에 대한 답장에서 단서를 얻었다.여기에 알고리즘과 솔루션이 설명되어 있습니다.세션과 다른 쿠키를 조합하여 사용합니다.
간단히 말하면 알고리즘은 다음과 같습니다.
세션 처리는 DB를 사용하여 사용자 지정 클래스 'MySessionHandler'에서 수행됩니다.
1. session_start 직전에 cookie cookie_start_time이 현재 시간으로 설정됩니다.이 쿠키의 수명은 세션의 수명과 동일합니다.둘 다 $this-> cookieLife 변수를 사용합니다.라이프 타임을 설정할 시간입니다.
세션 '_write'에서는 이 값을 $this->cookieStartTime과 동일하게 db 테이블필드 cookie_start_time으로 설정합니다.
세션 '_read'에서는 체크합니다.
if($getRowsOfSession[0]['cookie_start_time']!= $this->cookieStartTime).
true가 반환되면 이는 중복 세션임을 의미하며 사용자는 세션을 파기하도록 리다이렉트되고 다시 리다이렉트되어 새로운 세션을 시작합니다.(총 2개의 리다이렉트)
<?php
session_start();
$_SESSION['username']="username";
?>
<!DOCTYPE html>
<html>
<head>
<title>Update</title>
</head>
<body>
<table border="2">
<tr>
<th>Username</th>
<th>Email</th>
<th>Edit</th>
</tr>
<?php
$conn=mysqli_connect("localhost","root","","telephasic");
$q2="select * from register where username = '".$_SESSION['username']."'";
$run=mysqli_query($conn, $q2);
while($row=mysqli_fetch_array($run))
{
$name=$row[1];
$email=$row[2];
?>
<tr>
<td><?php echo $name; ?></td>
<td><?php echo $email; ?></td>
<td><a href="edit.php"> Edit </a></td>
</tr>
<?php } ?>
</table>
</body>
사용자 이름이 다르거나 고유한 경우 세션에 이 코드를 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/138670/how-unique-is-the-php-session-id
'source' 카테고리의 다른 글
선택 상자의 모든 옵션을 제거한 다음 하나의 옵션을 추가하고 jQuery를 사용하여 선택하려면 어떻게 해야 합니까? (0) | 2022.11.08 |
---|---|
데이터베이스 필드를 1씩 늘립니다. (0) | 2022.11.08 |
주간 및 야간 근무자 수에서 IN 및 OUT을 필터링하는 방법은 무엇입니까? (0) | 2022.11.08 |
새로운 JRE 버전은 오래된 JDK 버전으로 컴파일된 Java 프로그램을 실행할 수 있습니까? (0) | 2022.11.08 |
JDK NetBeans 실행 상태를 설정하려면 어떻게 해야 합니까? (0) | 2022.11.08 |