Ошибка при восстановлении сайта с бекапа Akeeba — Database server error reply: ErrNo #1273

При установке сайта, через установщик от Akeeba Backup (ANGIE) появляется ошибка при импорте данных в БД — Database server error reply: ErrNo #1273, при этому данные для коннекта к БД указаны верные.

Решение следующее:
Перед импортом БД нужно поставить чекбоксы Force UTF-8 collation on database и Force UTF-8 collation on tables и убрать (если установлен) чекбокс Allow UTF8MB4 auto-detection.

Ошибка: 1054 Unknown column ‘a.client_id’ in ‘where clause’

При обновлении сайта с Joomla 2.5 до Joomla 3.x.x часто возникает ошибка:
1054 Unknown column ‘a.client_id’ in ‘where clause’


Решение достаточно простое, хоть и не очевидное.

Текст ошибки говорит о том, что в запрашиваемой таблицы БД нет столбца client_id который должен быть согласно sql-запросу. Мы знаем, что сначала идет обращение к таблицам, которые формируют меню в админке. В Joomla 3.x.x. столбец client_id имеется в таблице #__menu_types. Подключаемся к БД через phpMyAdmin и проверяем нашу таблицу _menu_types — видим что действительно нет такого столбца. Добавляем столбец client_id со значением 0 и ошибка в админке уходит.

Не отображаются пункты расширений в Компонентах после обновления Joomla

При обновлении Joomla 2.5 до Joomla 3.x.x часто случается ситуация, когда не отображаются пункты меню в пункте «Компоненты», или отображаются, но частично (как правило 2-3 пункта). Решение следующее:


 В БД вашего сайта нужно выполнить запрос:

UPDATE #__menu SET menutype = 'main' WHERE menutype = 'menu'

Ошибка состоит в том, что в таблице _menu у проблемных пунктов поле menutype имеет значение «menu» вместо «main«, вышеуказанным запросом мы устраняем эту ошибку.

Ошибка в карте сайта mapX (Xmap) — Undefined index: ru-RU in /components/com_xmap/helpers/xmap.php

При создании карты сайта с помощью компонента mapX (v3.0 rev 302) при просмотре xml-карты сайта появляется ошибка такого плана:
Ошибка синтаксического анализа XML: лишние данные после элемента документа
Адрес: /index.php?option=com_xmap&view=xml&id=1
Строка 2, символ 1:<b>Notice</b>:  Undefined index: ru-RU in <b>/components/com_xmap/helpers/xmap.php</b> on line <b>48</b><br />
^

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


Если в двух словах — то компоненту не хватает языка контента. Даже если у Вас сайт на одном языке (не мультиязычный), и отключен системный плагин «Фильтр языка» (обязательный плагин для мультиязычных  сайтов), то все равно нужно через Менеджер языков — Языки контента добавить новый язык — русский.

Автоматическая авторизация после регистрации в Joomla

Если на Вашем сайте есть регистрация пользователей, то очень часто встает вопрос — как авторизировать пользователя сразу после его регистрации. Безусловно, данный момент существенно повысит лояльность пользователей, поскольку стандартная регистрация не позволяется автоматически залогинится пользователю — как правило, сначала требуется подтверждение аккаунта через email, затем перейти обратно на сайт и ввести логин и пароль.

Почему бы не избавится от лишней рутины? Идеальная регистрация выглядит так: пользователь нажимает кнопку «Зарегистрироваться» — вводит минимальный набор данных для регистрации (имя, логин, пароль, email) и после окончания процедуры регистрации пользователь сразу же получает доступ к функционалу, который доступен только авторизированным клиентам.

Как это реализовать?
Стандартными средствами Joomla, к сожалению, никак.
Для автоматической авторизации после регистрации нужно установить дополнительный плагин, к примеру — wbs_autologin от webemus. Ссылка на скачивание плагина указана в конце материала.

Инструкция по установке и настройке плагина wbs_autologin.

  1. Через Менеджер расширений устанавливаем плагин wbs_autologin.zip
  2. Проходим в Менеджер плагинов, находим плагин Webemus — Autologin и включаем его.
  3. Затем открываем Пользователи — Менеджер пользователей — Настройки и ставим значение «Нет» для параметра «Активация нового пользователя» («New User Account Activation»).

Стоит отметить что плагин работает на Joomla 2.5 и Joomla 3.x.


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

  1. Открываем файл /components/com_users/controllers/registration.php
  2. Находим часть кода:
    } elseif ($return === ‘useractivate’) { $this->setMessage(JText::_(‘COM_USERS_REGISTRATION_COMPLETE_ACTIVATE’)); $this->setRedirect(JRoute::_(‘index.php?option=com_users&view=registration&layout=complete’, false)); } else { // //Put code here // и после него, вернее в место Put code here вставляем:
    $app = JFactory::getApplication(); $credentials = array(); $credentials[‘username’] = $data[‘username’]; $credentials[‘password’] = $data[‘password1’]; $app->login($credentials);

Еще раз напомню, что данный вариант неприемлемый, поскольку в данном случае он боится обновление CMS.

Удаляем надпись Материалы в контенте Joomla

Если на материал нет пункта меню но есть ссылка из другого материала, например, то выводится заголовок «Материалы» над контентом, что не всегда в тему.

Удалить надпись «Материалы» можно несколькими способами:

  1. Править код ядра — com_content
  2. Отредактировать языковый файл
  3. Воспользоваться стандартным функционалом Joomla 3 — Переопределение констант в Менеджере языков.

Первые два способа плохи тем, что правки будут утеряны после очередного обновления Joomla. Именно по этому эти варианты использовать не рекомендую, но, для полноты картины, опишу их.

Итак, вариант 1 — правим код ядра сайта.

  1. Открываем файл \components\com_content\views\article\tmpl\default.php
  2. Ищем строку 27 (примерно, это для Joomla 3.4.0 — для других номер строки может отличатся):
     <?php if ($this->params->get(‘show_page_heading’, 1)) : ?>
  1. Меняем значение (‘show_page_heading’, 1) на (‘show_page_heading’, 0)


Вариант 2. Правим языковый файл сайта.

  1. Открываем файл \language\ru-RU\ru-RU.ini
  2. Ищем строку 145 (примерно, это для Joomla 3.4.0 — для других номер строки может отличатся):
    JGLOBAL_ARTICLES=»Материалы»
  1. Удаляем определения константы. Должно получится таким образом JGLOBAL_ARTICLES=»»

Правильный, 3 вариант.

  1. Пройдите в «Расширения» — «Менеджер языков» — «Переопределение констант».
  2. Затем в фильтре (левая колонка, внизу) выберите Russian — Сайт.
  3. Затем — «Создать» (в верхней панели, зеленая кнопка).
  4. Справа будет форма поиска — ищите по тексту «Материалы», в строке «Искать..» выбираете «Значение».
  5. Вы получите результат поиска в виде списка:

6. Выберите из списка строку — JGLOBAL_ARTICLES — Материалы.
7. Затем в верхней левой части страницы меняете текст языковой константы на пустой (удаляете значение «Материалы»):


8. Сохраняете и выходите из компонента com_languages.

Платежные системы в Joomla!: Paypal и Webmoney

Вы хотели внедрить в компонент, использующий платежную систему Paypal еще и Webmoney? Эта статья поможет вам!

В данной статье мы рассмотрим простейшую систему внедрения платежей на сайт, аналоги которой есть как у Paypal, так и у Webmoney.

ВЗАИМОДЕЙСТВИЕ САЙТ——>СЕРВИС

Как это работает?

В нужное место компонента, где нужно чтобы человек совершил оплату вставляется html форма, при использовании которой человека перебрасывает на страницу оплаты сервиса Paypal или Webmany. В через html форму с помощью переменных компонента вставляются платежные данные. Это: сумма платежа, описание платежа, номер счета, внутренний номер покупки и еще некоторые. Эта информация передается на страницу оплаты сервиса. Покупатель попадая на эту страницу выбирает способ оплаты и получает возможность оплатить то что он выбрал на сайте (а информация об этом была передана через форму).

После оплаты владельцу счета куда была произведена оплата приходит email с отчетом( также например в Webmoney в комментариях к счету можно использовать переменные- то есть в комментарии можно указать номер счета, сумма которую должны были заплатить или еще какие-либо данные из переменных компонента) .

Внимание! Данная система является полуавтоматической! То есть есть взаимодействие:

сайт——> сервис (передача информации о платеже который будет совершен)

Но нет обратного взаимодействия:

сервис——> сайт (передача информации о платеже который был совершен)

Эта схема является наиболее безопасной! (в случае с передачей информации о совершенном платеже скрипту возможна подмена информации, взлом итп).

Взаимодействию сервис——> сайт посвящена вторая часть нашей статьи.

Рассматриваемые сервисы:

Web Merchant Interface — интерфейс позволяющий быстро и с минимальными затратами дополнить свой веб-сайт или домашнюю страничку всем необходимым для того, чтобы начать принимать WM за предоставляемые вами товары или услуги.

PayPal Shopping Cart — use basic HTML to accept credit card, bank account, and PayPal payments with the Buy Now Buttons, Donations, Subscriptions, PayPal Shopping Cart, Cart Upload

Работа с системой заключается в оперировании с html формами. Основными, на которых можно понять логику системы и наиболее распространеными являются:

Webmoney: Форма запроса платежа

Генерируется веб-сайтом продавца для формирования запроса на проведение платежа в сервисе Web Merchant Interface и передачи его через веб-браузер покупателя.

Пример кода формы:

 
<form method="POST" action="https://merchant.webmoney.ru/lmi/payment.asp"> 
<input type="hidden" name="LMI_PAYMENT_AMOUNT" value="12.08">
<input type="hidden" name="LMI_PAYMENT_DESC" value="платеж по счету"> 
<input type="hidden" name="LMI_PAYMENT_NO" value="1234">
<input type="hidden" name="LMI_PAYEE_PURSE" value="Z145179295679"> 
<input type="hidden" name="LMI_SIM_MODE" value="0">
<input type="hidden" name="FIELD_1" value="VALUE_1"> 
<input type="hidden" name="FIELD_2" value="VALUE_2"> 
...
<input type="hidden" name="FIELD_N" value="VALUE_N"> 
...
</form>

Paypal: PayPal Shopping Cart

PayPal offers a hosted shopping cart that supports adding multiple items to a purchase before checkout.

When a customer clicks the button, the item is added to their shopping cart. They are given the option to return to your website to continue shopping or to proceed to checkout where they will pay with their PayPal account. Create an Add to Cart button for each item on your website.

Important: To protect against malicious users tampering with the button code and submitting an incorrect charge, see Securing Your Website Payment Standard Buttons. Merchants with significant payment volume are required by the PayPal user agreement to take precautions on securing Website Payment Standard Buttons.

You can modify the following code to create your Add to Cart button.

Пример кода формы: 

 
<form target="paypal"
action="https://www.paypal.com/cgi-bin/webscr"
method="post">
<input type="image" src="https://www.sandbox.paypal.com/
en_US/i/btn/x-click-but22.gif" 
border="0" name="submit" alt="Make payments with PayPal - 
it's fast, free and secure!">
<img alt="" border="0"
src="https://www.paypal.com/en_US/i/scr/pixel.gif
width="1" height="1">
<input type="hidden" name="add" value="1">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="business"
value="  <a href="mailto:электронная почта">электорнная почта</a> "> 
<input type="hidden" name="item_name" value="Store Item 1"> 
<input type="hidden" name="amount" value="50.00"> 
<input type="hidden" name="no_shipping" value="2"> 
<input type="hidden" name="no_note" value="1"> 
<input type="hidden" name="currency_code" value="USD"> 
<input type="hidden" name="tax" value="0"> 
<input type="hidden" name="bn" value="IC_Sample"> 
</form> 

Сравнение делается из следующих соображений. Во множестве компонентов используется оплата через Paypal.

Основные отправляемые данные форм в Paypal и Webmoney по типу одни и те же (то есть если вы добавляете один из видов оплаты, можно взять уже используемые переменные компонента из существующего способа оплаты).

Paypal Webmoney Описание поля
business LMI_PAYEE_PURSE Номер счета на который поступят деньги. В paypal это email, в webmoney цифровой номер с префиксом в начале, указывающим валюту: Z, R, E.
item_name LMI_PAYMENT_DESC Текстовое описание услуги или товара. В paypal это название товара, в webmoney его описание.
item_number LMI_PAYMENT_NO Внутренний номер покупки продавца
amount LMI_PAYMENT_AMOUNT Сумма платежа

Примеры (Исключительно формы оплаты, без объявления переменных, использованных в них):

Форма оплаты в SOBI :

Paypal  

 
<form action="<?php echo $config->payPalUrl;?>" method="post">
<input name="cmd" value="_xclick" type="hidden">
<input name="business" value="<?php echo $config->payPalMail;?>" type="hidden">
<input name="item_name" value="<?php echo $title;?>" type="hidden">
<input name="item_number" value="<?php echo $this->sobi2Id;?>" type="hidden">
<input name="no_shipping" value="1" type="hidden">
<input name="return" value="<?php echo $config->payPalReturnUrl ;?>"
type="hidden">
<input name="no_note" value="1" type="hidden">
<input name="currency_code" value="<?php echo $config->payPalCurrency;?>" type="hidden">
<input name="tax" value="0" type="hidden">
<input name="bn" value="<?php echo $title;?>" type="hidden">
<input name="charset" value="<?php echo $charset;?>" type="hidden">
<input name="amount" value="<?php echo $this->total;?>" type="hidden">
<input src="<?php echo $config->liveSite;?>/components/com_sobi2/images/paypal.jpg"
name="submit" alt="<?php echo _SOBI2_PAY_WITH_PAYPAL;?>" border="0" type="image">
</form>
 

Webmoney 

 
<form id=pay name=pay method="POST" action="https://merchant.webmoney.ru/lmi/payment.asp">
<table width="99%" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="100%" align="center">
<input name="LMI_PAYMENT_AMOUNT" type="text" size="3" value="<?php echo $this->total;?>">
<input type="hidden" name="LMI_PAYMENT_DESC" value="Оплата платных полей каталога,
номер заказа <?php echo $this->sobi2Id;?>">
<input type="hidden" name="LMI_PAYMENT_NO" value="="<?php echo $this->sobi2Id;?>"">
<input type="hidden" name="LMI_SIM_MODE" value="0">
<input type="hidden" name="LMI_SUCCESS_URL" 
value="http://estate-real.spb.ru/index.php?option=com_sobi2&amp;Itemid=28">
<input type="hidden" name="LMI_SUCCESS_METHOD" value="2">
<input type="hidden" name="LMI_FAIL_URL" 
value="http://estate-real.spb.ru/index.php?option=com_sobi2&amp;Itemid=28">
<input type="hidden" name="LMI_FAIL_METHOD" value="2">
<select name="LMI_PAYEE_PURSE" style="min-width:30px;">
<option value="R265873850459">WMR</option>
</select>
</td>
</tr>
<tr>
<td width="100%" align="center">
<br>
<input type="submit" class="button" value="Оплатить">
</td>
</tr>
</table>
</form> 
 

Форма оплаты в EZ reality

Paypal 

 
<form action="https://<?php echo "$domain";?>/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick" />
<input type="hidden" name="bn" value="Raptor Services EZ Realty" />
<input type="hidden" name="business" value="<?php echo $paypal_email;?>" />
<input type="hidden" name="item_name" value="<?php echo stripslashes( $premium_name );?>" />
<input type="hidden" name="item_number" value="<?php echo $row->id;?>" />
<input type="hidden" name="amount" value="<?php echo $premium_cost;?>" />
<input type="hidden" name="no_shipping" value="1" />
<input type="hidden" name="return" value="<?php echo $mosConfig_live_site; ?>
/index.php?option=com_ezrealty&amp;Itemid=<?php echo $Itemid;?>&amp;task=success" />
<input type="hidden" name="cancel_return" value="<?php echo $mosConfig_live_site; ?>
/index.php?option=com_ezrealty&amp;Itemid=<?php echo $Itemid;?>&amp;task=cancel" />
<input type="hidden" name="no_note" value="1" />
<input type="hidden" name="notify_url" value="<?php echo $mosConfig_live_site; ?>
/components/com_ezrealty/upgrade2.ezrealty.ipn.php" />
<input type="hidden" name="currency_code" value="<?php echo $currency;?>" />
<input type="image" src="components/com_ezrealty/images/<?php echo $button_image;?>" 
name="submit" alt="Make payments with PayPal - it's fast, free and secure!" />
<input type="hidden" name="on0" value="Listing Owner" />
<input type="hidden" name="os0" value="<?php echo $my->id;?>" />
</form>

Форма оплаты в Adeptus donate module

Webmoney 

 <form id=pay name=pay method="POST" action="https://merchant.webmoney.ru/lmi/payment.asp"><table width="99%" align="center" cellpadding="0" cellspacing="0" border="0"><tr><td width="100%" align="center"><?phpif ($showlogo == 1) echo '<img src="'.$logo.'" alt="'.$wltxt.'" title="'.$wltxt.'" /><br/>';if ($wltxt != '' && $wltxt != NULL)    echo $wltxt;?></td></tr><tr><td width="100%" align="center"><input name="LMI_PAYMENT_AMOUNT" type="text" size="3" value="<?php echo $summ;?>"><input type="hidden" name="LMI_PAYMENT_DESC" value="<?php echo $descpay;?>"><input type="hidden" name="LMI_PAYMENT_NO" value="1"><input type="hidden" name="LMI_SIM_MODE" value="0"><input type="hidden" name="LMI_SUCCESS_URL" value="<?php echo $successurl;?>"><input type="hidden" name="LMI_SUCCESS_METHOD" value="2"><input type="hidden" name="LMI_FAIL_URL" value="<?php echo $errorurl;?>"><input type="hidden" name="LMI_FAIL_METHOD" value="2"><select name="LMI_PAYEE_PURSE" style="min-width:30px;"><option value="<?php echo $wmnum1;?>"><?php echo $wmtype1;?></option><option value="<?php echo $wmnum2;?>"><?php echo $wmtype2;?></option><option value="<?php echo $wmnum3;?>"><?php echo $wmtype3;?></option></select></td></tr><tr><td width="100%" align="center"><br><input type="submit" class="button" value="<?php echo $btntxt;?>"></td></tr></table></form>

Варианты для кнопки Оплатить:

В Paypal чаще всего можно увидетьв качестве кнопки оплаты баннер, при нажатии на который вы попадаете на страницу оплаты Paypal: 

 <input type="image" src="https://www.sandbox.paypal.com/en_US/i/btn/x-click-but22.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!"><img alt="" border="0"src="https://www.paypal.com/en_US/i/scr/pixel.gifwidth="1" height="1"><input type="image" src="components/com_ezrealty/images/<?php echo $button_image;?>" name="submit" alt="Make payments with PayPal - it's fast, free and secure!" /> 

Тоже самое можно сделать для Webmoney, используя логотипы фирменного стиля : 

 
<input type="image" src="http://www.webmoney.ru/img/banner/8831_2.gif" name="submit" 
alt="Оплатить через Webmoney" />

Или выпадающую форму оплаты с возможностью оплаты по нескольким счетам, как у Adeptusa (adeptsite.info) 

 
<select name="LMI_PAYEE_PURSE" style="min-width:30px;">
<option value="Номер счета">Название выпадающего списка</option>
<option value="Номер счета">Название выпадающего списка</option>
<option value="Номер счета">Название выпадающего списка</option>
</select>
</td>
</tr>
<tr>
<td width="100%" align="center">
<br>
<input type="submit" class="button" value="Оплатить">
</td>
</tr>
 

ВЗАИМОДЕЙСТВИЕ СЕРВИС——>САЙТ

Первая схема не обеспечивает полную автоматизацию. Сайт (скрипт) продавца не получает автоматически информацию о полученном платеже. При большом количестве обращений работать становится весьма затруднительно.

Webmoney: ФОРМЫ HTML для передачи информации на сайт

Для передачи информации между веб-сайтом продавца и сервисом Web Merchant Interface используютcя пять основных HTML-формы. Первую мы уже рассмотрели, она посылает информацию на сервис. Остальные четыре- это взаимодействие:

сервис—->сайт

  • Форма предварительного запроса — генерируется сервисом Web Merchant Interface для передачи параметров предварительного запроса на выполнение платежа на веб-сайт продавца, если установлен флаг Передавать параметры в предварительном запросе. Если флаг не установлен — не используется (запрос выполняется без параметров). Запрос передается без использования веб-браузера покупателя.
  • Форма оповещения о платеже — генерируется сервисом Web Merchant Interface для передачи оповещения о платеже на веб-сайт продавца. Оповещение передается без использования веб-браузера покупателя.
  • Форма выполненного платежа — генерируется сервисом Web Merchant Interface в случае успешного выполнения платежа и передается на веб-сайт продавца через веб-браузер покупателя.
  • Форма невыполненного платежа — генерируется сервисом Web Merchant Interface в случае невыполнения платежа и передается на веб-сайт продавца через веб-браузер покупателя.

Paypal: Instant Payment Notification

IPN/PDT Variable Reference

This page is the complete list of possible variables that can be included in the Instant Payment Notification (IPN) or Payment Data Transfer (PDT) post that PayPal sends to your server.

Unless otherwise indicated in the table column labeled Possible Values, the value of a variable is always specific to the transaction whose information is being posted.

In the Sandbox environment, Instant Payment Notification includes the additional variable test_ipn with a value of 1 (one). The purpose of test_ipn is to provide testing programs a means to differentiate between Sandbox IPN and live IPN.

The value of the notify_version variable is the version number of Instant Payment Notification that makes the post. The value notify_version is a means for PayPal to track versions of IPN. There is no need for your programs to store this value or query it.

The value of verify_sign is an encrypted string used to validate the authenticity of the transaction.

Информация о формах

Ярким примером использования данных форм как в Paypal, так и Webmoney является компонент интернет-магазина VirtueMart. В сборке RE можно посмотреть модуль Webmoney.

В данный момент я не имею достаточно информации об организации оплаты таким образом.

Сравнительная характеристика трех CMS: Drupal, Joomla! и WordPress

В качестве «ответчика» за Drupal выступает Дмитрий Сергеев, Joomla – я и WordPress – Максим. Системы расположены в алфавитном порядке, так что не ищите подвоха. 🙂

Версии / безопасность

Drupal
Сейчас к выходу готовится 6-я версия, код которой уже достаточно давно заморожен. Текущая 5-я версия по сравнению с 4.7 выглядит хорошим эволюционным этапом.

Новые версии подолгу тестируются. Ядро стабильное. Баги в востребованных модулях обычно фиксятся оперативно. Сейчас целый ряд крупных корпоративных сайтов компаний с мировыми именами работает на Drupal, поэтому у разработчиков к безопасности серьезное отношение.

Joomla
Ситуация на данный момент такова – все поклонники Joomla находятся в ожидании версии 1.5. А ветка 1.0.х претерпевает лишь косметические изменения, в основном улучшающие безопасность. Так что с наличием новых версий у Joomla «полный порядок». Безопасность тоже на уровне, версию 1.0.13 можно смело считать очень-очень стабильной и безопасной.

Что же касается безопасности сторонних расширений, то тут все не так гладко, что вообще-то повторяет ситуацию в целом в языке PHP, как популярном среди новичков и людей не знающих ничего о том, как ломаются сайты. 90% софта глючны, а платные программисты готовы работать за еду. Действительно сильных расширений мало, но они есть, например OpenSEF или MosetsTREE.

WordPress
Хотя официально и заявлено, что версии WordPress будут выходить по графику, на самом деле этого не происходит. Если обнаруживается какая-либо серьезная «дыра», то разработчики опреративно выпускают обновление, поэтому график версий сбивается. Существуют две линейки WordPress: 2.0.* и 2.1+. Первая (текущая 2.0.12) все еще поддерживается и к ней выпускаются обновления безопасности. Но новые возможности появляются только в линейке 2.1+ (текущая 2.2.2). Разделение произошло после того, как было решено отказаться от поддержки MySQL<4.0. За счет оптимизации запросов, скорость работы новых версий выше. Также сыграло свою роль и то, что в WordPress’е активно стал использоваться AJAX, которому требуется UTF-8. Все это привело к определенным проблемам совместимости, но, на мой взгял, оно того стоило.

Пример сайта на Drupal

Русская документация

Drupal
Несмотря на то, что русское сообщество занимается переводом документации на Drupal, белых пятен еще много. Ситуация отчасти компенсируется самописными статьями и руководствами. Документация на модули по большей части не переведена. На мой взгляд, сейчас заниматься разработкой сайтов на Drupal без знания английского языка трудно – любой шаг в сторону от стандартных схем может стать проблемой.

Joomla
Русскоязычной документации достаточно, я бы сказал – много. Причем она не ограничивается переводом официальной помощи, а уже приходит к стадии написания авторских статей.

WordPress
WordPress обладает очень большой документацией (к.н. Codex/Кодекс), но к сожалению она только на английском языке. Хотя, справедливости ради стоит отметить, что составлена она грамотно и практически не требует особого знания языка. Документация построена таким образом, что позволяет довольно быстро найти нужный ответ. Практически каждая статья имеет несколько примеров, а также ссылки на смежные вопросы.Пример сайта на Joomla!

Русское комьюнити / поддержка

Drupal
Русское сообщество развивается, причем достаточно бурно, поскольку в последнее время о Drupal много говорят в рунете. Есть люди разбирающиеся в архитектуре. Что важно, они отвечают на форуме. В целом сообщество открытое и дружелюбное, но злоупотреблять этим не стоит.

Joomla
Если коротко, то существует две различных «тусовки», ведущие свои форумы и сайты поддержки. Попытка объединения была, но так ничего и не получилось. В принципе, наличие двух сборок и русификаций на данный момент всех устраивает (читай «все не плохо устроились»). Ближе к версии 1.5 вопрос будет подниматься все чаще, ибо порталовцы более официальная команда перевода, нежели joom.ru. С другой стороны наличие конкуренции нисколько не вредит сообществу, а наоборот даже подталкивает команды работать все лучше и лучше.

WordPress
У русского WordPress’а есть два официальных сайта. Поддержка пользователей осуществляется через форумы добровольцамими. Так, что скорее всего проблем с русской поддержкой не будет. Также существует много блогов, где их авторы выкладывают и делятся самыми разными находками и решениями по WordPress.Настройка ссылок в админ-панели WordPress

Борьба со спамом

Drupal
Akismet – раз, графическая или математическая каптча на выбор – два, анализатор поведения клиентов с отсеиванием ботов – три. Еще можно задавать ограничение на количество ссылок в одном сообщении, контролировать флуд, банить ip и вести «черный список» рекламируемых сайтов, а также фильтровать сообщения по подстроке.

Joomla
Борьба со спамом в интернете на данный момент ведется только в одном месте – комментарии к публикациям. Компонентов комментариев достаточно много, и о таковых, без поддержки captcha я не слышал (разве что очень древние и не используемые на данный момент). На этом собственно борьба со спамом заканчивается. Вкусности вроде SpamKarma насколько я знаю, в сторонних компонентах не реализованы.

WordPress
Стандартно в WordPress входит плагин Akismet, который достаточно эффективно борется с этим злом. Кроме этого можно создать черный список и фильтры из слов. С их помощью можно просто заблокировать любой комментарий, который содержит запрещенное слово или отправить его на модерацию. Наибольшую же эффективность в борьбе со спамом можно добиться с помощью т.н. капчи – картинки с набором символов. В этом случае ставится полный заслон от автоматических спам-роботов. Установка большинства плагинов антиспама очень проста, зачатую достаточно только его активировать в админ-панели (например, популярная SpamKarma). С помощью специального плагина есть возможность модерировать спам-комментарии. Причем доступны как обычные комментарии, так и пинги и трекбаки. В целом же плагинов для антиспама множество (я насчитал больше семидесяти).Внешний вид админ-панели Joomla!

Интеграция с форумом

Drupal
Базовый пакет Drupal содержит достаточно функциональный форум, который подойдет для организации небольших сообществ. Для организации больших сообществ он тоже, впрочем, подойдет – на форуме drupal.org сейчас более 320 000 сообщений.

Есть модераторы, группы пользователей с разными правами доступа, извещения по email, аватары, подписи, RSS. Преимущество встроенного форума – единая база пользователей, которую используют остальные части сайта.

Насколько я знаю, есть возможность интеграции с PHPBB.

Joomla
Вместе с Joomla не поставляется компонента форума, однако на данный момент самым оптимальным вариантом создания встроенного форума является FireBoard и его русская редакция от Adeptus’а. Что же касается интеграций – они существуют. Самой распространенной является связка Joomla-SMF, под которую есть не одна интеграция, даже коммерческая.

WordPress
Для WordPress’а разработан и рекомендуется форум BBPress (есть и руссификация), который полностью интегрируется в блог. Правда, возможности у этого форум более чем скромные. На официальном сайте WordPress’а используется именно этот форум. Также существуют плагины, которые позволяют частично интегрировать некоторые популярные форумы в блог. Правда для этого требуются хорошие знания программирования, и при этом, все равно стопроцентной интеграции не получится – все-таки это разные системы.Пример настройки блоков на Drupal

Визуальный редактор

Drupal
В Drupal можно встроить TinyMCE или FCKEditor. И тот и другой гибко настраиваются. Оба являются мощными средствами. В TinyMCE, например, можно работать с таблицами, добавляя и удаляя строки и столбы и объединяя ячейки. Еще TinyMCE может «чистить» скопированные из Ворда тексты от избыточных тегов.

Joomla
Таковых под нее множество: в основном это портированные и самые распространенные редакторы. Однако самым удобным и хорошим из бесплатных является редактор JCE, разработанный специально для Joomla (а изначально еще для Mambo, тогда он назывался MosCE), способный составить очень хорошую альтернативу платному WysiwygPro.

WordPress
Стандартно в WordPress’е используется немного урезанный TinyMCE и, рядом же – простой текстовый редактор (переключение между ними «на лету»). При желании можно установить и полную версию TinyMCE, тогда будет доступно три панели кнопок со всем возможностями. Нужно отметить, что в WordPress’е есть возможность сторонним плагинам добавлять кнопки в редактор. Таким образом можно например получить функции для добавления видео, аудио и т.д. Если TinyMCE не устраивает, то можно установить вместо него другой редактор, например FCKMonkey. Но в целом, выбор редактора дело вкуса. В профиле пользователя можно вообще отключить использование визуального редактора.Расширенный визуальный редактор WordPress

Работа с картинками

Drupal
В базовом пакете вставка картинок не предусмотрена. Решить эту проблему можно несколькими путями. Есть вариант с добавлением картинке в стиле «Прикрепить файл к посту». Альтернатива – установка WYSIWYG-редактора TinyMCE и медиаменеджера IMCE сверху. Поддерживается изменение размеров картинки при загрузке и генерация тамбнейлов. Я бы не назвал работу с изображениями сильной стороной Drupal: слишком много кликов приходится делать.

Joomla
Самой сильной стороной ветки 1.0.х является mosimage, который (при помощи пары-тройки дополнительных мамботов (с)) превращается в такую конфетку, что слюнки текут. Картинки можно вставлять в редакторах, и в медиаменеджере – как никак встроенное и вполне себе удобное средство для работы с изображениями и файлами вообще.

WordPress
В WordPress’е вполне удобно можно добавлять картинки в редактор. При загрузке файла можно сразу указать его название, подпись. Автоматически будет сделана миниатюра. То есть расчет на то, чтобы с этой задачей справился неопытный пользователь. Если же воспользоваться отдельным плагином, то можно дополнительно указать размеры картинки, миниатюры и прочие параметры. После добавления картинки в редактор, можно изменить различные параметры (стили, размеры, бордюры, отступы и т.д.). Хотя это уже возможности самого визуального редактора.Настрока кнопок визуального редактора TinyMCE в Drupal

Шаблоны оформления

Drupal
Движок шаблонов – сильная сторона Drupal. Этот компонент добротно спроектирован, поэтому разобраться с интеграцией своих шаблонов сможет начинающий PHP-программист. Вообще Drupal предоставляет целый букет возможностей по управлению темами: можно даже как в ЖЖ настраивать цвета разных элементов прямо из админки. Впрочем, эти изыски на любителя.

На Drupal есть красивые сайты, однако, приличных общедоступных тем крайне мало. Если задумаете обзавестись сайтом на Drupal, приготовьтесь потратиться на шаблон.

Joomla
Joomla ветки 1.0.х не поддерживает шаблоны. Конечно, в ней есть общий и большой шаблон, позволяющий на PHP создавать вполне замысловатые структуры общей структуры сайта и расположения модулей, но вот шаблонизации отдельных элементов нет, и все ограничивается примением CSS (кстати, очень система очень гибкая, взять тот же «префикс класса модуля» и хорошо задокументирована) и ковырянием в компонентах. Однако для статей уже давно существует ContentTemplater, позволяющий создавать шаблоны оформления для статей и очень неплохо управлять их внешним видом.

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

WordPress
Для WordPress’а созданы тысячи шаблонов и многие из них выполнены на очень хорошем дизайнерском уровне. Устройство WordPress таково, что под него несложно переделать, скажем, html-шаблон. В шаблонах испольуются обычные PHP-функции, поэтому никаких сложностей с изучением т.н. языков шаблонов нет. По созданию шаблонов существует довольно много статей, даже есть он-лайн генератор. Готовые шаблоны достаточно загрузить в отдельный каталог и после этого в админ-панели выбрать понравившийся. Существует также возможность переключать шаблоны и посетителями.

Расширенная функциональность (плагины)

Drupal
Сейчас в официальном репозитории хранится под тысячу бесплатных модулей. Среди прочих есть решение для электронной коммерции, CRM-система, wiki-движок. Еще отмечу модули Views и CCK, которые дают Друпалу полное право именоваться CMF, а не CMS. CCK (Content Construction Kit), к примеру, позволяет при помощи графического интерфейса описывать объекты предметной области в базе данных и сразу же создавать формы для управления ими.

Joomla
Самой сильной стороной Joomla является, я считаю, система расширений. Мало того, что их существует несколько видов, еще есть специальная система их установки, позволяющая при помощи xml-файла описывать все действия необходимые для совершения при создании записи о расширении (например, SQL-запросы, копируемые файлы или действия выполняемые сразу после установки, которые нельзя выполнить автоматически).

В этом я думаю Joomla впереди всех трех других систем, ибо одних только видов расширений существует три штуки. Да и конкурентов у официального сайта расширений среди других систем я думаю нет (extensions.joomla.org) и быть не может. Одна только циферка (1915) наверху с количеством расширений в архиве заставляет задуматься.

WordPress
WordPress можно расширить за счет плагинов – это различные php-скрипты, которые автоматически подключаются к основному «ядру». Таким образом можно не просто добавить нужную функциональность, но и изменить уже существующую. Создать плагин не очень сложно, все зависит от уровня знания PHP. Подключение к WordPress’у совсем просто: плагин копируется в специальный каталог и активируется в админ-панели. Некоторые плагины можно настраивать, некоторые нужно прописывать в шаблоне, а некоторые работают полностью автоматически.

Плагинов для WordPress написано несколько тысяч (только на одном wp-plugins.net – 2568, но думаю, что целом цифру можно удвоить), поэтому можно найти плагин практически под любые нужды. Исключение составляют плагины, которые требуют значительной переделки шаблона. С ними обычно приходится повозиться.

Виджеты / блоки

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

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

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

Поддержка авторов (один блог) и многопользовательские блоги

Drupal
Друпал славится тем, что из него можно сделать платформу для блогов в несколько кликов. Поддерживаются как персональные, так и коллективные блоги. Одна из встроенных фишек Друпала – возможность публикации книг (некоторые блоггеры хотят хронологического порядка).

Joomla
Если встроенный компонент контента можно считать блогом, то да – блоги поддерживаются. При желании однопользовательский блог с красивым оформлением легко делается из компонента контента, ContentTemplater и компонента комментариев. С многопользовательским все сложнее. С некой натяжкой можно сказать “да”, хотя это будет довольно трудно. Все-таки Joomla это CMS общего назначения. Сторонних же хороших, качественных компонентов, поддерживающих русский язык на уровне аякса без ошибок – нет. Ну или почти нет, лично я хороших примеров внедрения не знаю.

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

Для управления авторами используется система ролей. С помощью специального плагина можно легко (визуально) отредактировать любую роль или разрешить/запретить выполнять какие-либо действия отдельному автору.

Для многопользовательских блогов существует отдельная версия: WordPress Multi User. Требования и возможности у неё практически такие же как и у обычного WordPress’а, хотя есть некоторые отличия. На WordPressMU работает один из крупнейших блог-сервисов WordPress.com, на котором зарегистрировано почти 1,3 миллиона блогов.

Современные «фишки»: трекбаки, пинги, XML-RPC, RSS

Drupal
Друпал популярен в мире, поэтому все «модные» фишки там быстро реализуются. В базовом пакете есть возможность ведения блога посредствам блогового клиента. Есть модуль, пингующий специальные каталоги Drupal-сайтов.

Joomla
Joomla это CMS, и говорить о внедрении таких вещей можно только на уровне сторонних компонентов. Видимо для Drupal’а и WordPress’а этот вопрос сильно актуален, ибо изначально это все-таки блоговые движки, а не CMS, и никуда от этого не деться. А в Joomla надо все рассматривать на уровне каких-то компонентов, например того же платного MyBlog. Если реализуют – здорово, нет – позиции Joomla от этого ни сколько не пошатнутся.

WordPress
Трекбаки, пинги поддерживаются уже давно. Причем для их использования не нужно вообще никаких дополнительных действий: все работает на уровне «движка». Что касается XML-RPC, то WordPress поддерживает сразу несколько API, поэтому добавлять/редактировать записи в WordPress можно с многих программ блог-клиентов или он-лайн, например с помощью Google-Docs.

WordPress полностью поддерживает RSS и Atom. Можно подписаться на последние записи блога, определенной рубрики, комментарии или все комментарии. С помощью отдельного плагина можно сделать автоматическую переадресацию RSS-ленты блога на feedburner.com.

Кодировки

Drupal
Drupal работает на UTF-8. Каких-то забытых строковых функций, не работающих с UTF-8 я не замечал. Некоторые хостеры по старинке отдают страницы в cp1251, но это легко чиниться. Проблемы с MySQL тоже обычно решаются одной строчкой кода. Мне нравится UTF-8 🙂

Joomla
Все проблемы с русской версий в кодировке CP1251 уже давно решены и на не слишком высоких версиях MySQL проблем почти не вызывают, нужно лишь почитать документацию. В параное (сборка Joomla от порталовцев, не совсем от них, но это одна и та же песочница) все решено более удачно (это ее основная особенность) и система сама выбирает нужную конфигурацию подключения в зависимости от версии MySQL.

С UTF-8 все сложнее, об этом достаточно написано, скажу лишь, что полная поддержка ожидается (собственно она уже есть) в версии 1.5. Сейчас можно говорить лишь об однобайтных кодировках и попытках сделать utf-сайты на непригодном для этого движке (хотя порой и весьма успешных). С аяксом все тоже сложно, ибо компоненты в основном делают буржуи, которые знать не знают о наших заморочках. А компонент этих столько, что рук не хватает ломать голову и мудрить что-то с iconv’ом.

WordPress
В самом WordPress’е есть возможность установить любую кодировку. Главное, чтобы кодировка базы данных совпадала с кодировкой блога. Правда, начиная с версии 2.1 WordPress должен работать в UTF-8. Это напрямую связано с использованием AJAX. Поэтому для русскоязычных пользователей основная проблема состоит только в том, что на серверах часто стоит CP1251. Поэтому я выпустил свою сборку WordPress (начиная с 2.2), которая позволяет использовать раздельную кодировку блога и базы данных. Это позволило многим без особых проблем перейти на последние версии WordPress. Сейчас можно довольно уверенно сказать, что особых проблем с кодировками в WordPress’е нет.

Комментирование

Drupal
Комментарии в блогах могут быть и «плоскими» («flat») и древовидными («treaded»). Всё это находится в базовом пакете. Извещения по email делаются внешним модулем.

Joomla
Как уже было сказано ранее – компонентов комментариев много. Можно использовать любой на выбор. Стабильных – раз-два и обчелся, но очень скоро выйдет мега крутая штукенция под названием jComments от русского разработчика, которая все поставит на свои места (мы в это тайно верим – надеюсь что не зря: первые бета версии были очень «вкусные»).

WordPress
Для любой записи можно разрешить или запретить комментирование. Отдельно можно разрешить прием пингов/трекбаков, а также автоматический пинг по адресам, указаным в тексте записи. При помощи отдельных плагинов можно сделать древовидные комментарии, а также разбить отображение комментариев по страницам. Можно добавить аватарки или favicon. Текстовый редактор комментария можно снабдить кнопками форматирования и смайлами. Есть также плагин (работает на AJAX), который позволяет в течение некоторого времени редактировать посетителю свой комментарий.

Экспорт / импорт данных

Drupal
Для Друпала написано много разных конвертеров, в основном связанных с форумными миграциями. RSS отдаются на любой вкус. Есть множество специальных вещей в духе экспорта в RDF или CSV.

Joomla
Я так понимаю, что этот вопрос очень актуален для блоговых движков. Еще раз хочу упомянуть о том, что Joomla – это не блог, а CMS, а потому вопросы экспорта заметок в какой-то формат для нее не важны. Если компонент платный, то за N зеленых американских трупперов легко можно заказать себе импорт записей из старого блога в новый в каком угодно формате.

WordPress
WordPress позволяет экспортировать записи и комментарии блога в XML-файл. Можно экспортировать записи отдельного автора. Для импорта записей в WordPress можно воспользоваться 9 способами. Это основные блоговские «движки» (например: ЖЖ, Blogger, Textpattern), а также в RSS и свой XML-формат.

Register_Globals

Очень часто админ, при установке CMS Joomla! видит сообщение об увязимости сайта в связи с установленым параметром register_globals=on. Эта статья поможет много чего прояснить.

Что представляет собой register_globals?
Это опция в php.ini, которая указывает на необходимость регистрации переменных полученные методом POST или GET в глобальный массив $GLOBALS.

Для ясности приведеи пример при register_globals=on.
Есть файл «index.php» с содержимом: echo $asd.' - локальная переменная
';
echo $GLOBALS['asd'].' - ссылка в глобальном массиве $GLOBALS
';
echo $_GET['asd'].' - $_GET["asd"]';
?>


В адресной строке напишем: index.php?asd=123

Получим: 123 — локальная переменная
123 — ссылка в глобальном массиве $GLOBALS
123 — $_GET[‘asd’]


Как мы видим, создались 2 переменные: одна локальная (+ ссылка в $GLOBALS), другая в массиве $_GET. Многие не используют массив $_GET вообще, они продолжают обрабатывать переменную «$asd» после получения ее извне.
Но давайте вдумаемся, зачем нам «загрязнять» массив $GLOBALS? Для этого у нас есть специальные массивы, хранящие данные, переданные методами GET (массив $_GET) и POST (массив $_POST).

Тот же самый пример, но при register_globals=off :

— глобальная переменная
— ссылка в глобальном массиве $GLOBALS
123 — $_GET[‘asd’]

Т.о. не была создана локальная переменная и для манипулирования с «$asd» мы должны использовать массив $_GET.

Возможно, уже сейчас вы изменили свое мнение о register_globals.
Вероятно, вам придется, что-то переписать в своих программах, но оно того стоит.

А теперь я расскажу вам, как взломщик может воспользоваться этой опцией в своих целях, т.е. при register_globals=on
Начну от простого к сложному.

Часто мы видим предупреждения: Notice: Undefined variable: asd(название переменной) in ****

Что это значит? Это значит, что переменная «$asd» не была определена явно.
Например, некоторые люди балуются подобным: for($i=0;$i<10;$i++)
{
@$asd.=$i;
}

echo $asd
?>


Т.е. не определив переменную, сразу начинают ее использовать. Приведенный код по идее не страшен, но задумайтесь, а вдруг эта самая переменная «$asd», в последствие записывается в файл? Например, напишем следующее в строке адреса: «index.php?asd=LUSER+» и получим: «LUSER 0123456789». Ну разве приятно будет увидеть такое? Не думаю.

Предположим мы пишем систему аутентификации пользователя: if($_POST['login']=='login'&&$_POST['pass']=='pass')
{
    $valid_user=TRUE; // Юзер корректный
}

if($valid_user)
{
   echo 'Здравствуйте, пользователь';
}
else echo 'В доступе отказано'
?>

Привел я заведомо дырявую систему, стоит нам только написать в адресной строке «index.php?valid_user=1» и мы получим надпись «Здравствуйте, пользователь»

Этого бы не случилось, если бы мы написали так: if($_POST['login']=='login'&&$_POST['pass']=='pass')
{
    $valid_user=TRUE; // Юзер корректный
}
else $valid_user=FALSE;

if($valid_user)
{
   echo 'Здравствуйте, пользователь';
}
else echo 'В доступе отказано'
?>

Т.е. сами определили переменную $valid_user, как FALSE в случае неудачи.

Продолжим далее…
Теперь использование функции IsSet() становиться небезопасно, т.к. любой может подменить переменную на угодную ему.

Приведу пример с sql-инъекцией: if(@$some_conditions) // некоторые условия
{
    $where='id=3';
}

echo $query='SELECT id, title, description FROM table '
.'WHERE '.(IsSet($where)?$where:'id=4')
?>

В адресной строке напишем: «index.php?where=id=0+UNION+ALL+SELECT+login,+password,+null+FROM+admin+where+login=’admin’» получим sql-инъекцию: SELECT id, title, description FROM table WHERE id=0
UNION ALL SELECT login, password, null FROM admin where login=’admin’

И взломщик получает ваши явки и пароли:(

Как вы видите все примеры, имеют дыры в защите, которые можно эксплуатировать через включенный register_globals.

Справиться с подобным можно, если всегда определять переменную вне зависимости от условий. Или же использовать инкапсуляцию переменных в функциях, т.е. когда вы определяете функцию, то переменные, что внутри нее будут закрыты извне, например: function asd()
{
// Какие то действия

if(IsSet($where))
{
    echo $where;
}
else echo '$where не существует';
}
asd();
?>

Теперь, если мы напишем в адресной строке: «index.php?where=123»
Даст: «$where не существует»
Но это при условии, что вы не устанавливаете переменную $where как глобальную, т.е. «global $where»

Я могу придумать еще очень много примеров, но думаю, что приведенных мною вам будет достаточно для понимания.
Хочу сказать, что все эти проблемы канут в лета, когда вы установите опцию register_globals=off и попробуете заново все приведенные выше примеры.

Это можно сделать как в php.ini, но большинство хостинг провайдеров вам это не позволят, потому придется воспользоваться файлом «.htaccess»

Создаем файл с названием: .htaccess
Запишем в него: php_flag register_globals off
И все, теперь некоторые вопросы безопасности решены:)

CHMOD для Joomla!

Все чаще обнаруживается, что некоторые начинающие сайтостроители, увлеченные скриптованием (на perl/cgi, php и т.д.) не знают, что такое chmod и как его использовать. В этом кратком руководстве вы узнаете что такое chmod, как он выставляется и для чего вообще это нужно.

Очень важно иногда назначить права доступа на определенные файлы и папки, находящиеся на веб сервере, будь то в целях безопасности или просто для корректной работы скрипта. Это действие и называется chmod (change file mode), или по-русски: изменение режима доступа к файлам. Это название берет свое начало с команды Unix — chmod, которая изменяет разрешения на файлы. Со временем «chmod» стал синонимом слова «разрешение» («permission»).

Существует три группы пользователей, права которых нас будут интересовать: владелец файла, группа и остальные пользователи.

Создавая файл, пользователь автоматически получает самые широкие права на делание с этим файлом чего угодно, его группа — несколько меньшие права, а все остальные — совсем ничтожные. В Unix есть только три основных права — читать файл или просматривать каталог («Read»), изменять файл или папку, записывая в неё что-нибудь, или вообще её удалять («Write»). Последнее право — право на запуск файла («eXecute»).

Режим chmod может обозначаться в числовом или символьном формате. Например: 755, rwxrxrx, 644 и т.д.

Как вы уже поняли, символы r, w и x обозначают, соответственно, read, write и execute. Выставлять права на файлы таким образом можно через любой ftp-клиент, например CuteFTP. Вот так выглядит окно установки chmod в этой программе:

Обратите внимание на расстановку «галочек». Первыми идут галочки в полях «Владелец»: read, write, execute (rwx); потом идут поля «Группы»: read, execute (rx); и наконец поля «Остальных»: read, execute (rx). В итоге мы получили права rwxrxrx на файл (по очереди букв и полей). То есть, владелец может читать, записывать и исполнять файл; «группа» и «остальные» имеют право на чтение и исполнение файла, но не на запись! Теперь вы должны осознавать важность установки прав на файлы и постараться обеспечить максимальную безопасность ваших скриптов и данных на сервере с помощью этого инструмента. 

Обратите внимание на число 755 в поле Manual. Оказывается, каждое право имеет определенный числовой код и может быть выставленно вручную: 

  • 400 — владелец имеет право на чтение;
  • 200 — владелец имеет право на запись;
  • 100 — владелец имеет право на выполнение;
  • 40 — группа имеет право на чтение;
  • 20 — группа имеет право на запись;
  • 10 — группа имеет право на выполнение;
  • 4 — остальные имеют право на чтение;
  • 2 — остальные имеют право на запись;
  • 1 — остальные имеют право на выполнение.

Сумма этих пунктов дает желаемый chmod. Например, мы хотим чтобы владелец мог делать все, а группа и остальные — только читать файл. Складываем: 400+200+100+40+4=744. То есть нам необходим chmod 744. Теперь осталось только просуммировать числа, соответствующие тем правам доступа, которые мы хотим поставить файлу, и установить их.

Примеры:

400+40+4=444 — все имеют право только на чтение.

400+100+10+1=611 — владелец может читать и выполнять, остальные — только выполнять.

400+200+40+4=644 — означает, что вы позволяете всем его читать, но писать в этот файл может только владелец файла. Даже если вы являетесь владельцем файла и открываете его в браузере, то вы не сможете ничего в него записать, поскольку доступ через браузер делает вас анонимным пользователем.

400+200+40+20+4+2=666 — означает, что все могут и читать и писать этот файл. Это необходимо, чтобы пользовател могли делать записи в гостевых книгах, форумах и т.д.

400+200+100+40+10+4+1=755 — классическая команда для cgi-скритпа. CGI-скрипт — это исполняемый файл, и все должны иметь к нему доступ на чтение и выполнение. Только владелец этого файла может его изменять или удалять.

Приведу еще более удобную, на мой взгляд, таблицу расчета chmod:

Значения Owner (Владелец) Group (Группа) Public (Остальные) Read = 4 X X X Write = 2 X     Execute= 1 X X X Сумма: (4+2+1) = 7 (4 + 1) = 5 (4 + 1) = 5

И в завершении кратко скажу о том, как эти разрешения устанавливаются. Делается это с помощью любого ftp-клиента:

  • В Windows Commander они изменяются через пункты меню «Файл» > «Изменить аттрибуты». При этом изменяются разрешения на выделенный файл (файлы) и/или папки.
  • В FAR Manager разрешения выделенных файлов изменяются нажатием Ctrl+A:

[x]

[x][ ] [x][x][ ] [x][x][ ] — 666

[x]

[x][x] [x][ ][x] [x][ ][x] — 755 В CuteFTP разрешения меняются с помощью пункта «Change file attributes» (изменить аттрибуты файла) меню, выпадающего при клике правой кнопкой мышки по имени файла www.shram.kiev.ua

Установка прав на папки и файлы CMS Joomla!

По заверениям sourpuss‘а надо выставлять следующие права: 644 на файлы и 755 на папки, 777 на папки images и cashe. Кроме того, при установке вам красными буквами, если прав не хватает, нарисуются папки и файлы на которые надо выставить права 777. Но только на время установки. Потом лишние права необходимо убрать.