2012-03-08 3 views
3

이것은 PHP Sessions across sub domains의 이름입니다.
나는 그 질문에 표시된 것을 시도해 보았습니다. 문제가 제기되지 않았 음을 알았습니다.하위 도메인에 걸친 PHP 세션 2

그래서 내가 하위 도메인 (www.example.comforum.example.com에)에서 세션을 가질 필요가

내가 www.example.com에 무슨 짓을 정확히 forum.example.com

session_name("a_name"); 
session_set_cookie_params(0, '/', '.example.com'); 
session_start(); 

echo session_id(); 
print_r($_SESSION); 

session_name("a_name"); 
session_set_cookie_params(0, '/', '.example.com'); 
session_start(); 

echo session_id(); 
$_SESSION['test'] = 123; 

SESSION_ID되어있다 같지만 $ _SESSION은 아무 것도 출력하지 않습니다.
만드는 방법 forum.example.com 출력 123?

나는 session.cookie_domain = .example.com을 시도했지만 나는 그것이 www.example.com 세션을 파괴 forum.example.com 갈 것을

변경하지 않고, 그것이 다른 하위 도메인에서 오는 것을 감지 경우처럼, 다른 길에 같은 일 보안을 위해 모든 것을 지 웁니다.

2 개의 하위 도메인은 같은 데비안 서버에있는

내가 눈치 또 다른 점은 session_name없이 session_set_cookie_params 아직도 내가 session.cookie_domain

당신에게

감사 설정 정확히 같은 SESSION_ID을 가지고 있다는 것입니다
+0

이러한 도메인은 동일한 서버를 공유합니까? –

+0

예, 어디에 문제가 있는지 모르겠습니다 ... – user1040899

+1

아무도 모릅니다. 당신은 그것을 추적해야합니다. –

답변

2

좋아, 나는 이것에 대해 잠시 생각해 보았다. 나는 그것을 얻었다 고 생각한다.

중요한 것부터 먼저 : 당신이 서버에서 같은 세션 ID를 받고 있기 때문에, 우리는 어떤 쿠키 관련 문제를 배제 할 수있다. 분명히 a_name (비록 내가 recommend only alphanumeric characters for that cookie name)이라는 쿠키를 www.example.com에 만들고 성공적으로 그 a_name 쿠키를 forum.example.com에 읽는 것입니다. 하지만, 당신이 말했듯이, forum.example.com에서 어떤 데이터도 얻지 못하고 있습니다. session.cookie_lifetime = 0은 문제가되지 않습니다. 이는 단지 session cookie remains until the browser is closed을 의미합니다.

PHP의 세션을 조금 더 자세히 조사해야합니다. session_id()으로 읽고있는 세션 ID는 서버의 파일을 참조합니다. 일반적으로 해당 파일은 /tmp/sess_$session_id에 있습니다. 해당 파일의 내용은 $_SESSION 배열이며 직렬화됩니다. (데이터가 not serialized the same way이고 PHP에서 serialize()이 수행되지만 ... 지금은별로 중요하지 않습니다.)

  1. /tmp/sess_$session_id 파일이 www.example.com의 사용자 및 그룹으로 설정됩니다

    나는이 파일 권한 관련 문제라고 생각합니다.

  2. forum.example.com/tmp/sess_$session_id을 열려고 시도했지만 에는 적절한 사용 권한이 없습니다..print_r($_SESSION);

솔루션하려고 할 때 그 결과

  • , 당신은 빈 결과를 얻을 :
    확실히 그 www.example.comforum.example.com동일한 사용자 및 그룹으로 실행하기 위해 서버의 구성 파일을 확인 . 그것은 중요합니다! 아파치를 들어, *의의 .conf 파일을 찾을 수 : nginx를 들어

    User youruser 
    Group yourgroup 
    

    을 nginx.conf 찾을 : 서버의 설정 파일을 변경하는 옵션이없는 경우

    user youruser yourgroup; 
    

    , 당신은 확인해야합니다 그 두 사이트를 실행하는 사용자가 같은 그룹에 속합니다.

    당신이 처음 로딩 www.example.com에 의한 문제 및 서버의 쉘에서 다음 sudo ls -ltc sess_* 있는지 확인할 수 있습니다, SSH를 통해합니다 (sess_$session_id 끝나는 찾기). 그런 다음 사용자 및/또는 그룹 변경 사항을 보려면 forum.example.com을로드 한 다음 sudo ls -ltc sess_*을 다시로드하십시오. 나는 몇 가지 가정했습니다이 답변을 위해

  • +0

    답장을 보내 주셔서 감사합니다. .conf라고하면 아파치를 의미합니까? conf? 여기에 동일한 사용자 및 사용자 그룹 (기본 www 데이터)이 있습니다. 가상 호스트에 대한 링크가 있습니까? – user1040899

    +0

    하지만 당신이 말한 것을 확인했습니다 ('sudo ls -ltc sess _ \ *') 그리고 그것은 같은 그룹입니다. – user1040899

    +0

    여기에 예가 나와 있습니다 : '-rw ------- 1 www-data www-data 64 Mar 13 18:44 sess_xxxxxx' – user1040899

    1

    :

    • 사용자는 각 도메인에 한 번 이상이 자격 증명을 입력해야는
    • 당신이 (다른 방법으로는 심각한 보안 문제가 될 것입니다) 웹 루트 외부의 데이터베이스 또는 파일 공간에 대한 액세스.
    • 하위 도메인, 도메인 또는 다른 이름은 "사이트"로 참조됩니다.
    • 목표는 각 사이트/도메인에서 액세스 할 수있는 공통 파일 (실제 파일 또는 데이터베이스에 직렬화 된)을 갖는 것입니다. 어떻게 데이터베이스에 연결 : 그것이 내가에서 가져온 거에요 아이디어이기 때문에 내 예를 들어

    나는 데이터베이스를 사용하는 것,하지 데이터베이스/파일 액세스 기술, 나는 IE가 불필요한 라인을 제거해야합니다.

    이 개념이 내가 수행 한 것이라면 또는 다른 사람이 완성을 위해 공란을 채우려는 사람이 있으면 바로 의견을 남기십시오. 코드에.


    나는 완전히 다른 접근 방식을 취할 것입니다.
    질문에서 수집 한 내용과 내가 링크 한 관련 게시물에서 공통 세션 이름을 사용하여 세션을 공유하려고합니다.

    1. 각 사이트는 자신의 세션 ID입니다 있습니다.
    2. 각 사이트마다 자체 인증 쿠키 ($ _COOKIE [ 'userid'] 또는 $ _COOKIE [ 'userhash'])가 있습니다.
    3. 개별 세션이 만들어지고 공통 쿠키가 각 사이트에 저장됩니다.
      • 각 세션마다 동일한 데이터를 읽습니다.class MySessionHandler implements SessionHandlerInterface
      • 필자의 생각은 세션 처리기처럼 작동하는 클래스 인 더 단순한 접근 방법으로 일반적인 파일을 읽고 쓰는 것입니다. php의 세션 핸들러는 스크립트가 끝날 때까지 데이터를 저장하지 않기 때문에.

    원래 아이디어는 - 세부 사항으로 가지 않을 것이다, 그것은 단지 참조 용입니다.



    시작 부분에서 언급 한 바와 같이

    class customSessionHandler 
    { 
        private $hash; 
        private $id; 
        private $sess_db; 
    
        public function __construct($db) { 
         $this->hash = $_COOKIE['hash']; 
         $this->id  = some_user_authentication_function($this->hash); 
         $this->sess_db = $db; 
        } 
    
        public function get($key) { 
         $query = 
          "SELECT value ". 
          "FROM ".$this->sess_db. 
          "WHERE user_id = {$id} ". 
          " AND hash = {$hash} ". 
          " AND key = {$key}"; 
    
         $result = mysql_query($query); 
         return $result['key']; 
        } 
    
        public function set($key, $val) { 
         $query = 
          "REPLACE INTO ".$this->sess_db. 
          "SET {$key} = {$val} ". 
          "WHERE user_id = {$id} ". 
          " AND hash = {$hash}"; 
    
         return (mysql_query($query) === false) ? false : true; 
        } 
    } 
    $handler = new customSessionHandler('sess_data'); 
    session_start(); 
    



    class MySessionHandler implements SessionHandlerInterface { 
        private $savePath; 
    
        public function read($id) { 
         $id = some_user_authentication_function(); 
         $hash = $_COOKIE['_h']; 
    
         $result = mysql_query("SELECT sess_data FROM login_table WHERE user_id = {$id} AND hash = {$hash}"); 
         return $result['sess_data']; 
        } 
    
        public function write($id, $data) { 
         $id = some_user_authentication_function(); 
         $hash = $_COOKIE['_h']; 
    
         $result = mysql_query("UPDATE login_table SET sess_data = {$data} WHERE user_id = {$id} AND hash = {$hash}"); 
    
         return ($result === false) ? false : true; 
        } 
    } 
    
    $handler = new MySessionHandler(); 
    session_set_save_handler($handler, true); 
    session_start(); 
    
    , 제거 된 개념을 설명 필수가 아닌 임의의 코드입니다.
    모든 사람에게 분명하지 않을 수있는 것 : - $ key와 $ val은 데이터베이스에 보내기 전에 위생 처리가 필요합니다. (주입 공격 방지) - 해시가 로그인 함수로 전송되므로 필요에 따라 해시를 사용하여 세션 데이터를 지우고 사용자의 인증에도 사용할 수 있습니다. - mysql prepared statements는 이상적입니다. 따라서 생성자에서 두 개의 질의를 준비 할 수 있습니다. 그러면 모든 호출에 대해 statement를 재사용 할 수 있습니다. 그런 다음 연결 종료 코드를 소멸자에 넣습니다. 각 사이트는 자신의 해시의이 있다면

    이 훨씬 더 보안이 될 것이라고 생각 후




    .
    그런 다음 보안 이상을 감지하면 사이트 네트워크의 해시를 손상시키지 않고 하나의 사이트에서 자격 증명을 차단하거나 다시 요청할 수 있습니다.

    이가 포함 된 다른 테이블을 설정하는 것만 큼 쉬운 것입니다 구현하려면 - USER_ID - _ 이름 (example.com) - 해시 - 시간 제한 - 재 인증

    을하고 session_data 테이블을 수정, 따라서 해시로 $ key => $ val 쌍을 액세스하는 대신 user_id를 사용하여 액세스하십시오.


    읽어 주셔서 감사합니다. 잘하면 누군가에게 유용 할 것입니다.

    +0

    감사합니다. 그러나 이것은 솔루션을 기다리는 동안 실제로 한 것입니다. +1 시간 동안 – user1040899

    관련 문제