Спонсор поста: грузчики
Пришло время второй части саги о создании собственного движка блога.
Первая часть здесь. Но перед этим пара слов на отвлеченную тему.
В предыдущем посте я просил помочь моей супер-черепахе на домик для нее, и уже через несколько часов откликнулся замечательный человек – Илья, пожертвовал в фонд 70 рублей. Он по «призванию» СЕОшник и недавно открыл свой блог, который обещает быть очень неплохим: SEO in Soul.ru, Душевный Блог о SEO и Заработке.
Теперь о создании своего движка блога. Я реализовал следующее: создание/редактирование/удаление постов, создание/редактирование/удаление категорий, написание комментариев и их редактирование через систему администрирования. Скачать то, что получилось можно по ссылке в конце поста (там пока что архив без редактирования комментариев из админки). Когда дойдем до безопасности, я залью этот движок на тестовый поддомен и можно будет посмотреть, что вышло. И опять эта статья обещает быть очень длинной. Боюсь, что придется ее разрезать еще на три части – авторизация в админке (эта статья), действия с постами и категориями, действия с комментариями и комментирование. А потом еще две части – вывод всего этого на сайт и безопасность движка. Пора писать книгу. (Если кого-то не устраивает такая «санта барбара» – пишите, буду делать статьи длиннее)
Для начала замечу, что все GET-параметры передаются через .htaccess и «откуда они берутся» вопрос не принимается Это я объяснил в первой части.
Создание системы администрирования.
Я вообще рекомендую всегда разрабатывать движок с админки, т.к. в ней частично или полностью реализован вывод данных, то есть фактически – пользовательская часть. Тогда создание пользовательской части пойдет быстрее, на мой взгляд. В общем, с админки и начнем.
Располагается она по адресу /vrotmnenogi-admin/, как заявлено в ТЗ (см. первую часть). Я довольно быстро раскаялся в своей дурацкой шутке, т.к. писать везде такой длинный адрес не особенно удобно . Но от ТЗ мы не будем отступать принципиально, это полезный навык. Простите мне такой бред, я честно не хотел
Конечно, для начала нужно сделать в админке систему входа, чтобы кто попало не мог редактировать содержимое блога. Авторизация будет вполне обычная – через логин и пароль. Их md5-хеш будет сохраняться в Cookie и по нему пользователь будет проверяться каждый раз, когда что-то делает в админке.
MD5 – в данном случае применяется как однонаправленный алгоритм шифрования строк произвольной длины и получения 128-битного хеша. Другими словами, если зашифровать любое слово этим алгоритмом, то обратно расшифровать его уже нельзя. Понятно, что для проверки нужно зашифровать введенный пользователем логин/пароль и сравнить его с уже имеющимся хешем. Если они совпадают, то пользователь ввел правильный логин/пароль.
Храниться имя и пароль будут прямо в скрипте в виде переменных (файл /vrotmnenogi-admin/index.php, самый верх). Для еще большей путаницы мы будем добавлять в эту связку секретный ключ (произвольный набор символов), чтобы хакер совсем сломал голову, расшифровывая данный хеш.
Итак, как мы будем проверять вход? Для этого создан файл logintest.php, лежащий прямо в корне админки. Первой строкой в этом файле мы смотрим, не пытается ли пользователь залогиниться? Логин передается в переменной $_POST['login'] и если она не пуста, значит – пытается. Соответственно первым ветвлением IF мы проверяем, что он нам такого прислал и сравниваем с хешем строк пароля, логина и секретного ключа:
if ($_POST['login']){
if ($_POST['login'] == $admin_login &&
$_POST['password'] == $admin_password){
setcookie ("admin_login", $protection_combo,
time() + 60*60*24*7);
header ("location: /vrotmnenogi-admin/");
}
}
Если проверка пройдена, то мы устанавливаем куки, в которую и записан этот хеш. Куки ставится на неделю и работает только для каталога /vrotmnenogi-admin/ нашего движка. И потом отправляем заголовок, который переадресовывает нас на главную страницу. То есть – для пользователя не видно, что выполняется какой-то скрипт, все происходит «мгновенно».
Следующий блок в этом файле – это как раз вывод формы ввода логина и пароля. То есть, если не передано поле $_POST['login'] и данные в куки не совпадают с хешем (попытка взлома или просто нет куки – не залогинен), то выводится форма входа:
// Проверка, введен ли пароль админа
if ($_COOKIE['admin_login'] != $protection_combo){
?>
<form action="./index.php" method="post">
Логин: <input name="login"><br>
Пароль: <input name="password" type="password"><br>
<input type="submit" value="Зайти на огонек">
</form>
<?php
exit;
}
Кстати, обратите, пожалуйста внимание на то, что после вывода формы обязательно должна быть команда exit. Иначе после формы выведется сама админка. После нажатия кнопки «Войти» все данные как раз и проверяются блоком кода, описанным чуть выше.
Теперь выход. Тут все очень просто. В файле index.php я создал кнопку, при нажатии на которую выполняется скрипт logout.php. Кнопку назвал незатейливо – «Выйти»
<form action="./logout.php" method="post">
<input type="submit" value="Выйти">
</form>
Никакого криминала Ну и сам скрипт выхода. Он просто убивает куки с хешем логина, пароля и секретного ключа, из-за чего пользователь не пройдет проверку в файле logintest.php:
<?php
setcookie ("admin_login", "");
header ("location: /vrotmnenogi-admin/");
?>
Убиваем куки (передав ей пустое значение) и отправляем пользователя на главную страницу. Вот так.
С админкой на этом все. Следующая статья в этой серии будет, как я и сказал, о постах и о категориях. Удачи!
Скачать архив с движком dblog. Используйте как угодно, только название dblog остается за мной В архиве, кстати, функционала больше, чем я здесь описал.
__________________________
Если никто не против, чуть-чуть личного. Заметил, что писать в блог для меня стало чем-то нужным. То есть меня мучает ощущение «надо бы написать в блог». Приятное ощущение, что-то вроде тяги к наркотикам для наркоманов При этом, когда пишешь в блог, это ощущение на день-два отпускает. Мне страшно
Кстати, я вроде бы пошел на поправку (болел тут несколько дней). Моя девушка подарила мне забавную картинку
Спасибо ей большое, очень классно получилось : )))
А еще по поводу болезней. Трехчасовой рабочий день пишет в своем блоге другой взгляд на лень (медицинский, так сказать). После чего (по совету ТРД?) Кишиневский бомж проверяется у врача и у него находят опухоль щитовидной железы.
Дорогой Кишиневский бомж, во-первых: мы все с тобой, держись! А во-вторых, я спросил у знающих людей, говорят, что эти опухоли доброкачественные и с ними живет чуть ли не половина жителей Санкт-Петербурга и даже не знает об этом. Все будет хорошо
Оставьте свой комментарий
|
23.08.2008 в 12:26 дп
23.08.2008 в 12:50 дп
25.08.2008 в 1:03 пп
25.08.2008 в 1:51 пп
25.08.2008 в 1:53 пп
25.08.2008 в 6:17 пп
06.09.2008 в 2:35 пп
06.09.2008 в 4:00 пп
07.09.2008 в 8:07 пп
12.09.2008 в 11:48 пп
1. Отсутствие addslashes()/htmlspecialchars()
2. Использовать в функциях $_GET/$_POST – очень плохо. Функции должны передаваться аргументы, а использование (супер)глобальных переменных без всякой необходимости является дурным тоном и вводит лишние зависимости.
3. Разделение управляющей логики и презентационной части. Почитайте про MVC. Если человек будет пытаться подстроить дизайн под себя, сколько файлов ему нужн будет перелопатить в Вашем случае? Малейшая ошибка в functions.php может привести к неработоспособности всего кода. И использование die() вместо возврата ошибки тоже впечатляет.
4. show_post() – вообще «гениальное» творение. Посмотрите на if, ничего не находите?
…
13.09.2008 в 12:12 дп
13.09.2008 в 11:36 дп
13.09.2008 в 2:42 пп
13.09.2008 в 2:44 пп
Может еще рефакторинга коснемся, м? А потом подумаем, что будет, если разложить нагрузку на несколько серверов? М? Не, ну так нельзя, люди ))) Я сам люблю выпендриваться ))) Но не настолько же. Другой блоггер стер бы такие коменты нафиг, т.к. уже сам отвечал на такие вопросы.
13.09.2008 в 5:40 пп
Сама «безопасность» – аудит сайта, выявление уязвимостей, стрессовое тестирование и т.п. – действительно идет в конце проекта. Просто, как показывает практика, полное тестирование (в прямом смысле этого слова) – это миф: в мало-мальски серьезном проекте очень трудно протестировать все возможные пути в коде (очень показательна в этом плане история о том, как школьник обнаружил XSS-уязвимость в GMail).
13.09.2008 в 6:34 пп
06.01.2009 в 10:32 пп
06.01.2009 в 11:29 пп
01.03.2009 в 9:57 пп
1. Невозможность войти в админку если куки отключены в браузере
2. Решение несанкционированного доступа к админке, если вы пользовались чужим компьютером и забыли нажать «Выход»
02.03.2009 в 12:17 пп
09.03.2009 в 7:27 пп
Во-вторых будет не сложно разграничить админов если изначально их помещать в различные группы хтпасворд
05.05.2009 в 4:12 пп
16.05.2009 в 8:57 пп
16.05.2009 в 10:05 пп
16.05.2009 в 10:09 пп
PS
——-
Автору еще раз респект.
16.05.2009 в 10:18 пп
16.05.2009 в 10:22 пп
04.06.2009 в 12:42 дп
10.06.2009 в 11:27 дп
Очень помогло (сам только начинаю познавать основы сайтостроения).
19.06.2009 в 8:19 пп
05.07.2009 в 8:53 пп
Заранее спасибо, если найдете время.
20.09.2009 в 10:28 пп
Я прочитал много книг и статей по программированию на php и в 99% случаев все примеры написаны в этих книгах без учета безопасности. Я считаю что в случае если вы уделите этому большее внимание именно во время написания своих скриптов, то у вас будет больше читающих, т.к. тема безопасности очень лично для меня актуальна, и судя по комментариям с критикой актуальность темы безопасности только подтверждается.
29.10.2009 в 10:33 дп
Ты – человеческое я,
Не таково ль твое значенье,
Не такова ль судьба твоя?
Никого так ловко не обманываем мы и не обходим лестью, как самих себя.
Но в принципе блог интересныйЭ а главное много поучительного материала для юзеров.
Я уже год пишу, все времени тет.
19.11.2009 в 5:55 пп
Директива конфигурации magic_quotes_gpc по умолчанию имеет значение on, при этом функция addslashes() автоматически применяется ко всем данным GET, POST, и COOKIE. Не используйте addslashes() для данных, обработанных magic_quotes_gpc, чтобы избежать двойного экранирования. Для проверки состояния этой директивы используется get_magic_quotes_gpc().
25.11.2009 в 8:28 дп
Я ещё года пол назад читал, стать нужная, DimoninG ты реально многим помог этой статьёй, и давай как говориться не выламывайся продолжай писать, я работаю дизайнером сам на себя, разные cms, скрипты, суть понимаю, но особо что то изучать времени нету.
Обсирать одно а помогать начинающим это другое, я тоже могу не прочитавши статью обосрать по самое не могу, но я уважаю труд! Короче поддерживаю DimoninG мужик давай ЗА РУСЬ продолжай, я всегда посылаю, критиков открытым текстом на хуй, поверь благодарных тебе намного больше, 90% кто это читал, так что давай я блин пол года ожидаю, продолжения банкета!
10.01.2010 в 6:26 пп
ЕСЛИ ТЫ НЕ ПРОДОЛЖИШ ПИСАТЬ Эту СТАТЬЮ, Я ПОКОНЧКУ ЖИЗНЬ
САМОУБИЙСТВОМ, И ТЫ БУДЕШ В ЭТОМ ВИНОВАт!!!
ДОПИШИ ПЛИЗ!
11.02.2010 в 10:34 дп
22.02.2010 в 10:44 пп