В PHP, почему мои переменные сеанса сохраняются как ссылки? - PullRequest
2 голосов
/ 22 января 2011

Вот код.Это простая операция, чтобы проверить, что идентификатор сеанса не был подделан путем проверки IP-адреса:

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;
}

Если я вставлю var_dump($_SESSION) сразу после session_start() и снова в конце сценария,затем в самый первый раз, когда я запускаю код (без набора файлов cookie сеанса), я вижу, что сначала массив пуст, затем ему назначен мой IP-адрес для ключа 'SESSION_IP_ADDRESS'.Все идет нормально.Но когда я снова запускаю код, теперь он показывает, что «SESSION_IP_ADDRESS» сохраняется как ссылка сразу после начала сеанса (я могу определить это по амперсанду, добавленному к строке).Когда я запускаю его в третий раз, я вижу, что SESSION_IP_ADDRESS теперь является пустой ссылкой ('SESSION_IP_ADDRESS' => &null) сразу после начала сеанса.Что происходит?!

Повторим, это вывод в первый раз:

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

Это вывод во второй раз:

array(1) {
  ["SESSION_IP_ADDRESS"]=>
  &string(11) "xx.xx.xxx.x"
}
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"
}

Ответы [ 4 ]

2 голосов
/ 14 августа 2011

У одного из моих клиентов была очень похожая проблема.

Убедитесь, что ваша конфигурация PHP (PHP.ini) имеет register_globals Off, в противном случае обычные переменные перезаписывают суперглобальные переменные , включая сеансы PHP.

2 голосов
/ 22 января 2011

Единственный раз, когда ваши переменные сеанса будут ссылками, это когда вы ссылаетесь на переменную сеанса с другой переменной сеанса (или если исходная ссылка все еще находится в области видимости).

Для примера:

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';
0 голосов
/ 22 января 2011

присваивается по значению, ссылка & рядом с $_SESSION не имеет ничего общего с вашим выражением $_SESSION['x'] = $x;

0 голосов
/ 22 января 2011

Если у меня есть:

<?php

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

var_dump($_SESSION);

Я получаю:

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

Нет ссылок в поле зрения. PHP 5.3.2 в Ubuntu 10.04.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...