문제

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 선형 합동 생성기 - 의사 랜덤 번호 생성기 (PRNG)
  4. OS 특이 적 랜덤 소스 - OS에 임의의 소스가있는 경우 (예 : /dev /urandom)

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

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

  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를 찾을 수 없습니다.

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

사람들이 걱정하는 세션 납치 문제는 누군가가 활성 사용자의 세션 ID를 찾을 때입니다. 이것은 여러 가지 방법으로 방지 할 수 있습니다. 이 페이지 php.net에서 세션 고정에 관한이 논문

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

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

사용자 이름이 다르거나 고유 한 경우 세션 에이 코드를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top