Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Ваш интернет-бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Октябрь 2005 → | ||||||
1
|
||||||
---|---|---|---|---|---|---|
3
|
4
|
5
|
6
|
7
|
9
|
|
10
|
11
|
12
|
13
|
14
|
16
|
|
17
|
18
|
19
|
20
|
21
|
23
|
|
24
|
25
|
26
|
27
|
28
|
30
|
|
31
|
Статистика
-1 за неделю
ExCode.ru - программирование на высоком уровне выпуск 12
Информационный Канал Subscribe.Ru |
ExCode.ru - программирование на высоком уровне | |||||||||||||||||||||||||||||||||||
Выпуск №12 ( 2005.10.15 )
|
|||||||||||||||||||||||||||||||||||
Здравствуйте, уважаемые подписчики!За эту неделю наш сайт значитьльно преобразился, было добавлено множество статей. Сейчас ведется работа над новым дизайном, который вы уже можете увидеть в ближайшие дни. Еще у нас открылся Магазин В котором продается софт для программистов. Вы очень просто можете заказать себе понравившийся диск и он придет вам по почте. |
|||||||||||||||||||||||||||||||||||
Новости копьютерного мира:
|
|||||||||||||||||||||||||||||||||||
Статья номера:
СессииС
самого начала PHP все приняли на ура, но как только на этом языке стали
создавать достаточно крупные проекты, разработчики столкнулись с новой
проблемой – в PHP отсутствовало понятие глобальных переменных! То есть,
выполнялся некий скрипт, посылал сгенерированную страницу клиенту, и
все ресурсы, используемые этим скриптом уничтожались. Попробую
проиллюстрировать: предположим есть две страницы одного сайта,
index.php и dothings.php. Исходники к этим страницам выглядят так:
Если выполнить эти два скрипта, то на первой странице мы увидим надпись “Меня задали на index.php”, а вторая страница будет пустой. Разработчики web-сайтов, недолго думая, стали использовать cookie для хранения глобальных переменных на стороне клиента. Процесс выглядел примерно так: пользователь приходит на главную страницу сайта, делает какие-то действия, и вся информация, связанная с этим пользователем, которая может потребоваться на других страницах сайта, будет храниться у него в браузере в виде cookie. Этот метод меет довольно серьезные минусы, из-за которых от PHP в своё время отвернулось немало разработчиков. Например, нам нужно авторизовать пользователя, чтобы разрешить ему доступ к закрытым (или принадлежащим только ему) разделам сайта. Придёться [кидать] пользователю cookie, который будет служит его последующим идентификатором на сайте. Такой подход становится очень громоздким и не удобным, как только сайт начинает собирать всё больше и больше сведений о поведении пользователя, ведь всю информацию, посылаемую пользователю, желательно кодировать, чтобы её нельзя было подделать. Ещё совсем недавно подделкой cookie можно было [пова лить] не один чат, а порой и пробраться в чужую почту. К тому же есть ещё на свете странные люди, у которых браузер cookie не поддерживает. При использовании сессий вся информация хранится не на стороне клиента, а на стороне сервера, и потому лучше защищена от манипуляций злоумышленников. Да и работать с сессиями куда проще и удобнее, так как все данные автоматически проходят через алгоритмы криптографии модуля PHP. В броузере клиента, лишь хранится уникальный идентификатор номера сессии, либо в форме cookie, либо в виде переменной в адресной строке броузера, какой из двух способов использовать для передачи идентификатора сессии между страницами интерпретатор PHPвыбирает сам. Это на 100 безопасно, так как идентификатор сессии уникален, и подделать его практически невозможно (об этом чуть далее, в разделе о безопасности сессий). Я не буду вдаваться в технологические вопросы устройства механизма работы сессий, а только опишу, как правильно работать с сессиями в PHP. Как работать с сессиями? Если вы будете тестировать примеры из статьи (или ваши скрипты) на каком-либо коммерческом хостинге, проблем с работой с сессиями быть не должно. Если же вы сами настраивали ваш сервер (будь то реальный сервер, или эмулятор), могут появляться ошибки примерно такого содержания: “Warning: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) failed: No such file or directory (2)”. Это значит всего лишь, что у вас неправильно настроен PHP. Решить эту проблему можно, прописав правильный путь (на существующую директорию) для сохранения сессий в файле php.ini и перезапустить сервер. Любой скрипт, который будет использовать переменные (данные) из сессий, должен содержать следующую строчку:
Эта команда говорит серверу, что данная страница нуждается во всех переменных, которые связаны с данным пользователем (браузером). Сервер берёт эти перемнные (из файла, либо из БД) и делает их доступными. Очень важно открыть сессию до того, как какие-либо данные будут посылаться пользователю; на практике это значит, что функцию session_start() желательно вызывать в самом начале страницы, например так:
После начала сессии можно задавать глобальные переменные. Это элементарно: вызываем функцию session_register(‘var_name’); и переменная $var_name становится доступной на всех страницах, использующих сессию. Для примера поковыряем программку, приведенную в начале статьи:
При запуске этих файлов (в логической последовательности конечно), первый скрипт (index.php) выдаст следующий результат: Всё ОК. Сессию загрузили! Пройдём, посмотрим что там… А второй (dothings.php) вот это: Меня задали на index.php Переменная $a теперь доступна на всех страницах данного сайта, которые запустили сессии. Другие полезные функции для работы с сессиями: session_unregister(string) – сессия [забывает] значение заданной глобальной переменной; session_destroy() – сессия уничтожается (например, если пользователь покинул систему, нажав кнопку [выход]); session_set_cookie_params(int lifetime [, string path [, string domain]])–с помощью этой функции можно установить, как долго будет [жить] сессия, задав unix_timestampопределяющий время [смерти] сессии. По умолчанию, сессия [живёт] до тех пор, пока клиент не закроет окно браузера. Примеры Теперь обратимся к практическому применению механизма сессий. Давайте рассмотрим пару довольно простых и в то же время полезных примеров. Авторизация Пользователя Вопросы по авторизации пользователей с помощью PHP-сессий постоянно задаются в конференциях по web-программированию. Механизм авторизации пользователей в системе с помощью сессий довольно хорош с точки зрения безопасности (см. раздел [Безопасность] ниже). Наш пример будет состоять из трёх файлов: index.php, authorize.php и secretplace.php. Файл index.php содержит форму, где пользователь введёт свой логин и пароль. Эта форма передаст данные файлу authorize.php, который в случае успешной авторизации допустит пользователя к файлу secretplace.php, а в противном случае выдаст сообщение об ошибке.
Безопасность Итак, мы умеем передавать идентификатор от одной страницы (PHP-скрипта) к другой (до следующего вызова с нашего сайта), а значит мы можем различать всех посетителей сайта. Так как идентификатор сессии – это очень большое число (128 бит), шансов, что его удастся подобрать перебором, практически нет. Поэтому злоумышленнику остаются следующие возможности: на компьютере пользователя стоит [троян], который ворует номера сессий; злоумышленник отлавливает трафик между компьютером пользователя и сервером. Конечно, есть защищенный (зашифрованный) протокол SSL, но им пользуются не все; к компьютеру нашего пользователя подошел сосед и стащил номер сессии. Такие ситуации, основанные на том, что кто-то что-то у кого-то стащит, в общем, не входят в компетенцию программиста. Об этом должны заботиться администраторы и сами пользователи. Впрочем, PHP очень часто можно [обмануть]. Давайте рассмотрим возможные точки взлома в программе авторизации пользователя: Файл authorize.php – попытка подбора пароля с помощью стороннего скрипта; Файл secretplace.php – попытка обмануть программу путём вписывания значений переменной $logged_user в адресной строке браузера, например так: http://www.yoursite.ru/secretplace.php?logged_user=hacker Итак, в нашей программе явно видны две [дыры], одна маленькая и не особо заметная, а вот вторая - просто огромная, через которую большинство хакеров и лезет туда, куда не надо. Как [залатать] дыру номер 1? Не будем писать тонны кода по блокировке IP-адреса и т.п., а просто проверим, откуда приходит запрос, а точнее с какой страницы пришёл запрос, если это будет любая страница с нашего сайта, то всё нормально, а во всех остальных случаях пускать не будем. Подкорректируем файл authorize.php:
Как избавиться от [дыры] номер 2? Предположим, у вас есть сайт, где каждый смертный может зарегистрироваться чтобы добавлять сообщения в форум. Естественно, в форуме у некоторых пользователей (админов, модераторов), возможностей больше чем у других, они, например, могут удалять сообщения других пользователей. Уровень доступа пользователя вы храните в сессии, в переменной $user_status, где $user_status = 10 соответствует полному доступу к системе. Пришедшему на сайт злоумышленнику достаточно зарегистрироваться штатным образом, а потом дописать в адресной строке браузера ?user_status=10. Вот и завёлся у вас на форуме новый админ! В принципе, любую переменную скрипта можно задать через адресную строку, просто дописав после полного адреса к скрипту вопросительный знак и название переменной с её значением. Давайте поправим наш код, чтобы этого избежать:
Итоги Механизм сессий – довольно удачная особенность языка PHP. Сессии росты, очень гибки в использовании. Кстати, есть одна, мало где документированная возможность сессий PHP (доступна начиная с версии 4.0.3) – в сессиях можно хранить не только переменные, но и объекты. Добавление от 14.12.2001 С выходом в свет PHP 4.1.0 – работа с сессиями значительно облегчилась. Все переменные сессий стали доступны из глобального массива _SESSION[‘var_name’]. Самое приятное наверное в том, что при присвоении какого-либо значения любому полю массива, переменная с таким же именем автоматически регистрируется, как переменная сессии, на пр:
выведет на экран броузера число 12. Новые статьи на сайте ExCode.ru:
|
|||||||||||||||||||||||||||||||||||
Послесловие:
К сожалению на нашу просьбу о помощи никто не откликнулся. Но мы все еще ищем людей, которые хотят поучаствовать в создании проекта ExCode.ru |
|||||||||||||||||||||||||||||||||||
Subscribe.Ru
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: comp.soft.prog.excode Архив рассылки |
Отписаться
Вспомнить пароль |
В избранное | ||