Ку всем!
Продолжаю работу над сайтом.
Раскукожил дистрибутив punBB, ибо вспомнил там прикольную фичу - централизованный задатчик URL'ов.
Пример:
Файл forum_urls.php
Дофига кода
Код:<?php
/**
* Regular URL scheme.
*
* @copyright (C) 2008-2012 PunBB, partially based on code (C) 2008-2009 FluxBB.org
* @license http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
* @package PunBB
*/
// Make sure no one attempts to run this script "directly"
if (!defined('FORUM'))
exit;
// These are the regular, "non-SEF" URLs (you probably don't want to edit these)
$forum_url = array(
'change_email' => 'profile.php?action=change_email&id=$1',
'change_email_key'=> 'profile.php?action=change_email&id=$1&key=$2',
'change_password'=> 'profile.php?action=change_pass&id=$1',
'change_password_key' => 'profile.php?action=change_pass&id=$1&key=$2',
'delete_user' => 'profile.php?action=delete_user&id=$1',
'delete'=> 'delete.php?id=$1',
'delete_avatar' => 'profile.php?action=delete_avatar&id=$1&csrf_token=$2',
'edit' => 'edit.php?id=$1',
'email' => 'misc.php?email=$1',
'forum' => 'viewforum.php?id=$1',
'forum_rss'=> 'extern.php?action=feed&fid=$1&type=rss',
'forum_atom' => 'extern.php?action=feed&fid=$1&type=atom',
'forum_subscribe'=> 'misc.php?forum_subscribe=$1&csrf_token=$2',
'forum_unsubscribe'=> 'misc.php?forum_unsubscribe=$1&csrf_token=$2',
'help' => 'help.php?section=$1',
'index' => 'index.php',
'index_rss'=> 'extern.php?action=feed&type=rss',
'index_atom' => 'extern.php?action=feed&type=atom',
'login' => 'login.php',
'logout'=> 'login.php?action=out&id=$1&csrf_token=$2',
'mark_read'=> 'misc.php?action=markread&csrf_token=$1',
'mark_forum_read'=> 'misc.php?action=markforumread&fid=$1&csrf_token=$2',
'new_topic'=> 'post.php?fid=$1',
'new_reply'=> 'post.php?tid=$1',
'opensearch' => 'misc.php?action=opensearch',
'post' => 'viewtopic.php?pid=$1#p$1',
'profile_about' => 'profile.php?section=about&id=$1',
'profile_identity'=> 'profile.php?section=identity&id=$1',
'profile_settings'=> 'profile.php?section=settings&id=$1',
'profile_avatar'=> 'profile.php?section=avatar&id=$1',
'profile_signature'=> 'profile.php?section=signature&id=$1',
'profile_admin' => 'profile.php?section=admin&id=$1',
'quote' => 'post.php?tid=$1&qid=$2',
'register'=> 'register.php',
'report'=> 'misc.php?report=$1',
'request_password'=> 'login.php?action=forget',
'rules' => 'misc.php?action=rules',
'search'=> 'search.php',
'search_advanced'=> 'search.php?advanced=1',
'search_resultft'=> 'search.php?action=search&keywords=$1&author=$3&forum=$2&search_in=$4&sort_by=$5&sort_dir=$6&show_as=$7',
'search_results'=> 'search.php?search_id=$1',
'search_new' => 'search.php?action=show_new',
'search_new_results' => 'search.php?action=show_new&forum=$1',
'search_recent' => 'search.php?action=show_recent',
'search_recent_results' => 'search.php?action=show_recent&value=$1',
'search_unanswered'=> 'search.php?action=show_unanswered',
'search_subscriptions' => 'search.php?action=show_subscriptions&user_id=$1',
'search_forum_subscriptions' => 'search.php?action=show_forum_subscriptions&user_id=$1',
'search_user_posts'=> 'search.php?action=show_user_posts&user_id=$1',
'search_user_topics' => 'search.php?action=show_user_topics&user_id=$1',
'subscribe'=> 'misc.php?subscribe=$1&csrf_token=$2',
'topic' => 'viewtopic.php?id=$1',
'topic_rss'=> 'extern.php?action=feed&tid=$1&type=rss',
'topic_atom' => 'extern.php?action=feed&tid=$1&type=atom',
'topic_new_posts'=> 'viewtopic.php?id=$1&action=new',
'topic_last_post'=> 'viewtopic.php?id=$1&action=last',
'unsubscribe' => 'misc.php?unsubscribe=$1&csrf_token=$2',
'user' => 'profile.php?id=$1',
'users' => 'userlist.php',
'users_browse' => 'userlist.php?show_group=$1&sort_by=$2&sort_dir=$3&username=$4',
'page' => '&p=$1',
'moderate_forum'=> 'moderate.php?fid=$1',
'get_host'=> 'moderate.php?get_host=$1',
'move' => 'moderate.php?fid=$1&move_topics=$2',
'open' => 'moderate.php?fid=$1&open=$2&csrf_token=$3',
'close' => 'moderate.php?fid=$1&close=$2&csrf_token=$3',
'stick' => 'moderate.php?fid=$1&stick=$2&csrf_token=$3',
'unstick'=> 'moderate.php?fid=$1&unstick=$2&csrf_token=$3',
'moderate_topic'=> 'moderate.php?fid=$1&tid=$2',
'admin_index' => 'admin/index.php',
'admin_bans' => 'admin/bans.php?sort_by=1',
'admin_categories'=> 'admin/categories.php',
'admin_censoring'=> 'admin/censoring.php',
'admin_extensions_manage'=> 'admin/extensions.php?section=manage',
'admin_extensions_hotfixes'=> 'admin/extensions.php?section=hotfixes',
'admin_forums' => 'admin/forums.php',
'admin_forums_forum' => 'admin/forums.php#forum$1',
'admin_groups' => 'admin/groups.php',
'admin_loader' => 'admin/loader.php',
'admin_reindex' => 'admin/reindex.php',
'admin_settings_setup' => 'admin/settings.php?section=setup',
'admin_settings_features'=> 'admin/settings.php?section=features',
'admin_settings_content'=> 'admin/settings.php?section=content',
'admin_settings_email' => 'admin/settings.php?section=email',
'admin_settings_announcements' => 'admin/settings.php?section=announcements',
'admin_settings_registration' => 'admin/settings.php?section=registration',
'admin_settings_communications' => 'admin/settings.php?section=communications',
'admin_settings_maintenance' => 'admin/settings.php?section=maintenance',
'admin_prune' => 'admin/prune.php',
'admin_ranks' => 'admin/ranks.php',
'admin_reports' => 'admin/reports.php',
'admin_users' => 'admin/users.php'
);
?>
Таким мухтаром, помимо дефайнов, можно задать много чего централизованно - чего я и добиваюсь.
Я задолбался в каждом файле указывать или объявлять ссылки на всякое, типа переменных и файлов шаблонного движка.
Хочу вкукожить.
ЗЫ В моём случае это будет что-то типа этого:
Снова дофига кода
Код:<?php
/**
* Regular URL scheme.
*
* @copyright (C) 2008-2012 PunBB, partially based on code (C) 2008-2009 FluxBB.org
* @license http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
* @package PunBB
*/
// Make sure no one attempts to run this script "directly"
if (!defined('FORUM'))
exit;
// These are the regular, "non-SEF" URLs (you probably don't want to edit these)
$forum_url = array(
'change_email' => 'profile' . $phpEx . '&action=change_email&id=$1',
'change_email_key'=> 'profile' . $phpEx . '&action=change_email&id=$1&key=$2',
'change_password'=> 'profile' . $phpEx . '&action=change_pass&id=$1',
'change_password_key' => 'profile' . $phpEx . '&action=change_pass&id=$1&key=$2',
'delete_user' => 'profile' . $phpEx . '&action=delete_user&id=$1',
'delete'=> 'delete' . $phpEx . '&id=$1',
'delete_avatar' => 'profile' . $phpEx . '&action=delete_avatar&id=$1&csrf_token=$2',
'edit' => 'edit' . $phpEx . '&id=$1',
'email' => 'misc' . $phpEx . '&email=$1',
'forum' => 'viewforum' . $phpEx . '&id=$1',
'forum_rss'=> 'extern' . $phpEx . '&action=feed&fid=$1&type=rss',
'forum_atom' => 'extern' . $phpEx . '&action=feed&fid=$1&type=atom',
'forum_subscribe'=> 'misc' . $phpEx . '&forum_subscribe=$1&csrf_token=$2',
'forum_unsubscribe'=> 'misc' . $phpEx . '&forum_unsubscribe=$1&csrf_token=$2',
'help' => 'help' . $phpEx . '&section=$1',
'index' => 'index' . $phpEx,
'index_rss'=> 'extern' . $phpEx . '&action=feed&type=rss',
'index_atom' => 'extern' . $phpEx . '&action=feed&type=atom',
'login' => 'login' . $phpEx,
'logout'=> 'login' . $phpEx . '&action=out&id=$1&csrf_token=$2',
'mark_read'=> 'misc' . $phpEx . '&action=markread&csrf_token=$1',
'mark_forum_read'=> 'misc' . $phpEx . '&action=markforumread&fid=$1&csrf_token=$2',
'new_topic'=> 'post' . $phpEx . '&fid=$1',
'new_reply'=> 'post' . $phpEx . '&tid=$1',
'opensearch' => 'misc' . $phpEx . '&action=opensearch',
'post' => 'viewtopic' . $phpEx . '&pid=$1#p$1',
'profile_about' => 'profile' . $phpEx . '&section=about&id=$1',
'profile_identity'=> 'profile' . $phpEx . '&section=identity&id=$1',
'profile_settings'=> 'profile' . $phpEx . '&section=settings&id=$1',
'profile_avatar'=> 'profile' . $phpEx . '&section=avatar&id=$1',
'profile_signature'=> 'profile' . $phpEx . '&section=signature&id=$1',
'profile_admin' => 'profile' . $phpEx . '&section=admin&id=$1',
'quote' => 'post' . $phpEx . '&tid=$1&qid=$2',
'register'=> 'register' . $phpEx,
'report'=> 'misc' . $phpEx . '&report=$1',
'request_password'=> 'login' . $phpEx . '&action=forget',
'rules' => 'misc' . $phpEx . '&action=rules',
'search'=> 'search' . $phpEx,
'search_advanced'=> 'search' . $phpEx . '&advanced=1',
'search_resultft'=> 'search' . $phpEx . '&action=search&keywords=$1&author=$3&forum=$2&search_in=$4&sort_by=$5&sort_dir=$6&show_as=$7',
'search_results'=> 'search' . $phpEx . '&search_id=$1',
'search_new' => 'search' . $phpEx . '&action=show_new',
'search_new_results' => 'search' . $phpEx . '&action=show_new&forum=$1',
'search_recent' => 'search' . $phpEx . '&action=show_recent',
'search_recent_results' => 'search' . $phpEx . '&action=show_recent&value=$1',
'search_unanswered'=> 'search' . $phpEx . '&action=show_unanswered',
'search_subscriptions' => 'search' . $phpEx . '&action=show_subscriptions&user_id=$1',
'search_forum_subscriptions' => 'search' . $phpEx . '&action=show_forum_subscriptions&user_id=$1',
'search_user_posts'=> 'search' . $phpEx . '&action=show_user_posts&user_id=$1',
'search_user_topics' => 'search' . $phpEx . '&action=show_user_topics&user_id=$1',
'subscribe'=> 'misc' . $phpEx . '&subscribe=$1&csrf_token=$2',
'topic' => 'viewtopic' . $phpEx . '&id=$1',
'topic_rss'=> 'extern' . $phpEx . '&action=feed&tid=$1&type=rss',
'topic_atom' => 'extern' . $phpEx . '&action=feed&tid=$1&type=atom',
'topic_new_posts'=> 'viewtopic' . $phpEx . '&id=$1&action=new',
'topic_last_post'=> 'viewtopic' . $phpEx . '&id=$1&action=last',
'unsubscribe' => 'misc' . $phpEx . '&unsubscribe=$1&csrf_token=$2',
'user' => 'profile' . $phpEx . '&id=$1',
'users' => 'userlist' . $phpEx,
'users_browse' => 'userlist' . $phpEx . '&show_group=$1&sort_by=$2&sort_dir=$3&username=$4',
'page' => '&p=$1',
'moderate_forum'=> 'moderate' . $phpEx . '&fid=$1',
'get_host'=> 'moderate' . $phpEx . '&get_host=$1',
'move' => 'moderate' . $phpEx . '&fid=$1&move_topics=$2',
'open' => 'moderate' . $phpEx . '&fid=$1&open=$2&csrf_token=$3',
'close' => 'moderate' . $phpEx . '&fid=$1&close=$2&csrf_token=$3',
'stick' => 'moderate' . $phpEx . '&fid=$1&stick=$2&csrf_token=$3',
'unstick'=> 'moderate' . $phpEx . '&fid=$1&unstick=$2&csrf_token=$3',
'moderate_topic'=> 'moderate' . $phpEx . '&fid=$1&tid=$2',
'admin_index' => 'admin/index' . $phpEx,
'admin_bans' => 'admin/bans' . $phpEx . '&sort_by=1',
'admin_categories'=> 'admin/categories' . $phpEx,
'admin_censoring'=> 'admin/censoring' . $phpEx,
'admin_extensions_manage'=> 'admin/extensions' . $phpEx . '&section=manage',
'admin_extensions_hotfixes'=> 'admin/extensions' . $phpEx . '&section=hotfixes',
'admin_forums' => 'admin/forums' . $phpEx,
'admin_forums_forum' => 'admin/forums.php#forum$1',
'admin_groups' => 'admin/groups' . $phpEx,
'admin_loader' => 'admin/loader' . $phpEx,
'admin_reindex' => 'admin/reindex' . $phpEx,
'admin_settings_setup' => 'admin/settings' . $phpEx . '&section=setup',
'admin_settings_features'=> 'admin/settings' . $phpEx . '&section=features',
'admin_settings_content'=> 'admin/settings' . $phpEx . '&section=content',
'admin_settings_email' => 'admin/settings' . $phpEx . '&section=email',
'admin_settings_announcements' => 'admin/settings' . $phpEx . '&section=announcements',
'admin_settings_registration' => 'admin/settings' . $phpEx . '&section=registration',
'admin_settings_communications' => 'admin/settings' . $phpEx . '&section=communications',
'admin_settings_maintenance' => 'admin/settings' . $phpEx . '&section=maintenance',
'admin_prune' => 'admin/prune' . $phpEx,
'admin_ranks' => 'admin/ranks' . $phpEx,
'admin_reports' => 'admin/reports' . $phpEx,
'admin_users' => 'admin/users' . $phpEx
);
?>
Почему так?
А это чтобы, во-первых, больше формализовать код, а во-вторых, чтобы была возможность обойти внешние вызовы программ типа XRumer, с помощью которых спамеры регаются на сайтах и форумах. Также недохацкеры будут отдыхать.
Делается эта защита так:
1) Формализуем обращения к php-файлам через ссылку на ОДИН файл, и тот с расширением .inc. В этом файле делаем финт ушами:
Это позволит в одном месте изменить $phpEx например, на .code - и это будет расширением для всех php-файлов сайта.
И да, сами файлы надо переименовать, а в .htaccess задать, что индекс надо искать, например, в файле index.code:
2) ВСЕ ссылки на ВСЕ файлы сайта внутри кода, заменяем на конструкции типа
Обратите внимание: доступ к отдельным каталогам или файлам - строго через абсолютный путь от корня сервера. Так код работает, и к тому же в командной строке браузера уже бесполезно задавать внешние линки на обработку кода. Через это, например, работали эксплойты для phpBB до второй версии phpBB, и это фиксилось перелопачиванием кода, покуда в одной из версий не было уже изначально.
Наиболее показательны здесь такие моменты:
2.1) Все пути через переменную $site_root - от корня сервера
2.2) Расширения заданы через $phpEx - в одном месте указано расширение
2.3) Дефайном IN_ENGINE указано, что обращаться к файлу можно только если указано, что обращение легально. Вызвать файл напрямую невозможно. Ещё по путям указывается, что при этом такое обращение должно быть либо строго по $_GET либо строго по $_POST, но этим я уже обычно не морочусь.
3) Ещё очень полезно перенести ВСЕ файлы сайта кроме индекса, в каталог типа ./includes/ или, как у меня, ./details/includes/ и задать пути к ним показанного выше формата
что даст хоть какую-то защиту от вызова этих файлов с помощью неких колдунских финтов, буде таковые ещё есть.
Такая вот загогулина.
Простые меры - но помогают отсеивать любопытных и дофига спамящих. Да, не всех - но многих.
Я правда ещё не освоил защиту от DDOS - но это в планах.