Веб-студия, создание сайтов, создание Интернет-магазинов
-
Рубрики
-
Календарь
Февраль 2012 Пн Вт Ср Чт Пт Сб Вс « Авг 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 Архивы
- Август 2011 (6)
- Март 2011 (3)
- Февраль 2011 (3)
- Ноябрь 2010 (7)
- Октябрь 2010 (2)
- Сентябрь 2010 (7)
- Август 2010 (8)
- Июль 2010 (11)
- Июнь 2010 (9)
- Май 2010 (16)
- Апрель 2010 (48)
- Март 2010 (23)
- Февраль 2010 (14)
- Январь 2010 (14)
- Декабрь 2009 (9)
- Ноябрь 2009 (6)
- Октябрь 2009 (8)
- Сентябрь 2009 (13)
- Август 2009 (22)
- Июль 2009 (30)
- Июнь 2009 (46)
- Май 2009 (28)
- Апрель 2009 (14)
- Март 2009 (8)
- Февраль 2009 (11)
Новые комментарии
- Галина к записи С Днем сисадмина!
- Примеры скриптов « Эхо блогосферы к записи Разбор XML файла с помощью PHP
- Примеры скриптов « Эхо блогосферы к записи Разбор XML файла с помощью PHP
- admin к записи Сделать спойлер
- admin к записи Сделать спойлер
- Sveta к записи Сделать спойлер
- Sveta к записи Сделать спойлер
- Димыч к записи Простой скрипт для создания превью
Безопасное программирование на PHP. Кража сессии.
В настоящий момент ни одно серьёзное Web-приложение не обходится без использования механизма сессий. Наиболее распрастранено использование сессий для разграничения доступа пользователей к личным ресурсам.
Рассмотрим типичный процесс авторизации с использованием сессии.
1. У пользователя запрашивается логин и пароль.
2. Если авторизация проходит успешно, то создается новая сессия, со значением «успешной авторизации».
3. Пользователю назначается уникальный идентификатор (SID), который заранее невозможно предсказать, а, значит, и подобрать
.
4. SID записывается либо в cookies браузера, либо передается через адресную строку браузера (если cookies отключены).
В результате успешной авторизации скрипту становится доступными значения переменных из суперглобального массива $_SESSION, по наличию которых скрипт предоставляет доступ к некоторому ресурсу, например, вход на панель администрирования сайта.
Проблема заключается в том, что если злоумышленник каким-либо образом узнает SID другого пользователя, он сможет подставить его в свои cookies, или адресную строку браузера и войти на сайт с правами данного пользователя.
Замечание
Несколько лет назад имело место несколько скандалов, когда в системах удалённого управления банковским счётом уникальный номер (SID) генерировался просто прибавлением единицы к последнему использованному значению. Быстрая авторизация приводила к выдачи двух значений SID, допустим 40346 и 40348. Подстановка номера 40347 позволяла получить доступ к чужому счёту
.
В настоящее время SID представляет уникальную последовательность цифр и букв, не привязанную к счётчику. Но как же злоумышленик узнает чужой SID?
Существуют два самых распространенных варианта:
1. Например, владелец сессии сам показал ее, неосторожно оставив ссылку такого типа где-нибудь на форуме или гостевой книге.
http://forum.dklab.ru/?sid=01c1739de76ed46e639cd23d33698121
Переход по этому адресу, автоматически наделяет злоумышленника правами пользователя для которого выделена сессия с идентификатором 01c1739de76ed46e639cd23d33698121.
Конечно, сессия пользователя уничтожается при отсутствии активности через некоторое время. И поэтому злоумышленнику следует поторопиться
. С другой стороны тотальная распространённость пауков (спайдеров) позволяет организовать целеноправленный автоматический поиск таких ссылок.
2. Если даже сессия не указана явно в строке браузера, а хранится в Куках. У злоумышленика все равно есть возможность завладеть идентификатором. Рассмотрим небольшой скрипт простейшей гостевой книги.
1 2 3 4 5 6 | <!--- тут чего-то --> <form action=addmsg.php method=post> Текст: <textarea name="text"></textarea> <input type="submit" value="Добавить"> </form> |
Пример:
Содержимое обработчика addmsg.php представлено ниже
1 2 3 4 5 6 7 8 9 10 11 12 | <?php
if(!empty($_POST['text']))
{
$line = str_replace("/ ?
/s", " ", $_POST['text']);
//запись в базу или в файл
}
else
{
exit("Ошибка");
}
?> |
Обратите внимание – в скрипте явно пропущен вызов функции htmlspecialchars(), которая преобразует символы < в < и > в > в результате чего, злоумышленник может вставить в текст любые HTML-теги и скрипты JavaScript.
И что мы получаем? Маленькая оплошность (казалось бы пропустили всего лишь какой-то htmlspecialchars() перед выводом сообщения в браузер), которая позволяет загружать в новом окне страницу злоумышленика, передавая ей значения из cookies.
Для борьбы с уязвимостями такого рода лучше всего бороться «устойчивыми» методами, действуя по принципу «всё что не разрешено – запрещено». Не следует скрывать SID и подвергать текст многоэтапным проверкам – вероятность создания ошибок в этом случае только возрастает. Более надёжным в этом случае является метод привязки SID к IP-адресу, пользователя владеющего сессией. Такой способ широко распространен во многих известных форумах, например phpBB.
Скрипт авторизации
1 2 3 4 5 6 7 | <?php
if (логин и пароль верные)
{
$_SESSION['authorized'] = true;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
?> |
Тогда скрипт, который предоставляет доступ к определенному ресурсу, может содержать следующий код
1 2 3 4 5 6 7 8 | <?php
if (!empty($_SESSION['authorized']) &&
$_SESSION['ip'] == $_SERVER['REMOTE_ADDR'])
{
// Доступ к ресурсу открыт.
}
else die("Доступ закрыт.");
?> |
Т.е. теперь с данной сессией может работать только тот пользователь, IP-адрес которого совпадает с IP-адресом, переданным серверу при авторизации. Если злоумышленик перехватит сессию, IP-адрес то у него другой – поэтому в доступе ему будет отказано.
Данный метод не является универсальным и у него тоже есть слабые места.
1. Если пользователь и злоумышленик выходят в Интернет через общий прокси-сервер, то они будут иметь один общий IP-адрес (это характерно для сетей университетов, заводов и других крупных учреждений), т.е. каждый может украсть SID соседа, хотя бы вышеуказанными методами.
2. Если пользователь использует модем, и произойдет обрыв связи, то после восстановления связи, ему скорее всего будет назначен другой IP-адрес. Пользователь может быть неприятно удивлён, если он будет огульно зачислен в ряды злоумышленников (поэтому писать угрозы и призывы к совести в системах защиты не стоит – в таких системах тоже бывают ошибки). Последний недостаток имеет место на форумах, посетители которых имеют привычку при наборе длинного ответа отключать Интернет и работать offline. Нажатие на кнопку «Ответить» приводит к тому, что вся набраная информация теряется, так как никто не заботится о том, что бы сохранять текст набранный злоумышлеником.
Выход: (вернее полу выход) Проверять на идентичность только первые 3 цифры IP адреса, кража SID по-прежднему статистически маловероятна, однако это в большинстве случаев, позволяет более мягко отнестись к разрыву соединения, так как провайдерам обычно выделяют неразрывный диапазон IP-адресов, в котором меняется только последняя цифра.
Автор: Лободенко Д.И.
Пока нет комментариев.
Вы должны зайти чтобы оставить комментарийt.
Нет трэкбэков.
|
General Office Technologies 2010 © All Rights Reserved. Architecture and Web Design: Alexander Morgan |

