2008-10-27 8 views
6

POST를 사용하여 세션 ID를 직접 전달하려는 PHP 코드를 작성 중입니다. 나는 쿠키가 세션을 저장하는 것을 원하지 않는다. 왜냐하면 사용자가 POST 사이클을 빠져 나올 때 잃어 버리게되기 때문이다.PHP 세션 쿠키를 비활성화하는 방법은 무엇입니까?

PHP는 사용 가능한 경우 자동으로 쿠키를 설정합니다. php.inisession.use_cookies을 0으로 설정하여이 동작을 변경할 수 있음을 알게되었습니다. 불행히도 그 파일에 액세스 할 수 없으며 동일한 서버에서 실행중인 다른 스크립트의 동작을 중단하고 싶지도 않습니다.

PHP 스크립트에서 세션 쿠키를 비활성화하거나 무효화 할 수있는 방법이 있습니까?

EDIT : 제안 된 솔루션이 나를 위해 작동하지 않기 때문에 세션에서 무효화되어야하는 코드 위치에서 $ _SESSION = array()를 사용했습니다.

답변

6

는 여기에 자신의 .htaccess 파일을 작성하여 호스트의 기본 설정을 무시할 그 수를 잘못과는이다 훌륭한 튜토리얼을 아직 만져 본적이 없다면 http://www.askapache.com/htaccess/apache-htaccess.html

은 다음 코드

SetEnv session.use_cookies='0'; 
를 사이트 디렉토리에 "htaccess로"파일 (예 그건 파일 이름)를 만들고 배치
+0

감사합니다, 불행히도 아파치가 아니지만 매우 오래된 넷스케이프 서버입니다. – ypnos

+0

오 Google은 항상 우리의 친구입니다^_^ 서버의 이름을 말해 주시면 답변을 찾으려고합니다. hehehe – lock

+0

시도해 볼 수도 있습니다 doing header_remove ('Set-Cookie'); session_start() 호출 후. –

28

사용 ini_set() :

ini_set('session.use_cookies', '0'); 

또는 php.ini 파일에서

:

session.use_cookies = 0 
+0

감사합니다. 내 문제를 해결해야하지만, 불행히도 대신 PHP는 (심지어 HTML 출력 중간에도) 스크립트 실행 중간에 멈 춥니 다. – ypnos

+0

PHP가 없어지면 정답으로 표시하지 않겠습니다. 아마도 PHP 버그일까요? – ypnos

+0

아무 일도 일어나지 않는 것 같습니다. htaccess 솔루션이 나를 위해 일했습니다. – Heroselohim

2

할 수도 있습니다 htaccess로에 설정하면 그것은, 모든 스크립트로 다르게 적용되도록 넣어 각 요청에 대해 코드가 호출되도록해야합니다.

예 :

php_value로의 session.use_cookies 0

+0

불행히도 사이트에서 Netscape Server를 실행하고 있습니다. : – ypnos

+0

이것은 매우 멋지게 작동합니다. – nalply

+0

대단히 고마워요! – Heroselohim

-2

이 설치 세션 자신에게있다 할 수있는 방법입니다.

다른 모든 파일이 포함하는 중앙 포함 파일 (실제로 그 중 하나가 있습니까?)에서 가능한 한 빨리 몇 가지 작업을 수행해야합니다.

<input type='hidden' name='sessionid'><?= session_id() ?></input> 
+0

전달 된 sessionid를 사용하면 세션 고정 공격을 받기 쉽습니다. 그리고 PHP의 쿠키 메커니즘을 비활성화하지 않습니다. – hotzen

+1

거기에 답변을 만들었던 사람은 그가 왜 그렇게 대답했는지 기억하지 못할 수도 있습니다. – staticsan

2

그냥 주어진 시간 사용에 세션을 보내 겠 할 수 있도록해야하는 경우

if(!array_key_exists('sessionid', $_POST)) { 
    // recreate the sessionid 
    $sessionid = md5(rand().' '.microtime()); // Or something 
} else { 
    $sessionid = $_POST['sessionid']; 

session_id($sessionid); 
session_start(); 

이제 곧 양식을 시작으로, 당신은 포함 할 필요가 있음을 기억해야합니다 session_destroy().

// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (isset($_COOKIE[session_name()])) { 
    setcookie(session_name(), '', time()-42000, '/'); 
} 

// Finally, destroy the session. 
session_destroy(); 
1

I 쿠키 승/세션을 파괴하는 PHP의 문서화 된 접근 방식에 문제가 있었다 : 당신은 완전히 세션을 종료하려면, 여기에 바로 문서에서 붙여 넣은 코드 조각 복사는 /입니다.

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

이 내 쿠키가 두 번 설정보고의 결과로했다 : ('') 빈 이외의 쿠키 값을 설정하면 PHP 주석에 설명 된대로

Set-Cookie: SESSION_NAME=deleted; expires=Sat, 08-Jan-2011 14:09:10 GMT; path=/; secure 
Set-Cookie: SESSION_NAME=1_4f09a3871d483; path=/ 

은 제거 가져옵니다 " 삭제 된 "값은 있지만 두 번째 쿠키 세트는 남아 있습니다. 이다 (...) 내가 처리 세션의 소스에서 못 봤어

ini_set('session.use_cookies', '0'); 

,하지만 내 생각 엔 그 이기에, setcookie입니다 :

그 제거하기 위해, 나는 위의 코드가 제안 추가했다 세션 모듈을 우회하여 세션이 내가 그것을 불렀다는 것을 알지 못한다. 그래서 나는 삭제 된 쿠키를 설정 한 후에 기본 쿠키를 설정하고 있습니다.

내가 맥에서 테스트되었다 : PHP 5.3.6 수호신 - 패치 (CLI)와이 (내장 : 2011년 9월 8일 19시 34분 0초)

관련 문제