source

PHP 세션이 하위 도메인으로 전달되도록 허용

itover 2022. 10. 18. 23:18
반응형

PHP 세션이 하위 도메인으로 전달되도록 허용

모든 사용자 데이터에 대해 PHP 세션(세션 ID 쿠키 제외)을 사용하고 사용자가 프로파일로 이동할 때user.mydomain.example서브도메인을 삭제할 때까지 즉시 "삭제"됩니다.

모든 도메인으로부터의 세션을 받아들일 수 있는 방법은 있습니까?*.mydomain.example

여기 4가지 옵션이 있습니다.

이것을 php.ini에 넣습니다.

session.cookie_domain = ".example.com"

또는 .htaccess:

php_value session.cookie_domain .example.com

또는 스크립트의 첫 번째 사항으로 다음과 같은 것이 있습니다.

ini_set('session.cookie_domain', '.example.com' );

또는 사이트의 php-fpm 풀 구성에서 다음을 수행합니다.

php_value[session.cookie_domain] = .example.com
        if(isset($_COOKIE['session_id']))
            session_id($_COOKIE['session_id']);
        Zend_Session::start(); //or session_start();
        if(!isset($_COOKIE['session_id']))
            setcookie('session_id', session_id(), 0, '/', '.yourdomain.example');

보안은 저주받을 거야, 나만큼 불완전하거나 잘못된 대답에 좌절한다면, 이 사람은 너의 구원자다.효과가 있어요.

핵심 기능 파일의 맨 위에 있는 세션 이름을 다음과 같이 변경합니다.

 session_name('mysession');

그런 다음 다음 php 페이지에 다음 코드를 사용합니다.

  session_set_cookie_params(0,"/",".example.com",FALSE,FALSE);
  setcookie(session_name(), session_id(),0,"/","example.com");
  session_start();

마지막으로 하위 도메인의 기본 세션 이름을 변경하고 다음과 같이 하위 도메인의 핵심 함수 파일에서 기본 쿠키를 제거합니다.

 /*default session name*/
 session_name("mysession");
 /*remove the PHPSESSID and default session name from subdomain's cookie*/
 setcookie( "mysession", "",1,"/" );
 setcookie( "PHPSESSID", "",1,"/" );

쿠키명을 PHPSESSID로 계속 사용하는 경우는, 다음의 모든 기능을 삭제합니다.

 "mysession" string like session_name('mysession'), setcookie( "mysession", "",1,"/" );

그런 다음 브라우저의 기존 쿠키를 확인하고 도메인 및 하위 도메인의 모든 쿠키를 제거한 후 이 과정을 반복합니다.

이것이 꽤 오래되었다는 것을 알지만, @CTT의 제안에 따라 더 확장하기 위해서는 다음 텍스트로 서브도메인의 각 서브디렉토리에 php.ini 파일을 추가해야 했습니다(이 파일은 php 코드를 실행하고 세션이 필요합니다).

suhosin.session.cryptdocroot=Off
suhosin.cookie.cryptdocroot=Off

이게 도움이 됐으면 좋겠어요(이걸 알아내는 데 몇 년이 걸렸어요.

나에게 효과가 있었던 또 다른 옵션은 세션 이름을 강제로 세션 이름을 지정하는 것입니다.

session_name("myWebsite");
session_start(); 

네.ini_set동작하고 있습니다만, 동작하는 것을 확인하려면 , 브라우저의 캐시와 쿠키를 모두 파기해 주세요.

  1. 브라우저의 모든 캐시 및 쿠키 삭제
  2. 당신의 안에서xxx.example.com그리고.yyy.example.comphp 파일은 다음과 같이 시작합니다.

    ini_set('session.cookie_domain', '.example.com' ); session_start();
    

방금 이 문제가 있었는데 알고 보니 두 개의 다른 서브 도메인에 대해 다른 php.ini 파일을 사용하고 있었습니다.이러한 ini 파일은 다른 session.save_path 변수를 지정했습니다.분명한 이유로 세션을 공유할 필요가 있는 모든 서브도메인에서 동일하게 해야 합니다.

전에session_start()사용하다session_set_cookie_params()교환.domain.example다음 예시와 같이 도메인을 지정합니다.

session_set_cookie_params(0, '/', '.domain.example');
session_start();

시험:

session_start();

$sessionId =  session_id();

사용자가 기록되었습니다.사용자가 다른 서브도메인으로 전환할 때 다음과 같은 URL로 세션 ID를 전송했습니다.user.mydomain.example/?id=$sessionId

$sessionId =  $_GET['id'];

session_start($sessionId);

이제 사용자는 모든 세션 값을 얻고 로그인 상태를 유지합니다.

if(isset($_COOKIE['session_id']))
    session_id($_COOKIE['session_id']);
    Zend_Session::start(); //or session_start();

    if(!isset($_COOKIE['session_id']))
        setcookie('session_id', session_id(), 0, '/', '.yourdomain.example');

이것은 좋은 해결책이지만 모든 상황에서 사용할 수는 없습니다.예를 들어 Not-Session cookie에 의존할 수 없는 경우에는 작동하지 않습니다.

올바르게 사용한다면 이 방법은 실제로 작동해야 합니다.

ini_set('session.cookie_domain', '.example.com' );

를 들어, '아까', '아까'보다 앞에 붙여야 합니다.session_start(), 「」, 「」를 호출하는 에서도,session_start()

언급URL : https://stackoverflow.com/questions/644920/allow-php-sessions-to-carry-over-to-subdomains

반응형