PHP에서는 세션 처리 메커니즘을 사용자 정의 할 때 SessionHandlerInterface를 구현하거나 SessionHandler 클래스를 상속하여 세션 스토리지 로직을 사용자 정의 할 수 있습니다. 그 중에서도 SessionHandler :: create_sid ()는 세션 ID를 생성하는 데 사용되는 재 작성 방법입니다. 이 방법의 반환 값과 그 목적을 이해하는 것은 복잡한 세션 메커니즘을 디버깅하는 데 특히 중요합니다.
create_sid ()는 session_start ()가 호출되면 자동으로 호출되며 현재 유효한 세션 ID가 없습니다. 그 목적은 새롭고 고유 한 세션 ID 문자열을 반환하는 것입니다. 기본 구현은 세션 을 기반으로합니다 .SID_LENGTH 및 SESSION.SID_BITS_PER_CHARACTER가 높은 엔트로피 ID를 생성하지만 로직을 사용자 정의하여 세션 ID가 생성되는 방법을 제어 할 수도 있습니다.
class MySessionHandler extends SessionHandler {
public function create_sid(): string {
return hash('sha256', random_bytes(32));
}
}
session_set_save_handler(new MySessionHandler(), true);
session_start();
위의 코드에는 SHA-256을 사용하여 고유 한 세션 ID를 생성하는 32 바이트 랜덤 데이터가 있으며 반환 된 값은 다음과 같습니다.
82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
create_sid () 가 반환 한 문자열은 다음 사항을 충족해야합니다.
독창성 : 특정 시간 범위 내에서 반복해서는 안됩니다.
예측할 수없는 : 세션 납치가 쉽게 추측하고 방지 할 수 없습니다.
Session.use_strict_mode = 1 과 호환됩니다 . 엄격한 모드가 활성화되면 반환 된 세션 ID가 이미 스토리지에 존재하면 거부 및 재생됩니다.
위의 조건을 충족시키지 못하면 세션 충돌 또는 보안 취약점이 발생할 수 있습니다.
Create_sid ()를 디버그하는 가장 직접적인 방법은 일시적으로 로깅 및 추적 정보를 추가하는 것입니다.
public function create_sid(): string {
$sid = hash('sha256', random_bytes(32));
error_log("새 세션을 만듭니다 ID: $sid");
return $sid;
}
이렇게하면 생성 된 각 SID를 PHP 오류 로그에 기록하며 경로는 일반적으로 /var/log/php_errors.log 또는 php.ini를 통해 구성된 구성입니다.
브라우저에서 개발자 도구 (예 : Chrome의 네트워크 태그)를 사용하여 요청에서 Set-Cookie 응답 헤더를보고 서버에서 반환 한 세션 ID가 생성 할 컨텐츠인지 확인하십시오.
예를 들어 헤더로 돌아가는 것은 다음과 같습니다.
Set-Cookie: PHPSESSID=82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73; path=/; HttpOnly
이 ID의 세션 데이터가 실제로 스토리지 백엔드 (예 : Redis, 파일 시스템, 데이터베이스)에 저장되어 있는지 확인하십시오. 예를 들어, 세션을 Redis에 저장하면 다음과 같습니다.
$sessionKey = "PHPREDIS_SESSION:sess_$sid";
명령을 사용할 수 있습니다.
GET PHPREDIS_SESSION:sess_82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
세션 키가 존재하는지 확인합니다.
디버그 페이지는 현재 세션 ID 및 상태를 볼 수 있도록 임시로 생성 될 수 있습니다.
session_start();
echo "<pre>현재의 Session ID: " . session_id() . "</pre>";
echo "<pre>Session 콘텐츠: ";
print_r($_SESSION);
echo "</pre>";
페이지에 액세스 한 후 출력은 비슷합니다.
현재의 Session ID: 82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
Session 콘텐츠: Array
(
)
클라이언트가 쿠키를 지원하지 않으면 세션 ID를 URL에 첨부하여 디버그 할 수 있습니다.
https://gitbox.net/debug.php?PHPSESSID=82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
그러나 참고 :이 방법은 개발 환경 디버깅에만 적합합니다. 생산 환경은 세션 누출을 피하기 위해 세션 ID를 전달하는 URL을 비활성화합니다.
session.use_strict_mode = 1을 활성화하여 PHP가 기존 SIDS를 거부하도록 강요합니다.
원래 세션 파일의보기를 용이하게하기 위해 읽고 쓰기 쉬운 디렉토리로 Session.save_path를 구성하십시오.
php.ini 또는 .htaccess 에서 상위 레벨 오류보고 및 로깅을 일시적으로 열 수 있습니다.
error_reporting = E_ALL
display_errors = On
log_errors = On
error_log = /tmp/php_error.log