2009-08-28 6 views
9

나는 foo.com을 운영합니다. 나는 foo.com에 살고있는 두 개의 다른 응용 프로그램을 가지고 있습니다 : 하나는 foo.com/bar이고, 다른 하나는 foo.com/example입니다. 세션을 사용하여 로그인하는 동안 사용자에 대한 정보를 추적하지만 사용자가 foo.com/bar에서 foo.com/example로 이동하면 foo.com/example은 사용자가 foo.com/에서 시작한 세션을 봅니다. 정보를 사용합니다. 내 질문은, 어떻게 동시에 두 개의 서로 다른 세션을 각 디렉토리에 사용할 수 있습니까?동일한 도메인에 두 개의 서로 다른 세션이 있습니다.

+0

django 기반 프로젝트에서 동일한 기능을 수행하려면 어떻게해야합니까? – Dania

답변

2

같은 세션을 사용할 수도 있지만 원하는 변수 이름을 변경할 수 있습니다.

편집 : 죄송합니다. 귀하의 질문에 답변을 드리지 못해 죄송하지만 다른 해결책이 있습니다.

+0

이것은 최고의 솔루션 인 것 같습니다. 감사. – Matthew

+0

Matthew에게 감사드립니다. 귀하의 질문에 대답한다면 '답변'으로 표시하는 것을 잊지 마십시오. :) – user103219

+0

투표 한 응답이 가장 좋습니다. 가장 좋은 방법은 'session_name'입니다. – joryl

1

session_set_cookie_params을 사용하여 저장할 세션의 도메인과 폴더를 설정할 수 있습니다. IE :

// Used on foo.com/example 
session_set_cookie_params(86400, '/example'); 

// Used on foo.com/bar 
session_set_cookie_params(86400, '/bar'); 
+0

이것은 작동하지 않습니다. 나는 성공하기 전에 그것을 시도했다. 내 글로벌 php.ini 설정과 관련이있을 수 있습니다. – Matthew

+0

후행 백 슬래시를 경로에 추가하려면 이 필요합니다. 그것 없이는 확실히 작동하지 않을 것입니다. –

+0

php.ini에 액세스 할 수있는 경우 'session.cookie_path'매개 변수를 직접 설정해보십시오.이 매개 변수는이 함수가 재정의해야 할 사항입니다. php.ini 파일에 대한 액세스 권한이없는 경우 ini_set()을 사용할 수도 있습니다. –

0

또 다른 해결책은 foo.com/bar의 모든 세션 값을 "bar_"및 foo.com/example과 "example_"으로 미리 보류하여 세션 내에서 네임 스페이스를 효과적으로 생성하는 것입니다.

지루한 일이 없도록하는 방법은이 기능을 함수 또는 클래스 메서드로 추상화하는 것입니다. 예 :

function set_session_value($key, $value) { 

    //figure out which prefix to use by checking the current working 
    //directory, or whatever method you like. set $prefix equal to 
    // "bar_" or "example_". 

    $_SESSION[$prefix . $key] = $value; 
} 

일치하는 기능으로 값을 가져옵니다.

이 주요 이점은/bar에서 프로그래밍 할 때/in example에서 사용하는 변수 이름을 생각할 필요가 없다는 것입니다. 다른 하나는 세션 값을 저장하는 방법을 변경하기로 결정한 경우 모든 것을 한 곳에서 쉽게 변경할 수 있다는 것입니다.

41

session_start를 호출하기 전에 session_name으로 전화해야합니다. 이것은 세션을 식별하는 데 사용되는 쿠키의 이름을 설정합니다 (기본값은 PHPSESSID 임).

각 응용 프로그램마다 다른 이름을 사용하십시오. 세션 내 변수를 망칠 필요가 없습니다.

+6

+1 : 이것은 응용 프로그램 세션을 별도로 유지하는 가장 좋은 방법입니다. – Powerlord

+1

별도로 보관하는 것이 가장 좋은 해결책입니다. +1하기 – eHussain

0

나는 이것이 오래되었음을 알고 있지만 누군가가 도움이 될 수 있다고 생각했습니다. 이 예제는 관리 영역에 대해 별도의 세션을 설정하는 방법을 보여줍니다.

if ($_SERVER['REQUEST_URI'] == '/admin/'): 
    $session_name = 'session1'; 
else: 
    $session_name = 'session2'; 
endif; 
session_start($session_name); 
4

지금까지 제공되는 솔루션과 관련된 잠재적 보안 의미를 강조하는 것이 매우 중요하다고 생각합니다. 저는 약 5 년간 웹 애플리케이션 침투 테스터로 일했으며이 시간에 수많은 취약한 보안 애플리케이션을 개발하여 IT 보안을 시작한 후배의 교육을 지원했습니다.

나는 방금 제공되는 솔루션을 테스트 해왔고 그 중 어느 것도 이웃 앱에 속한 세션에 대한 액세스를 차단하지 못한다고 언급했습니다. session_name()과 다른 세션 식별자 이름을 사용한다고해서 사용자가이 식별자의 값을 사용하는 것은 금지되지 않습니다. PHP에는 각 세션 식별자 이름에 대한 분리 저장 공간이 없습니다. 다른 세션 이름을 사용하고 브라우저의 쿠키 경로를 설정하는 두 개의 앱이있었습니다. 다음 각각의 설정 - 쿠키 지시어는 HTTP 응답에 포함되었다 :

Set-Cookie: TESTONE=<value one>; path=/testone/ 

Set-Cookie: TESTTWO=<value two>; path=/testtwo/ 

모두 애플 리케이션은 완전히 별도의 사용자를 가지고 누군가는, 그들은 /testone/ 애플 리케이션에 따라에 대한 정보를 액세스 할 수있다 /testtwo/ 응용 프로그램에 대한 액세스 권한을 가지고 있다면 세션 매개 변수가 처리되는 방식.아래의 코드 예는 인증 성공 후 두 앱이 모두 $_SESSION["authenticated"] 매개 변수를 사용한다고 가정 할 때 잠재적 인 데이터 유출을 보여줍니다.

<?php 
    session_name("TESTONE"); 
    ini_set("session.cookie_path","/testone/"); 
    session_start(); 
    if ($_SESSION["authenticated"] == "yes") 
     echo $topsecretinfo; 
?> 

$topsecretinfo 하나에만 /testtwo/ 응용 프로그램에 인증 자신의 TESTTWO 세션 식별자의 값을 가져 와서 /testone/ 응용 프로그램에 요청을 보낼 때 TESTONE 세션 식별자의 값으로 사용하기 위해 필요에 액세스하려면. PHP 세션 조회 프로세스는 해당 값의 구문 분석을 제외한 세션 식별자의 이름을 인식하지 못합니다. 즉 "agcy648dja6syd8f93"의 세션 식별자 값은이를 참조하는 데 사용 된 이름과 관계없이 동일한 세션 객체를 반환합니다.

관련 문제