programing tip

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

itbloger 2020. 9. 8. 07:43
반응형

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가 좋은 의사 임의성으로 생성되는지 여부입니다. 확신 할 수는 없지만이 목적을 위해 잘 알려져 있고 자주 사용되는 표준 솔루션을 사용하는 것이 좋습니다 (아마도 이미 사용했듯이).

Even if collisions are avoided due to checking, randomness and size of session_id is important, so that hackers can not, somehow do qualified guessing and find active session_id:s with large probability.


I have not found a confirmation on this but i believe php checks if a session id already exists before creating one with that id.

The session hijacking issue people are worried about is when someone finds out the session id of an active user. This can be prevented in many ways, for more info on that you can see this page on php.net and this paper on session fixation


No, session id is not a GUID, but two users should not get the same session id as they are stored on the server side.


<?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>

if your username is different or unique you can use this code for session

참고URL : https://stackoverflow.com/questions/138670/how-unique-is-the-php-session-id

반응형