![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
HackMan |
|
||||
![]() Юзверь-программист ![]() ![]() Профиль Группа: Участник Сообщений: 391 Регистрация: 18.6.2005 Где: .ua Репутация: 8 Всего: 9 |
Есть скрипт, для авторизации администратора
login.php
примечания:
Есть скрипт, для проверки валидности сессии, и для её продлевания check.php
примечания:
И есть много страниц самой админки. Посути, страница одна, но от различных значений переменных инклудятся разные скрипты. Вопрос такой: нужно ли мне вставлять require "check.php" в каждый скрипт, который потом инклудится в главную страницу, или можно ограничеться только одной главной страницей? -------------------- Завтра - это самый загруженный день недели ![]() ![]() ![]() |
||||
|
|||||
Golda |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 26.3.2007 Где: Ариель, Израиль Репутация: 20 Всего: 42 |
Если есть один скрипт - точка входа, достаточно подключать в нем.
Но вообще, я думаю, решение не из лучших. register_globals не стоит включать даже исходя из потенциальной опасности пропустить несанкционированную регистрацию переменных. А у Вас тут прямые дыры. Что если я, не проходя логина, вызову основную страницу следующим образом:
Переменной $session в сессии нет. Не зарегистрирована. Но вы же и не проверяете, что она зарегистрирована. Ваш скрипт спокойно "скушает" ее из GET. Никакой проверки на правдоподобность $session['id'] тоже нет. Хакеру остается только подобрать подходящий таймстемп. Советую: *) отключить register_globals *) различать, откуда приходят переменные ($_GET, $_POST, $_COOKIE, $_SESSION) *) возможно, добавить проверку на правдоподобность $session['id'] Ну и не стоит одну и ту же функцию get_ip() определять в двух файлах. Подключайте ее из какого-то одного Добавлено через 10 минут и 58 секунд Сами логин и пароль тоже безопаснее хранить не зашитыми hardcoded в скрипт, а где-нибудь в конфигурации за пределами DOCUMENT_ROOT или защищенной .htaccess Это сообщение отредактировал(а) Golda - 2.7.2007, 00:08 -------------------- "For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics |
|||
|
||||
HackMan |
|
||||||
![]() Юзверь-программист ![]() ![]() Профиль Группа: Участник Сообщений: 391 Регистрация: 18.6.2005 Где: .ua Репутация: 8 Всего: 9 |
Ну как же... у меня в каждой странице стоит вначале require "check.php"; так что проверка на session[id] всё же есть ![]() index.html
так что хакеру придётся ещё вычислить md5 от собственного ip ![]() спасибо за то что указали на дырку. делалось ночию, недоглядел ![]() а как же другим страницам узнать, что администратор авторизировался?
это всё будет. сейчас главное сделать авторизацию ![]() Это сообщение отредактировал(а) HackMan - 2.7.2007, 01:13 -------------------- Завтра - это самый загруженный день недели ![]() ![]() ![]() |
||||||
|
|||||||
Golda |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 26.3.2007 Где: Ариель, Израиль Репутация: 20 Всего: 42 |
Ну и что? Ну, попал он в check.php. Там скрипт попытает поднять сессию (session_start()). Переменная $session из сессионных данных не появилась. Но зато она существует благодаря GET-запросу. Поэтому проверка isset($session) будет пройдена. Вторая проверка - тоже не невыполнимая задача. Да, проверка на session[id] есть. Я проглядела. Но, поверьте, хакеру не сложно будет узнать как свой IP, так и md5()от него. Даже подбор значения по известному хешу md5() часто возможен. А уж прямое преобразование точно проблемы не представляет, если стало ясно, какие данные пользователя искать. Да нет, здесь есть, конечно, проблема. Проблема - понять, что же проверяет скрипт. На самом деле Ваш вывод не дает прямых подсказок пользователю о том, что скрипт проверяет и какие имена переменных использует. Но все же лучше таких дыр не оставлять.
Со всеми бывает ![]() Подключайте check.php вначале, до загрузки остальных модулей. Тогда, если сессия пользователя невалидна, строки
перенаправят пользователя на login.php и завершат работу скрипта. А если уж дальнейшие модули загрузились, значит с авторизацией все в порядке. Остальным модулям ничего и проверять не нужно -------------------- "For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics |
||||||
|
|||||||
HackMan |
|
|||
![]() Юзверь-программист ![]() ![]() Профиль Группа: Участник Сообщений: 391 Регистрация: 18.6.2005 Где: .ua Репутация: 8 Всего: 9 |
Я строчку unset($session) запихнул не в тот скрипт
![]() Его надо было в check.php. Тогда переменная $session просто обнуляется, и неважно, чем она была раннее передана. А дальше открывается сессия, и если переменная $session не подгругилась из неё, то и проверка isset($session) не будет выполнена. Но как я понимаю, мне придётся в каждый скрипт прописывать require "check.php" для того чтобы проверить, создана ли сессия. Иначе пользователь просто введёт в строке адреса путь к нужному скрипту, и смысла от авторизации никакой ![]() -------------------- Завтра - это самый загруженный день недели ![]() ![]() ![]() |
|||
|
||||
Golda |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 26.3.2007 Где: Ариель, Израиль Репутация: 20 Всего: 42 |
Да, это решает проблему. Я бы все же отключила register_globals, чтобы не нарваться в дальнейшем на подобные, но... вольному воля ![]() Можно так. Но мне больше нравятся и другие вариант: работы меньше, да и расчет идет не на потенциально уязвимый скрипт авторизации (я в данном случае не именно Ваш имею в виду, любой), а на средства сервера с гораздо более простой, прямолинейной, а значит и надежной логикой. К тому же такие лишние запросы обрабатываться будут быстрее, не доходя до PHP вообще
Это сообщение отредактировал(а) Golda - 2.7.2007, 07:47 -------------------- "For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics |
|||
|
||||
HackMan |
|
|||
![]() Юзверь-программист ![]() ![]() Профиль Группа: Участник Сообщений: 391 Регистрация: 18.6.2005 Где: .ua Репутация: 8 Всего: 9 |
гениально!
![]() вобщем, надо через .htaccess запретить доступ к подключаемым скриптам, а в основных писать require "check.php" ![]() Большое спасибо! P.S. Жалко, нехватает несколько постов, что бы мог плюсики выставлять... -------------------- Завтра - это самый загруженный день недели ![]() ![]() ![]() |
|||
|
||||
ilyalyu |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
помнится, в manual-e по PHP учат вместо unset($_SESSION) использовать присваивание: $_SESSION = Array();
|
|||
|
||||
HackMan |
|
|||
![]() Юзверь-программист ![]() ![]() Профиль Группа: Участник Сообщений: 391 Регистрация: 18.6.2005 Где: .ua Репутация: 8 Всего: 9 |
А где вы видели, что бы я использовал unset($_SESSION)?
-------------------- Завтра - это самый загруженный день недели ![]() ![]() ![]() |
|||
|
||||
ilyalyu |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Вот. Извини, не заметил отсутствия прочерка ![]() Это сообщение отредактировал(а) ilyalyu - 10.7.2007, 23:55 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |