Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 [ 118 ] 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

Примечание

К сожалению, пользователи отключают Cookies гораздо чаще, чем это может показаться на первый взгляд. Например, всего год назад Всероссийский Клуб Вебмастеров проводил опрос, в результате которого выяснилось, что количество пользователей Интернета, отключивших у себя по каким-то соображениям поддержку Cookies, достигает 20-30%. Что это за соображения? Многие думают, что Cookies потенциально являются "дырой" в безопасности их компьютера. Это совершенно не соответствует действительности, потому что браузеры всегда имеют ограничения на количество и суммарный объем Cookies, которые могут быть в них установлены. Другие же просто не хотят, чтобы неизвестно кто писал что угодно на их жесткий диск. Правда, это не мешает таким "перестраховщикам" открывать пришедший по почте исполняемый файл - такой же, как из письма типа "Love letter"

В общем, вы видите, что для абсолютной уверенности в работоспособности ваших сценариев на любом браузере нужен механизм, позволяющий отказаться от использования Cookies при управлении сессиями. Такой механизм действительно существует в PHP, и основная его идея состоит в том, чтобы передавать идентификатор сессии не в Cookies, а каким-нибудь аналогичным путем - например, в данных запроса get. Последнее мы сейчас и рассмотрим.

Явное использование константы SID

В PHP существует одна специальная константа с именем SiD. Она всегда содержит имя группы текущей сессии и ее идентификатор в формате имя=идентификатор. Вспомните: именно в таком формате данные принимаются, когда они приходят из Cookies браузера. Таким образом, нам достаточно просто-напросто передать значение константы SiD в сценарий, чтобы он "подумал", будто бы данные пришли из Cookies. Вот пример:

\ Листинг 25.3. Sesget.php: простой пример использования сессий без Cookies !

<?

session name("test");

session start();

session register("count");

$count=@$count+1;

?>

<body>

<h2>Счетчик</h2>

В текущей сессии работы с браузером Вы откр1ли эту страницу



Все будет работать так, как описано, только в том случае, если в браузере действительно отключены Cookies. Если же они включены, PHP просто не будет генерировать константу sid (она будет пустой) и задействует Cookies. Все вполне логично.

Неявное изменение гиперссылок

Похоже, что вы уже начали думать о том, как же это все-таки неудобно - везде вставлять участки кода <?=SID?>, и, пропусти вы их в одном месте, придется долго искать ошибку? Что же, законный повод для беспокойства, но, к счастью, разработчики PHP уберегли нас и от этой напасти.

Вы не поверите, но, если в какой-нибудь гипессылке вы по ошибке пропустите <?=SID?>, PHP вставит его за вас автоматически. Причем так, чтобы это никак не повредило другим параметрам, возможно, уже присутствующим в URL. Если вы в шоке, то запустите следующий сценарий в браузере, а затем наведите мышь на гиперссылку и посмотрите в строке состояния, какой адрес имеет ссылка:

<?session start()?> <body>

<a href=/path/to/something.php>Click here!</a><br>

<a href=/path/to/something.html?a=aaa&b=bbb>Click here!</a><br>

<a href=/>Click here!</a><br>

</body>

Вот адреса этих ссылок с точки зрения браузера:

http: www.somehost.ru/path/to/something.php?PHPSESSID=8114536a920bfb01f http: www.somehost.ru/path/to/something.html?a=aaa&b=bbb&PHPSESSID=86a20

<?=$count?> раз(а). Закройте браузер, чтобы обнулить этот счетчик.<hr>

<a href=sesget.php?<?=SID?»Click here!</a>

</body>

Если набрать в браузере адрес вроде такого:

http: www.somehost.ru/sesget.php

то создастся новая сессия с уникальным идентификатором. Разумеется, если сразу же нажать кнопку Обновить, счетчик не увеличится, потому что при каждом запуске будет создаваться новое временное хранилище - у PHP просто нет информации об идентификаторе пользователя. Теперь обратите внимание на предпоследнюю строчку листинга 25.3. Видите, как хитро мы передаем в сценарий, запускаемый через гиперссылку, данные об идентификаторе текущей сессии? Теперь с его точки зрения они якобы пришли из Cookies



Описанная только что возможность работает лишь в том случае, если в настройках PHP установлен в значение истина параметр

session.use trans sid.

Он как раз и включен по умолчанию.

Зачем же тогда нужна константа siD? Да незачем. Это - устаревший прием передачи идентификатора сессии, и я привел его здесь только для того, чтобы нарисовать более полную картину, что в действительности происходит, а также показать, насколько иногда PHP может быть услужлив.

Неявное изменение формы

Возможно, прочитав этот заголовок, вы еще более обрадуетесь. Да, PHP умеет не только изменять гиперссылки, он также и добавляет скрытые поля в формы, которые формирует сценарий, чтобы передать идентификатор сессии вызываемому документу! Это ставит последнюю точку над i в вопросе поддержки сессий для пользователей, которые отключили у себя Cookies.

Напоследок рассмотрим пример сценария, который выводит обыкновенную пустую форму, и в ней, как по мановению волшебной палочки, появляется дополнительное скрытое поле с идентификатором сессии.

<?session start()?>

<form action=aaa method=post>

</form>

А вот почти дословно то, что вхдается в браузере (Internet Explorer) после запуска этого сценария и выбора в меню пункта Просмотр в внде HTML:

<form action="aaa" method="post">

<iNPUT TYPE=HiDDEN NAME="PHPSESSiD" VALUE="0a717e848e91db11b524a"> </form>

Как видим, PHP добавил в форму скрытое поле с нужным именем и значением. Он также заключил в кавычки значения атрибутов тэга <form> (правда, я сам не ожидал увидеть такой эффект, когда опробовал этот сценарий). Что же, кавычки так ка-вгчки, хуже от этого не будет .

http: www.somehost.ru/?PHPSESSID=8114536a920bfb2a

(Я немного урезал идентификаторы сессий, чтобы они уместились на странице этой книги.) Обратите внимание на второй адрес: он говорит, что идентификатор корректно вставился в конец обычных параметров страницы. Третий пример заставляет задуматься о том, что идентификатор сессии прикрепляется к URL независимо от типа документа, на который он указывает.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 [ 118 ] 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189