2011-01-22 5 views
2

다음은 코드입니다. 내가 바로 session_start() 후 다시 스크립트의 끝에서 var_dump($_SESSION)를 삽입 할 경우, 맨 처음 시간 I를PHP에서 내 세션 변수가 참조로 유지되는 이유는 무엇입니까?

session_start(); 
$session_ip_address = $_SERVER['REMOTE_ADDR']; 
if((!isset($_SESSION['SESSION_IP_ADDRESS'])) || !$_SESSION['SESSION_IP_ADDRESS']) { 
    $_SESSION['SESSION_IP_ADDRESS'] = $session_ip_address; 
} 


if($_SESSION['SESSION_IP_ADDRESS'] != $_SERVER['REMOTE_ADDR']) { 
    session_destroy(); 
    $_SESSION['security_error'] = true; 
} 

: 그것은 IP 주소를 확인하여 세션 ID가 스푸핑되지 않았는지 확인하는 간단한 조작입니다 (세션 쿠키 세트없이) 코드를 실행합니다. 배열이 비어있는 것을 보았습니다. 그러면 'SESSION_IP_ADDRESS'키에 할당 된 IP 주소가 있습니다. 여태까지는 그런대로 잘됐다. 하지만 코드를 다시 실행하면 'SESSION_IP_ADDRESS'가 참조로 저장되고 세션이 시작된 직후에으로 저장됩니다 (문자열 앞에 앰퍼샌드로 알 수 있음). 세 번째로 실행하면 세션이 시작된 직후 'SESSION_IP_ADDRESS'가 null 참조 ('SESSION_IP_ADDRESS' => &null)가됩니다. 무슨 일 이니?

array(1) { 
    ["SESSION_IP_ADDRESS"]=> 
    &string(11) "xx.xx.xxx.x" 
} 
array(1) { 
    ["SESSION_IP_ADDRESS"]=> 
    &string(11) "xx.xx.xxx.x" 
} 

그리고 세번째 및 그로부터마다 :

이 출력이 제 시간

array(0) { 
} 
array(1) { 
    ["SESSION_IP_ADDRESS"]=> 
    string(11) "xx.xx.xxx.x" 
} 

: 반복하기

이 출력을 처음

array(1) { 
    ["SESSION_IP_ADDRESS"]=> 
    &NULL 
} 
array(1) { 
    ["SESSION_IP_ADDRESS"]=> 
    &string(11) "xx.xx.xxx.x" 
} 

답변

0

내가 갖고있는 것 :

<?php 

$x = 'blah'; 
$_SESSION['blah'] = $x; 

var_dump($_SESSION); 

내가 얻을 : 눈에

array(1) { 
    ["blah"]=> 
    string(4) "blah" 
} 

없음 참조. 우분투 10.04.1에 PHP 5.3.2

+0

"시력"을 의미한다고 생각합니다. – Walf

+0

오른쪽. 감사. 고정 ... 이제 looooong 주 후 금요일되는 것을 비난합니다. –

0

이 값에 의해 지정 않으며, & 다음 $_SESSION에 대한 참조가 표현식 $_SESSION['x'] = $x;

2

세션 변수를 참조로가는 유일한 시간과 아무 상관이있다 세션 변수를 다른 세션 변수로 참조 할 때 (또는 원래 참조가 여전히 범위 내에있는 경우).

session_start(); 
$x = 'foo'; 
$_SESSION['x'] = &$x; 

이 당신에게 줄 것이다 :

array(1) { 
    ["x"]=> 
    string(3) "foo" 
} 

이 동안 :

$x = 'foo'; 
$_SESSION['x'] = $x; 
$_SESSION['y'] = &$_SESSION['x']; // reference to another $_SESSION var 

또는이 :

session_start(); 
$x = 'foo'; 
$_SESSION['x'] = $x; 
$_SESSION['y'] = &$x; 
var_dump($_SESSION); // reference still in scope 
예를 당

는 당신을 줄 것이다 :

array(2) { 
    ["x"]=> 
    string(3) "foo" 
    ["y"]=> 
    &string(3) "foo" 
} 

어느 쪽이든을,이 일을 :

session_start(); 
$y = $_SESSION['y']; 
$y = 'bar'; 

y 세션 변수를 수정하지 않습니다.이를 수행하려면 다음을 수행해야합니다.

session_start(); 
$y = &$_SESSION['y']; 
$y = 'bar'; 
2

고객 중 한 명이 매우 비슷한 문제를 겪고 있습니다.

PHP 구성 (PHP.ini)에 register_globals Off이 있는지 확인하십시오. 그렇지 않으면 일반 변수가 PHP 세션을 포함한 을 덮어 씁니다.

+0

phpinfo()를 사용하여 register_globals가 On인지 확인하는 것이 좋습니다. php.ini에서는 꺼져있을 수 있지만 코드 나 .htaccess로 켜져 있기 때문입니다. –

관련 문제