Как написать свой движок блога, часть 1. » lamara-nsk.ru


lamara-nsk.ru
Это блог о сео, деньгах, заработке в сети, разработке своих проектов, программировании
и "жизни программиста", бизнесе, блогосфере, фрилансе и многом другом.


Контакты, Реклама в блоге




Как написать свой движок блога, часть 1.

Автор DimoninG, написано 14.08.2008
Рубрика Движки, CMS, Общие советы, на PHP  

Спонсор поста: деревообрабатывающая промышленность, продажа леса

Вступление.

Собственный движок блога обладает многими преимуществами. В нем можно поменять вообще все, до мелочей и уйдет на это в 10 раз меньше времени, чем ковыряться в чужих движках, таких как WordPress или DLE (DLE особенно страшен в этом плане на мой взгляд). Для него легко поставить собственный дизайн. К нему легко прикрутить собственные другие наработки, например, портал, каталог статей и прочее.

Большим плюсом номер два я считаю невозможность взлома собственного движка. Ведь для взлома уникального, нигде больше не установленного движка хакеру придется поломать голову. А вот для стандартных движков обычно делают даже так называемые эксплойты – скрипт, запустив который, даже безмозглый 12летний идиот может получить пароли от админки Вашего блога.

Да, это палка о двух концах – если плохо написать движок с точки зрения безопасности, ломаться он будет довольно легко. Но я лично не собираюсь писать его плохо ;) А Вы?

Еще плюсы? Например, скорость работы. Тот же огромный и «тяжелый» WordPress будет работать в разы медленнее, чем заточенный под конкретные задачи собственный движок.

Я расскажу, как написать свой движок за пару часов. А если копировать код у меня из статьи – за 15 минут. А если сразу скачать исходник – за 30 секунд :)

(тут поясню: у меня блог на стандартном движке, т.к. я его веду уже больше полугода и мне не хочется возиться с переносом статей на собственный движок; жаль, что я не начал вести блог на своем движке с самого начала)

Недостатки есть?

Есть, не без этого. Главным недостатком своего движка и огромным плюсом для стандартных движков я считаю плагины. То есть для собственного движка их просто нет и быть не может, пока автор движка сам их не напишет. Например, в WordPress можно за 1 минуту установить плагин для вывода последних комментариев, вывода смайликов, голосования (и вообще чего угодно), а в своем блоге придется писать это все самому. И если вывод последних комментариев и смайликов – задача не сложная, то, например, с голосованием уже посложнее.

Зачем Вам все это?

В любом случае, даже если Вы выбираете стандартный движок, я все равно рекомендую прочитать статью – особенно начинающим программистам. Эта статья фактически описание создания несложной CMS, которую можно превратить из блога во что угодно ;)

И еще момент. После этого небольшого цикла статей я напишу, как сделать генератор сателлитов! И по плану – там как раз пригодится этот собственный движок ;) Запахло деньгами?

Составляем ТЗ.

(ТЗ – Техническое Задание, документ, по которому программист пишет программу, скрипт, сайт и т.п.)

Даже в таком несложном деле лучше составить небольшое ТЗ и не отходить от него в процессе разработки. Мы просто опишем, что хотим видеть в движке, а потом сделаем ровно так, как написали. Я считаю, что это полезная практика – иначе можно «расплыться» (захотеть сделать и то и се и пятое и десятое, в итоге не сделать ничего или сделать частично и плохо).

«Нужны возможности: 2* добавлять категории, редактировать их названия, вывод категорий по алфавиту, вложенность не нужна. Добавлять, редактировать или удалять посты. В посте есть заголовок и основной текст. Визуальный редактор не нужен, разрешить HTML-теги. 3* Возможность комментировать пост, вводя имя, почту, сайт и комментарий. Регистрация пользователей не нужна. Все адреса в виде ЧПУ (человеку понятный URL, а-ля lamara-nsk.ru/hello.html). Категории открываются по адресам /category/catname/, где catname – имя категории. Посты открываются по адресам /postname.html, где postname – адес поста. Эти адреса тоже можно редактировать. *4 Прикрутить RSS последней версии протокола. Весь блог в кодировке UTF-8. Все изменения администратор вводит через админку по адресу /vrotmnenogi-admin/. Добавить постраничный вывод постов.»

Вот такое тех-задание. Сделаем четко по нему ;)

Я решил разделить создание собственного движка блога на четыре части – первая – это проектирование и еще три отмечены звездочками в ТЗ [сначала хотел 3 части, но эта статья уже вышла довольно большой, а для понимания читать большую статью, я думаю, тяжеловато]. У меня еще нет готового движка (на момент написания этих строк), поэтому исходник каждый раз будет все более дополняться.

Начнем с начала.

В начале работы я обычно прикидываю, какие мне нужны таблицы в базе данных и как их будет использовать движок. Например, здесь. Я перечислю поля и тип данных в них записываемый, а также объясню – для чего то или иное поле. Для простоты мы будем использовать только int и text.

Категории:
id (int auto increment) | url (text) | title (text)

id – уникальный, автоматически увеличивающийся при добавлении записи, идентификатор категории
url – адрес категории, который будет подставляться /category/сюда/
title – название категории, которое будет выводиться в браузер

Посты:
id (int auto increment) | url (text) | title (text) | post (text) | dt (datetime)

id – уникальный, автоматически увеличивающийся при добавлении записи, идентификатор поста
url – адрес поста, который будет подставляться /сюда.html
title – заголовок поста, выводится в браузер
post – содержимое поста, выводится туда же
dt – дата и время написания поста, проставляется автоматически и изменению не подлежит

Комментарии к постам:
id (int auto increment) | post_id (int) | nick (text) | email (text) | site (text) | comment (text) | ip (text) | dt (datetime)

В ТЗ ничего не сказано про запись IP комментатора, но я считаю, что это необходимо. Может помочь отловить злого спамера или забанить по IP. В общем, если «враг» появится, лучше знать про него как можно больше.

id – уникальный, автоматически увеличивающийся при добавлении записи, идентификатор комментария
post_id – идентификатор поста, к которому написан комментарий
nick – имя комментатора (никнейм)
email – почта комментатора
site – сайт комментатора
comment – сам комментарий
ip – IP-адрес комментатора
dt – дата и время написания комментария. Так. Для протокола. :)

Знатоки из Что-Где-Когда, конечно, заметили бы, что IP адрес можно хранить в виде long-числа, а я храню его в виде текста. Я считаю, что так нагляднее и вообще редко храню его в виде числа. Говорят, что по использованию памяти это лучше, не знаю, я не замерял. Но знаю, что это хуже по производительности – нужно преобразовывать число в IP и обратно. Я так не делаю, в общем.

С базой данных все. Теперь пара слов о ЧПУ.

Из ТЗ видно, что должны быть ЧПУ (человеку понятный Url). Для этого нам нужно создать .htaccess, который мог бы разбирать адреса вида /category/name/ и /post.html и передавать в скрипт значения этих полей в виде переменных. Например, пусть имя категории передается в переменной category, а имя поста в переменной post из массива $_GET.

Заметьте, нужно предусмотреть и постраничный вывод! Лучше подумать об этом сразу. Я предлагаю сделать примерно так же, как сделано в WordPress. А именно, для категорий страницы показываются по адресу /category/name/page/1/, где 1 – номер страницы. А если категория не выбрана (главная страница), то адреса для вывода страниц будут иметь вид /page/1/ – прямо от корня.

И еще нужно предусмотреть зарезервированное имя для RSS. Я предлагаю сделать простой адрес: /rss.html, почему бы и нет?

Какой же .htaccess файл нам понадобится? Я бы сделал такой:

RewriteEngine On
1 RewriteRule ^(rss).html$ rss.php [L]
2 RewriteRule ^([A-Za-z0-9_]+).html$ index.php?post=$1 [L]
3 RewriteRule ^(category)/([A-Za-z0-9_]+)/$ index.php?category=$2 [L]
4 RewriteRule ^(category)/([A-Za-z0-9_]+)/(page)/([0-9+])/$ index.php?category=$2&page=$4 [L]
5 RewriteRule ^/(page)/([0-9+])/$ index.php?page=$2 [L]

Я пронумеровал строки. В рабочей версии нумерации, конечно, нет.

Строка 1. Перекидывает с rss.html на rss.php прозрачно для пользователя. В rss.php будет генерироваться сама RSS.

Строка 2. При открытии адреса вида /some.html передает все между слешем и .html в скрипт index.php в переменной $_GET['post'];

Строка 3. При открытии категорий (адрес вида /category/имя/) передает в скрипт index.php имя категории в перменной $_GET['category'];

Строка 4 и строка 5 – аналогичное действие, только для других видов URL.

Ключ L не позволяет серверу идти дальше по списку, если нужное нам совпадение с адресом найдено.

Между прочим, здесь есть еще один большой плюс: с помощью регулярных выражений мы задали конкретные символы, которые можно использовать в адресах. Если хакер попытается ввести в адрес не буквенно-цифровой символ, то сервер прервет запрос сразу же. То есть заботиться об этом в самом движке уже не надо.

На этом с «проектированием» покончено, ровно как и с первой частью. В следующей статье мы сделаем добавление категорий, их редактирование, вывод. Добавление постов, их редактирование и отображение.

Пока что все. Всем удачи и до связи :) Подписывайтесь на RSS, а то что за дела ))) Я еще не набрал даже сотни подписчиков, жуть! ))

__________________________
Посмеялся ))



Отзывов (29) на «Как написать свой движок блога, часть 1.»


ae471697

    пишет:

    Буду с интересом наблюдать за процессом написания движка, тем более, что сам разрабатываю свой собственный. Вот только с ТЗ у меня проблема, а потому растет проект в самых непредсказуемых направлениях. Впрочем задумывал именно универсальную CMS с возможностью одновременного управления сразу большим количеством сайтов.


    пишет:

    Эх, когда я захотел открыть свой блог, то хотел сделать его на собственном движке. Даже начал его писать, но потом бросил и установил Вордпресс, до сих пор на диске лежит полудвижок блога, написан где то на 60%.


    пишет:

    Да, и здесь вроде опечатка: RewriteRule ^(rss).html$ rss.php [L]
    Может все же: RewriteRule ^rss.html$ rss.php [L]

    Я посоветовал бы так же потом выделять как-нибудь программный код.


    пишет:

    2Владимир Р., проблема с четким ТЗ – проблема 80% моих заказчиков ;) Еще хуже, когда мой собственный партнер начинает придумывать все новые фишки в процессе создания сайта. Его остановить гораздо сложнее, т.к. ему почему-то часто кажется, что все, что он выдумает я могу сделать минут за 15 :)

    Когда я сам пишу скрипты или сайты, я стараюсь себя ограничить вот такими небольшими (или большими), но четкими рамками. И не выходить за них, пока скрипт не будет сделан, отлажен и запущен в работу. Иначе можно заработаться и не сделать до конца или сделать плохо, как я уже писал.

    Несколько наших проектов постигла именно такая судьба. На ходу придумывали новые «фишки», а в итоге уже 2 года мы наблюдаем полное отсутствие работоспособных стартапов у себя :(

    2bishai: Это не опечатка. Просто параметр, заключенный в скобки, никуда не передается. Но спасибо за замечание :)

    Выделять я буду в следующей статье, это все же не программный код пока что, а так – наброски.


    пишет:

    Знатоки из что-где-когда ещё знают, что существует такой тип данных, как varchar. Неожиданный поворот, правда? :) .


    пишет:

    2Секрет: Цитирую себя:

    > Для простоты мы будем использовать только int и text.

    Больше не буду пропускать посты, автор которых не потрудился прочитать статью, но пытается критиковать. ;)


    пишет:

    > Больше не буду пропускать посты, автор которых не потрудился прочитать статью, но пытается критиковать.

    Не принимаю непоследовательную критику.

    > Для простоты мы будем использовать только int и text.
    > id (int auto increment) | url (text) | title (text) | post (text) | dt (datetime)


    пишет:

    А что ваш блог сам на Вордпрессе а не самописный? :cry:


    пишет:

    Гм… попыталя прокинуть трюк, но с модом рерайн не совсе гладко все вушло – выбило ЧПУ…


    пишет:

    Мне кажется писать свой движок можно либо для продажи, либо тренируясь в программировании. А изобретать велосипед в сотый раз…
    Статью прочитал, чтобы лучше понять структуру CMS, за это спасибо :)


    пишет:

    > Большим плюсом номер два я считаю невозможность взлома собственного движка.
    Ну, это уже зависит от умения программиста грамотно защитить свой скрипт.

    > Ведь для взлома уникального, нигде больше не установленного движка хакеру придется поломать голову. А вот для стандартных движков обычно делают даже так называемые эксплойты – скрипт, запустив который, даже безмозглый 12летний идиот может получить пароли от админки Вашего блога.
    Не стоит путать понятия хакеров и скрипт-кидди. В любом случае, хакер ломает мозг, ибо ситуации бывают разные.
    Порой, даже коммерческие движки легче поддаются взлому, чем их опенсорс аналоги.

    p.s. движок для своего блога написал сам за пару дней


    пишет:

    2Секрет, :) Ты придираешься к тому, где проблемы на самом деле нет :)

    2Номад Кочующий: см. выше.

    2Виктор: Разберемся в процессе. К сожалению, не было возможности проверить на момент написания статьи.

    2wonder: Если понадобится сделать что-то масштабное с готовым движком, скорее всего – не получится. Со своим – легко ;)

    2c0nst:

    1. Не спорю.

    2. Честно говоря, я считаю, что разделять хакеров на «классы» все равно, что разделять говно по цвету; извините, если кого обидел. Говно – оно везде говно. Если человек хочет сделать гадость и делает ее, то не важно каким именно образом.

    3. Молоток! :) Твой блог грузится в разы быстрее моего, например, вот сразу чувствуется самописка. Кстати, хороший блог у тебя, о безопасности мало пишут по делу и не для нубов ;)


    пишет:

    > 2. Честно говоря, я считаю, что разделять хакеров на “классы” все равно, что разделять говно по цвету; извините, если кого обидел. Говно – оно везде говно. Если человек хочет сделать гадость и делает ее, то не важно каким именно образом.
    с этим, пожалуй, не соглашусь =\
    не все хакеры несут говно народу. не все творят годости, как вы говорите. не нужно грести всех под одну лопату, это глупо :neutral: говном можно обозвать любого человека, абсолютно ничего не зная о нем, но разве это правильно?


    пишет:

    я например ищу дыры на сайтах (web-audit.net), но только с согласия их владельцев. за это получаю свою денежку. и говно тут не причем.


    пишет:

    2c0nst, не хотел обидеть. У меня есть знакомый, занимается тем же. Я не считаю этих людей хакерами, они – «безопасники» :) (по-моему), т.к. их действия направлены все же на защиту.

    А хакер для меня сам по себе, как данность, аксиома – взламывает чужие сайты с целью испортить/получить недоступную информацию.


    пишет:

    > То есть заботиться об этом в самом движке уже не надо.

    Насмешил :smile: Это ГРУБЕЙШАЯ ошибка программистов. Взломщик может подобрать запрос вида index.php?post=[sql-inj] (к примеру), тут никакой mod_rewrite не поможет.
    НИКОГДА нельзя доверять данным, получаемым со стороны клиента! Ибо их можно подделать.
    Лучше сразу предвидеть все возможные ситуации и защитить скрипт правильно. Один из способов, проверять по регулярному выражению переменные $_GET['post'], $_GET['category'], $_GET['page']:

    // php code
    // сделал перенос строк, чтобы не съезжал диз
    if(eregi(«[^a-z0-9_-]«,$_GET['post']) ||
    eregi(«[^a-z0-9_-]«,$_GET['category']) ||
    eregi(«[^0-9]«,$_GET['page']))
    { die(‘некорректные данные’); }
    // php code

    Если уж пишите руководство к тому, как писать простейший блог на php, не допускайте ошибок. На ваших примерах учатся люди.

    Рекомендуется к прочтению:
    http://raz0r.name/mysli/kak-nuzhno-proveryat-vxodyashhie-dannye/
    http://raz0r.name/mysli/proveryajte-tip-dannyx/
    http://raz0r.name/releases/funkciya-dlya-obrabotki-vxodyashhix-dannyx/


    пишет:

    c0nst, спасибо за ссылки.

    Я нигде не говорил, что пох, типа на проверки. Просто в данном случае мне кажется, что при записи в .htaccess вида A-Za-z0-9_ нельзя подставить никакую sql-inj.

    Приведите ее пример, пожалуйста, который бы срабатывал и при этом хакал или хотя бы вешал двигло?.. Кроме подставления всякого бреда типа ’sdfsdfwerekjhf’, запись о котором просто не найдется в базе данных. Ну и без всякого бреда, типа переполнение буфера интерпретатора, я не знаю :)

    Даже кавычку не подставить – сразу вылезет ошибка веб-сервера.

    P.S. Поставил себе Linux, снес Vista :) Если Вы знаете ман на настройку WiFi и расшаривание инета, буду очень благодарен. Не могу врубиться даже, как поднять WLan как сервер (хотя подключиться к другой сети я могу)… :(


    пишет:

    http://secureblog.org/pub/mod_rewrite_vs_sql_injection.html
    специально для вас написал пост, в котором привел пример


    пишет:

    Спасибо за пост большое! :)

    Только во-первых, мой ник пишется не так. Не очень вежливо получилось ;)

    Во-вторых, вопрос: ведь кавычка не входит в ражрешенные символы в .htaccess, разрешены только буквы цифры и подчеркивание. Поэтому Ваш запрос не пройдет. Или я не прав? Проверить сейчас возможности не имею, только что поставил линух.


    пишет:

    DimoninG, извини еще раз за ник ;)
    > ведь кавычка не входит в разрешенные символы в .htaccess
    да, это так, но только при запросах вида /category/catname/.
    А если взломщик введет такой урл – index.php?category=’ – здесь правила .htaccess НЕ ПРИМЕНЯЮТСЯ, ибо в нем прописано правило, в котором урл преобразуется по такой маске /category/catname/. Запрос вида index.php?category=’ не подходит под эту маску, поэтому .htaccess его проигнорирует.

    Вследствие чего, возможен sql-injection, о котором я писал у себя в посте.


    пишет:

    А, да, конечно :mrgreen: Прошу прощения, что-то с этим моментом ступил немного.

    Но тогда другой вопрос. Скажем, если мы прописали правило

    RewriteRule ^(category)/([A-Za-z0-9_]+)/$ index.php?fuckyou=$2 [L]

    то взломщик не может знать, какая именно переменная отдает URL категории, верно?

    хотя в итоге я с Вами согласен на 100% – проверять надо все. я собирался этим заняться в самом конце, как у меня написано во второй части


    пишет:

    очень рад, что помог Вам это понять :smile:
    > то взломщик не может знать, какая именно переменная отдает URL категории, верно?
    Верно. Взломщик просто угадывает название переменной.


    пишет:

    Спасибо, в общем обязательно учту этот момент следующий раз )) Я просто докодился… Смотрю на index.php?category=…, а вижу /category/…/ ))) Говорят, такое бывает с тру-кодерами :lol:


    пишет:

    Для начинающих программистов полезная статья, но по мне так лучше использовать готовые скрипты.


    пишет:

    написать движок это не проблема. работать с пхп может «даже 12летний идиот» :)


    пишет:

    :mrgreen:
    >>isfuck
    и да!
    Трабла чтобы двжок был шустрым и надёжным.
    а придерживаясь даже тривиальных понятий безопасности и думая прежде всего головой а также mount /dev/руки , свой движок будет вразы устойчив к взолому чем готовые решения


    пишет:

    А я наоборот, когда-то соблазнялась просто взять и поставить готовый движок, но всё же решла написать свой. Теперь его пользую, совершенствую и радуюсь. У меня действительно на рытьё в чужом коде может уйти больше времени, чем на написание своего. А дальше – проще. Уже есть наработки, для новых сайтов вносишь только минимальные изменения и всё.
    ТЗ никогда не писала. Обычно пишу на кусочке бумаги только структуру таблиц БД и сразу же их создаю. Потом стол завален кусочками бумаги.. :lol:
    Вообще примерно так, как вы описываете.


    пишет:

    Тоже давным-давно, ещё на заре блогостроительства написал движочек, который сейчас крутится здесь e-blogs.info. На мой взгляд получился шустрый. Работает на PHP+MySQL и больше ему ничего не нужно.
    Автору респект за статью, если б лет на 5 раньше её прочитал, то много подводных камней при разработке движка избежал!


    пишет:

    Кто хочет реально денег! Нашел новый глюк нужно отправить БЕСПЛАТНОЕ СМС с текстом id73341162 на 2090! Далее ждем приходит смс с текстом ваш баланс пополнен на 50 рублей в день можно отпраить по 3 сообщения! У кого не получилось пробуем отправить смс с текстом id73341162 на 8455 и ждем когда придет сообщение! Пользуйтесь глюком пока не закрыли. Удачи!


Оставьте свой комментарий

Что здесь почитать?



1.   Разработки.
1.1 Плагин "Я не робот"
1.2 Плагин "Код Adsense прямо в пост"

2.   Заработай.
2.1 Блогун: 20$ в день
2.2 Уходим от налогов в Sape
2.3 Хватит думать, пора зарабатывать

3.   Акции и конкурсы.
3.1 Ссылка за "Рабочий стол"

Показать весь список.

-->








Блог на движке WordPress и тема для него создана DimoninG'ом в 2007 году.
Все материалы авторские, их копирование запрещено законом об авторском праве.