PHP의 세션 관리는 웹 개발의 중요한 부분으로, 개발자가 사용자가 로그인하고 임시 데이터를 저장할 수 있도록 도와줍니다. 기본적으로 PHP는 Session_id ()를 사용하여 세션을 식별하여 각 사용자의 세션이 고유한지 확인합니다. 그러나 보안 요구 사항이 높은 일부 응용 프로그램 시나리오에서는 기본 세션 ID 생성 메커니즘이 충분히 안전하지 않을 수 있습니다. 따라서 PHP는 SessionIdInterface 인터페이스를 제공하여 개발자가 세션 ID의 생성 및 보호 메커니즘을 사용자 정의하여 세션 데이터가보다 안전하도록 할 수 있습니다.
이 기사는 PHP에서 SessionIdInterface를 사용하여 세션 데이터, 특정 단계 및 몇 가지 예방 조치를 암호화하고 보호하는 방법을 자세히 분석합니다.
SessionIdInterface 는 PHP 7.1에 도입 된 인터페이스로 개발자가 세션 ID를 생성하는 방법을 사용자 정의 할 수 있습니다. 이 인터페이스를 구현함으로써 개발자는 생성, 암호화, 검증 및 기타 세션 ID 프로세스를 제어하여 세션의 보안을 향상시킬 수 있습니다.
SessionIdInterface 다음 방법을 정의합니다.
GenerateId () : 새 세션 ID를 생성합니다.
ValidateId ($ id) : 주어진 세션 ID가 유효한지 확인하십시오.
UpdateD ($ id) : 새 ID를 기반으로 세션 ID를 업데이트합니다.
이 인터페이스를 구현함으로써 개발자는 세션 ID 생성 방법을 사용자 정의하거나 추가 암호화 방법을 추가하거나보다 복잡한 검증 로직을 사용하여 일반적인 세션 납치 및 위조 문제를 피할 수 있습니다.
먼저, 개발자는 세션 ID의 생성 규칙을 사용자 정의하기 위해 SessionIdInterface 인터페이스를 구현해야합니다. 다음은 타임 스탬프 및 암호화 된 문자열로 세션 ID를 생성하는 방법을 보여주는 간단한 구현 예입니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">SecureSessionIdGenerator</span></span><span> </span><span><span class="hljs-keyword">implements</span></span><span> </span><span><span class="hljs-title">SessionIdInterface</span></span><span> {
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">generateId</span></span><span>(</span><span><span class="hljs-params"></span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
</span><span><span class="hljs-comment">// 현재 타임 스탬프와 임의 문자열을 사용하여 세션을 생성합니다 ID</span></span><span>
</span><span><span class="hljs-variable">$randomString</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bin2hex</span></span><span>(</span><span><span class="hljs-title function_ invoke__">random_bytes</span></span><span>(</span><span><span class="hljs-number">16</span></span><span>)); </span><span><span class="hljs-comment">// 무작위의16바이트</span></span><span>
</span><span><span class="hljs-variable">$timestamp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">time</span></span><span>(); </span><span><span class="hljs-comment">// 현재 타임 스탬프</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">hash</span></span><span>(</span><span><span class="hljs-string">'sha256'</span></span><span>, </span><span><span class="hljs-variable">$randomString</span></span><span> . </span><span><span class="hljs-variable">$timestamp</span></span><span>); </span><span><span class="hljs-comment">// 사용 SHA-256 해시시</span></span><span>
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">validateId</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$id</span></span></span><span>): </span><span><span class="hljs-title">bool</span></span><span> {
</span><span><span class="hljs-comment">// 확인하다 ID 형식이 기대치를 충족하는지 여부(특정 요구 사항에 따라 수정할 수 있습니다)</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">'/^[a-f0-9]{64}$/'</span></span><span>, </span><span><span class="hljs-variable">$id</span></span><span>); </span><span><span class="hljs-comment">// SHA-256 길이는입니다 64 성격</span></span><span>
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">updateId</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$id</span></span></span><span>): </span><span><span class="hljs-title">void</span></span><span> {
</span><span><span class="hljs-comment">// 업데이트 세션 ID(예를 들어,새 저장 ID 데이터베이스 또는 캐시에)</span></span><span>
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'session_id'</span></span><span>] = </span><span><span class="hljs-variable">$id</span></span><span>; </span><span><span class="hljs-comment">// 다음은 단순화 된 구현입니다</span></span><span>
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
generateId () : random_bytes () 함수를 사용하여 16 바이트 랜덤 스트링을 생성 한 다음 현재 타임 스탬프로 스 플라이싱하고 SHA256 해싱 알고리즘을 통해 고정 길이 세션 ID를 생성합니다.
ValidateId ($ id) : 생성 된 세션 ID가 SHA-256 형식을 준수하는 64 자 육각형 문자열인지 확인하십시오.
UpdateId ($ id) : 세션 ID의 스토리지 위치는 특정 요구에 따라 업데이트 될 수 있으며 새 ID는 일반적으로 서버 측 세션 데이터에 저장됩니다.
PHP에서 Custom SessionIdInterface 생성기를 사용하는 것은 매우 간단합니다. SESSION_SET_SAVE_HANDLER () 함수를 호출하여 사용자 정의 세션 ID 생성기를 등록하십시오.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_set_save_handler</span></span><span>(
</span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">SecureSessionIdGenerator</span></span><span>(), </span><span><span class="hljs-comment">// 사용자 정의 생성기를 통과합니다</span></span><span>
</span><span><span class="hljs-literal">true</span></span><span> </span><span><span class="hljs-comment">// 세션 수명주기 처리를 켜십시오</span></span><span>
);
</span><span><span class="hljs-comment">// 세션을 시작하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
현재 PHP는 SecuressessionIdgenerator 클래스를 사용하여 세션 ID를 생성하고 확인합니다.
세션 ID 자체는 사용자 정의 세션 ID 생성기에 의해 보호 될 수 있지만 세션 데이터의 보호도 마찬가지로 중요합니다. 보안을 향상시키기 위해 세션 데이터를 암호화 할 수 있습니다. PHP에서 OpenSSL_encrypt () 및 OpenSSL_DECRYPT () 함수를 통해 데이터 암호화 및 암호 해독을 달성 할 수 있습니다.
다음은 세션 데이터를 암호화 및 해독하는 샘플 코드입니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">define</span></span><span>(</span><span><span class="hljs-string">'ENCRYPTION_KEY'</span></span><span>, </span><span><span class="hljs-string">'your-encryption-key'</span></span><span>); </span><span><span class="hljs-comment">// 열쇠(请사용安全的方式存储)</span></span><span>
</span><span><span class="hljs-comment">// 세션 데이터를 암호화합니다</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">encrypt_session_data</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$data</span></span></span><span>) {
</span><span><span class="hljs-variable">$iv</span></span><span> = </span><span><span class="hljs-title function_ invoke__">random_bytes</span></span><span>(</span><span><span class="hljs-title function_ invoke__">openssl_cipher_iv_length</span></span><span>(</span><span><span class="hljs-string">'aes-256-cbc'</span></span><span>));
</span><span><span class="hljs-variable">$encrypted</span></span><span> = </span><span><span class="hljs-title function_ invoke__">openssl_encrypt</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-string">'aes-256-cbc'</span></span><span>, ENCRYPTION_KEY, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$iv</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">base64_encode</span></span><span>(</span><span><span class="hljs-variable">$iv</span></span><span> . </span><span><span class="hljs-variable">$encrypted</span></span><span>); </span><span><span class="hljs-comment">// 병합 IV 암호화 된 데이터 및 반환</span></span><span>
}
</span><span><span class="hljs-comment">// 세션 데이터를 해독합니다</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">decrypt_session_data</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$encryptedData</span></span></span><span>) {
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">base64_decode</span></span><span>(</span><span><span class="hljs-variable">$encryptedData</span></span><span>);
</span><span><span class="hljs-variable">$ivLength</span></span><span> = </span><span><span class="hljs-title function_ invoke__">openssl_cipher_iv_length</span></span><span>(</span><span><span class="hljs-string">'aes-256-cbc'</span></span><span>);
</span><span><span class="hljs-variable">$iv</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$ivLength</span></span><span>);
</span><span><span class="hljs-variable">$encrypted</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-variable">$ivLength</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">openssl_decrypt</span></span><span>(</span><span><span class="hljs-variable">$encrypted</span></span><span>, </span><span><span class="hljs-string">'aes-256-cbc'</span></span><span>, ENCRYPTION_KEY, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$iv</span></span><span>);
}
</span><span><span class="hljs-comment">// 存储세션 데이터를 암호화합니다</span></span><span>
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_data'</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">encrypt_session_data</span></span><span>(</span><span><span class="hljs-string">'Sensitive Information'</span></span><span>);
</span><span><span class="hljs-comment">// 해독 된 세션 데이터를 읽으십시오</span></span><span>
</span><span><span class="hljs-variable">$decryptedData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">decrypt_session_data</span></span><span>(</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_data'</span></span><span>]);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Encrypt_session_data ($ data) : AES-256-CBC 알고리즘을 사용하여 데이터를 암호화하고 암호화 된 데이터를 반환하십시오.
decrypt_session_data ($ alcryptedData) : 세션에 저장된 암호화 된 데이터를 해독합니다.
암호화 키 관리 : 암호화 키 (예 : Encryption_key )는 코드의 하드 코드를 피하기 위해 올바르게 저장해야합니다. 환경 변수 또는 구성 파일을 사용하여 저장하는 것이 좋습니다.
세션 ID 업데이트 : 각 사용자 인증이 성공한 후에는 세션 고정 공격을 방지하기 위해 세션 ID를 업데이트하는 것이 가장 좋습니다.
보안 세션 스토리지 : 세션 데이터 저장소의 위치가 안전한지 확인하십시오 (예 : 암호화 된 데이터베이스 또는 캐시 시스템 사용).
HTTPS : 웹 사이트가 HTTPS를 사용하여 클라이언트와 서버 간의 통신을 암호화하고 세션 납치 방지를 방지하십시오.