array_merge + $_SESSION.

Yaponchick

Новичок
array_merge + $_SESSION.

Страница авторизации: (в нее приходит пост-запрос)

PHP:
<?php

session_start();

if(preg_match('/[^ a-z0-9а-я_\.-]/i', $_POST['login'])) header('Location: index.php');
if(preg_match('/[^ a-z0-9а-я_\.-]/i', $_POST['password'])) header('Location: index.php');

$query = sprintf("SELECT * FROM `accounts` WHERE `login` = '%s' AND `password` = MD5('%s')", $_POST['login'], $_POST['password']);
$r = mysql_query($query);

if(!$r || !mysql_num_rows($r)) {
	header('Location: index.php');
} else {
	$info = mysql_fetch_assoc($r);
	if($info['status'] != 1) {
		header('Location: index.php');
		exit();
	}
	$_SESSION['auth'] = true;
	=>>> $_SESSION = array_merge($_SESSION, $info); <<<=
	header('Location: index.php?PHPSESSID='.session_id());
}

?>
На индекс.пхп, код:
PHP:
<?php
session_start();
print_r($_SESSION);
?>
=>
Расскажите где я ошибся ?

P.S. если сделать $_SESSION['info'] = $info; то $_SESSION не "очищется".
 

sage

Новичок
ты не мог написать, что ты хочешь сделать и получить....
если сделать $_SESSION['info'] = $info; то $_SESSION не "очищется"
чего не сделает?

-~{}~ 15.06.06 17:00:

и почему ты кое-где ставишь exit после header('Location: ...'), а кое-где - нет? exit обязателен после header('Location: ...')
 

Yaponchick

Новичок
$info == большой массив.
Хочется чтобы Ключи массива $_SESSION и $info были равны.
Итого:
$_SESSION = $info; // убьёт старые значения $_SESSION
$_SESSION['info'] = $info; // добавит новыё ключ, и получится двумерный массив.

Про exit():
в 1ом IF'e правило "или то, или это"
 

bkonst

.. хочется странного?...
А session.use_only_cookies случайно не в единицу установлено?
При этом PHP будет игнорировать идентификатор сессии, что передается в URL
 

sage

Новичок
bkonst
это кто тебе такое сказал?
Yaponchick
ну и...... в чём собственно вопрос то?
 

bkonst

.. хочется странного?...
Вообще - Php.net.

session.use_only_cookies boolean

session.use_only_cookies specifies whether the module will only use cookies to store the session id on the client side. Enabling this setting prevents attacks involved passing session ids in URLs. This setting was added in PHP 4.3.0.
Меня гнусно обманули?
 

Yaponchick

Новичок
sage
Окей

объясню по другому:

1.php
PHP:
<?php
session_start();
$_SESSION['noob'] = 'noob';
?>
<a href="2.php">asd</a>
2.php
PHP:
<?php
session_start();
$info = array('login' => 'asd', 'password' => '123');
$_SESSION = array_merge($_SESSION, $info);
?>
<a href="3.php">asd</a>
3.php
PHP:
<?php
session_start();
print_r($_SESSION);
?>
в 3.php:
Array()

Вопрос: почему убилась $_SESSION ?
 

bkonst

.. хочется странного?...
И какая версия PHP? В 5.1.1 не воспроизводится.
 

Yaponchick

Новичок
sage
в 2.php
PHP:
print_r($_SESSION);
Выводит то что надо.


в 3.php пусто.
P.S. php 5.1.2(cli)
 

bkonst

.. хочется странного?...
sage
Можно гипотезу, как PHP в этом случае prevents attacks involved passing session ids in URLs?

... я только что проверил. 5.1.1. Игнорирует.

Edit: хотя по умолчанию - выключено, так что, скорее всего - не тот случай
 

Yaponchick

Новичок
bkonst
Это всё происходит в пределах сессии(я не хакаю сам себя).
Может $_SESSION нельзя merge'ануть ?
 

sage

Новичок
bkonst
"passing session ids in URLs" означает не передаёт ид сессии в урл, а не
При этом PHP будет игнорировать то, что передается в URL
разницу видишь?
Yaponchick
в 2.php
PHP:
echo $_SESSION['noob']
что даёт?
 

bkonst

.. хочется странного?...
Вряд ли. Пробовал:
PHP:
<?php

session_start();

var_dump($_SESSION);

$test = array("test" => "XXX", "a" => "b");
$_SESSION['ttt'] = 1;
$_SESSION = array_merge($_SESSION, $test);

var_dump($_SESSION);

?>
При втором вызове первый var_dump вывел правильное содержимое.

Попробуй session_id отследить. Если одинаковые - получается, что это явный баг PHP. Если разные - баг всё-таки у тебя ;)
 

Yaponchick

Новичок
sage
выдаёт noob

но в 3.пхп
echo $_SESSION['noob'];
Приводит к ошибке. ($_SESSION пуст)
 

bkonst

.. хочется странного?...
sage
Я не имел в виду игнорировать всё. В данном контексте это означало "игнорировать идентификатор сессии, который передается в URL". Предполагалось-таки, что собеседник догадается.
 

_vampiro_

Новичок
IMHO - разрешать только буквенно-циферные пароли - облегчать задачу взлома.

Do NOT unset the whole $_SESSION with unset($_SESSION) as this will disable the registering of session variables through the $_SESSION superglobal. (с)
 

Фанат

oncle terrible
Команда форума
sage
учи английский.

Yaponchick
ВСЕ твои проблемы решаются, если ты будешь действовать с массивом $_SESSION по-человечески.
а именно - не пихать в него сразу все данные, а использовать, как КОНТЕЙНЕР
в котором может леждать массив $info, а могут лежать любые другие. в конейнере.
не надо производить с массивом $_SESSION никаких действий, кроме "достал-положил".
и волосы твои будут мягкими и шелковистыми.
 

Yaponchick

Новичок
bkonst
Твой код "работает", но если добавить переход на другую страницу, а там session_start() + print_r($_SESSION); то Array().

session_id везде одинаковы.

Фанат
На вкус и цвет, товарища нет © Пословица.

Вывод: array_merge + $_SESSION + php 5.1.2(cli) -> suXX ;D
 

Фанат

oncle terrible
Команда форума
Yaponchick
ты определись, что именно у тебя не работает - сессии вообще, или кривое добавление в кривой массив.
 
Сверху