itthon / Windows leckék / Layer Cake és com_weblinks Joomla. Hackek és kiegészítők Szürke weblinkek php

Layer Cake és com_weblinks Joomla. Hackek és kiegészítők Szürke weblinkek php

Belépés a Joomla! komponens hasonló a legtöbb komponenshez. Ebben a példában a Joomla egyik alapvető összetevőjét, a webes hivatkozásokat fogjuk használni. Az első kezelőfelületen végrehajtott fájl: …/components/com_weblinks/weblinks.php .

Először egy biztonsági ellenőrzést látunk, amelynek célja, hogy megbizonyosodjon arról, hogy senki sem hívhatja fel közvetlenül ezt az oldalt. Ez az a szabvány, amelyet minden php fájlban használni kell (bár van néhány kivétel):

Ellenőrizzük a lekérdezési karakterláncot, hogy megnézzük, elküldtek-e egy adott vezérlőnevet. Ha igen, akkor gondoskodunk arról, hogy a szükséges fájlt be tudjuk tölteni a vezérlők könyvtárába:

// Konkrét vezérlő szükséges, ha kérik if ($controller = JRequest:: getWord("controller" ) ) ( $path = JPATH_COMPONENT. DS. "controllers" . DS. $controller . ".php" ; if (file_exists ($útvonal) ) ) ( szükséges_egyszer $elérési út ; ) else ( $controller = "" ; ) )

Most példányosítjuk a vezérlő osztályunkat a fent meghatározott névvel:

Amint a feladat befejeződött, szükség esetén átirányítást végzünk:

// Átirányítás, ha a vezérlő állítja be $controller -> redirect () ;
Vezérlő osztály

A linkek összetevő általános (specifikus) vezérlője itt található: .../components/com_weblinks/controller.php.
Ez az egész osztály meghatároz egy megjelenítési metódust, amely az alapértelmezett metódus, hacsak a felhasználó nem ad meg más feladatot.

definiált ("_JEXEC" ) vagy die ( "Korlátozott hozzáférés" ); jimport("joomla.application.component.controller" ) ; /** * Weblinkek komponensvezérlő * * @csomag Joomla * @alcsomag Webhivatkozások * @1.5 óta */ osztály A WeblinksController kiterjeszti a JController-t ( /** * A webhivatkozások nézetének megjelenítési módja * * @access public * @asce 1.5 */ függvény megjelenítése () ( // Alapértelmezett nézet beállítása, ha nem létezik, ha ( ! JRequest:: getCmd ( "nézet") ) ( JRequest:: setVar ( "view" , "categories" ) ; ) //frissítse a weblink találati számát if (JRequest:: getCmd ("view" ) == "weblink" ) ( $model =& $this -> getModel ("weblink" ) ; $model -> hit () ; ) // Gyorsítótári logika megtekintése -- egyszerű ... be vagyunk jelentkezve? $user = & JFactory::getUser() ; $view = JRequest::getVar("view" ) ; $viewcache = JRequest::getVar("viewcache" , "1" , "POST " , "INT" ) ; if ($user -> get ("id" ) || ($view == "kategória" && $viewcache == 0 ) ) ( szülő:: megjelenítés (false) ; ) else ( szülő :: kijelző (igaz) ; ) ) )

Ebben a módszerben az alapértelmezett nézetet úgy állítjuk be, hogy kategóriákat mutasson, kivéve, ha másik nézetet adtunk át lekérdezési karakterlánc-paraméterként. Ha a szükséges nézet weblink, akkor növeljük a linknézet számlálóját. Ezután beállítjuk a nézetváltozó értékét, és meghívjuk a szülő JController osztályunk diplay metódusát.
Külön érdemes odafigyelni a getModel metódus meghívására. Betölti a komponenshez szükséges modellt. Ebben a példában ez a metódus az itt található weblink modellt tölti be: .../components/com_weblinks/models/weblink.php.
Itt egyetértünk abban, hogy nem kértük bizonyos gondolat, így nézetünk kategóriákra lesz beállítva.
Ezután megnyitjuk a nézet osztályt.

Osztály megtekintése

Mivel feltételezzük, hogy kategóriaábrázolást akarunk, ez a − következő fájl amely végrehajtásra kerül: .../components/com_weblinks/views/categories/view.html.php

// Ellenőrizze, hogy ez a fájl szerepel-e a Joomla! defined("_JEXEC") or die("Korlátozott hozzáférés"); jimport("joomla.application.component.view" ); /** * A WebLinks komponens HTML View osztálya * * @static * @package Joomla * @subpackage Weblinks * @1.0 óta */ osztály A WeblinksViewCategories kiterjeszti a JView-t ( függvény megjelenítése( $tpl = null ) ( globális $ mainframe ; $document = & JFactory:: getDocument() ; $categories =& $this -> get ("adatok" ) ; $összesen =& $this -> get ("összesen") ; $state =& $this -> get ("state" " ) ; // Az oldal/összetevő konfigurációjának lekérése $params = & $mainframe -> getParams () ; $menus = & JSite:: getMenu () ; $menu = $menus -> getActive () ; // mert az alkalmazás alapértelmezett oldalcímet állít be, akkor // közvetlenül magából a menüpontból kell megkapnunk if (is_object ( $menu ) ) ( $menu_params = new JParameter( $menu -> params ) ; if (! $menu_params -> get ( "oldal_címe" ) ) ( $params -> set ("page_title" , JText:: _( "Web hivatkozások") ) ; ) ) else ( $params -> set ("page_title" , JText:: _( "Web hivatkozások") " " ) ) ; ) $document -> setTitle ( $params -> get ( "oldal_címe" ) ) ; // Állítson be néhány alapértelmezett beállítást, ha nincs beállítva a paramsnál $params -> def ("comp_description" , JText:: _("WEBLINKS_DESC" ) ) ; // Képcímke attribútumok meghatározása if ($params -> get ("image" ) != - 1 ) ( if ($params -> get ("image_align" ) != "" ) $attribs [ "align" ] = $ params -> get ("image_align" ) ; else $attribs [ "align" ] = "" ; $attribs [ "hspace" ] = 6 ; // Használja a statikus HTML könyvtárat a $image = JHTML képcímke létrehozásához:: _("image" , "images/stories/" . $params -> get ("image" ) , JText:: _("Web hivatkozások" ) , $attribs ) ; ) for ($i = 0 ; $i< count ($categories ) ; $i ++ ) { $category =& $categories [ $i ] ; $category ->link = JRoute:: _("index.php?option=com_weblinks&view=category&id=" . $category -> slug ) ; // Kategória leírás készítése $category -> description = JHTML:: _("content.prepare" , $category -> description ) ; ) $this -> assignRef ( "image" , $image ) ; $this -> assignRef ("params" , $params ) ; $this -> assignRef ("categories" , $categories ) ; szülő::megjelenítés($tpl); ) ) ?>

Ez ismét egy nagyon egyszerű osztály egyetlen megjelenítési módszerrel. A legtöbb logika itt a linkkomponensre jellemző, de ha alaposan megnézzük, megtalálhatjuk a legtöbb komponensnézet-osztályban használt funkciókat. A megjelenítési metódus végén ez az osztály meghívja a szülő (JView) megjelenítési metódust, átadva a megjelenítendő sablon nevét. Ha a megjelenítési sablon neve nem kerül átadásra, a rendszer az "alapértelmezett" sablont használja.
És végül megnyitjuk a sablon osztályt.

Sablon osztály

Egyezzünk meg abban, hogy egy adott sablonnevet nem adtunk át, így az alapértelmezett sablon kerül felhasználásra. Ebben az esetben a következő fájl kerül számításba: .../components/com_weblinks/views/categories/tmpl/default.php
-> escape ($this -> params -> get ("page_title" ) ) ; ?>

  • ( )

A logika nagy része itt a végrehajtott összetevőre jellemző. A kódból is látható, hogy ez a fájl tartalmazza az összes PHP-vel kevert HTML-t – ez a funkciója és célja.

Az összetevőkben használt egyéb fájlok

Számos egyéb fájltípus, amelyet az összetevőkben találhat:

  • Segítők – az összetevők gyakran használnak helper.php fájlt vagy helpers könyvtárat sok fájllal. Ezek a fájlok általában csak általánosakat tartalmaznak funkcionalitás az alkatrészhez.
  • Úgy tűnik, hogy az Assets az összetevőben található egyéb fájlok összesítő mappája.
  • router.php – ez a fájl akkor használható, ha a SEF URL-beállítás engedélyezve van, hogy lefordítsa az URL-t mindkét irányban (ember által olvashatóvá álnevekkel és a Joomla rendszernézetbe paraméterekkel).
  • xml fájlok – általában paramétereket és egyéb információkat határoznak meg az összetevőről és annak áttekintéséről. Ezeket például az összetevő menüelemek létrehozásakor használják.
  • index.html - jó gyakorlatok legyen egy üres index.html fájl az összes könyvtárában. Ez egy ilyen passzív biztonsági intézkedés.
  • css/images/js – Különféle fájlokat tartalmazó mappák, amelyek a kliens oldalon (a böngészőben) megvalósítják a tervezést és a funkcionalitást.

A /includes/joomla.php fájlban a cleanText függvényben van egy javaslat a sor cseréjére

$szöveg = strip_tags($szöveg); $szöveg = strip_tags ( $szöveg , " " ) ;

Ez a feltörés csak normál képként beszúrt képekhez készült. Mambot (mosimage) által beillesztett képek esetén ez a feltörés nem működik.

Hogyan jeleníthet meg közvetlen hivatkozást a com_weblinks komponensben

A weblinks.html.php fájlban ki kell cserélni a következő sort:

$link = sefRelToAbs( "index.php?option=com_weblinks&task=view&catid=" . $catid ."&id=" . $row ->id ) ; $link = $sor ->url ; Hogyan lehet a Joomlát egyszerre két gazdagépen (domain) működtetni. Azok. például be helyi hálózat 10.0.0.15 címen és a-firmy.ru webhelyről. Annak ellenére, hogy mindkét cím ugyanahhoz a géphez van rendelve.

Először is, a probléma lényege az, hogy a Joomla az összes képet és CSS-fájlt (az elérési útjukat a sablonban) a $mosConfig_live_site változójához - a telepítés során megadott webhely alapcíméhez - viszonyítva jeleníti meg. És ha valaki más címmel próbál hozzáférni, akkor működési logikájában semmi sem változik - az alapcímet a konfigurációs fájlból veszik. Például, ha a konfiguráció azt állítja, hogy a Joomla a localhost-on található, akkor a helyi hálózatról való hozzáférés, még a 192.168.0.1 címet hallgató, megfelelően konfigurált Apache-hoz sem változtat rajta semmit - a képek src-je továbbra is elindul. „localhost”-tal, amely más gépeknél már saját localhost-tal rendelkezik. Az ilyen esetekre vonatkozó megoldások középpontjában a $mosConfig_live_site változó lecserélése áll a kért gazdagépen, így minden függvény ki tudja adni a megfelelő hivatkozásokat, és máris elvezeti a felhasználót a akár egyik, akár másik virtuális oldal (add meg a képekhez a helyes alap elérési utakat és a címekhez az alap elérési utat). Van egy Auto live site mambot, ami ezt automatizálni tudja. Ha valamiért nem felel meg, akkor elvileg megismételhető , ehhez a konfigurációs.php-ben a $mosConfig_live_site definíció helyett meg kell írnia a kódját. Valami ilyesmi:

if ($_SERVER [ "HTTP_HOST" ] =="host1.ru" ) $mosConfig_live_site = "host1.ru" ; else $mosConfig_live_site = "host2.ru" ;

Ügyelni kell arra, hogy ha gyorsítótárat használunk, akkor két különböző gyorsítótárnak is kell lennie két gazdagéphez, mert a különböző hostokra mutató hivatkozások keresztezhetik egymást a gyorsítótárban, és akkor a rossz hálózatról érkező felhasználó egyáltalán nem jut el sehova. . A gyorsítótárért a $mosConfig_cachepath változó felel.

Hogyan lehet két összetevőt egyszerre megjeleníteni egy oldalon

Azonnal megmondom - nem minden olyan egyszerű. Végül is ez nem egy modul. Ezért először is érdemes alternatívát keresni, pl. Egy népszerű komponens minden bizonnyal olyan modulokkal érkezik, amelyek képesek megismételni a funkcióit. Ha nincs ilyen, akkor ez egy lehetőség. Készíthető modulként, vagy elméletileg sablonba illeszthető. Az ötlet a következő - a komponens meghívása az index2.php-n keresztül (mi és miért - olvassa el a teljes tényt). Azok. létrehozhat egy iframe-et az src="index2.php?option=com_component&no_html=1" paraméterrel a második komponens kívánt beszúrási pontján. És ott megjelenik. A másik dolog az, hogy nem valószínű, hogy teljes mértékben biztosítható lesz a funkcionalitás. De ennek ellenére ez egy kiút.

Vagy használja a következő konstrukciót: mosLoadComponent("com_mycomp" ) ;

De ha az összetevőt így hajtják végre, akkor meg kell értenie, hogy nem tud a manipulációiról, és a $opció és a $feladata szerint fog működni.

Hogyan lehet növelni a cím hosszát egy cikkben

A következő két parancsot kell futtatnia a phpMyAdminban (van egy speciális oldal az SQL-lekérdezések végrehajtására), csak cserélje ki a ###_-t a valódi táblázat előtagjával. A maximális lehetséges szám 255. A példában 200-at használunk.

ALTER TABLE `###_content` CHANGE `title_alias` `title_alias` VARCHAR(200) NOT NULL; ALTER TABLE `###_content` CHANGE `title` `title` VARCHAR(200) NOT NULL;

Hogyan helyezhet el teljes hírszöveget az RSS-hírcsatornájába, nem csak a címsorokat

Ehhez a /components/com_rss/rss.php fájlban le kell cserélni

$item_description = $sor ->introtext ; $elem_leírása = $sor ->teljes szöveg ; Hogyan készíthetek két Joomla webhelyet ugyanazzal az adatbázissal vagy ugyanazokkal a fájlokkal?

Ami egy adatbázis használatát illeti, egy adatbázist kell írnia a configuration.php fájlba két motorhoz, de értenie kell, hogy mit csinál. Mivel ebben az esetben a felhasználók munkameneteinek fenntartása nagyon problémás lesz, mivel a tartományok eltérőek. Azok. A #__sessions tábla bejelentkezési bejegyzései átfedésben lesznek (lehet).

Ha ugyanazokat a fájlokat nagy disztribúció másolása nélkül szeretné használni, akkor elvileg használhatja az „ln -s” parancsot Linuxban, hogy szimbolikus hivatkozásokat hozzon létre a meglévő fájlokhoz, és ne másolja azokat az új webhelyre.

Hogyan hozzunk létre egy virtuális oldalt, amely egy adott címen érhető el általános kialakítás Joomla (http://site.ru/super_page)
  • Az első módszer valamilyen SEF komponens használata, amelyben megadjuk a statikus oldal kívánt virtuális elérési útját. Van itt egy mínusz - ez az összetevő elkezdi az összes többi hivatkozást átdolgozni (és általában ezek az összetevők nagyon energiaigényesek, és sok erőforrást igényelnek a működésükhöz).
  • Hozzon létre egy álnevet egy ilyen oldalhoz a mod_rewrite és a .htaccess használatával. Ehhez szüksége van:
    • Hozzon létre egy statikus oldalt a kívánt szöveggel, találja meg az azonosítóját és címét (nem szükséges ilyen oldalt létrehozni, lehet, hogy már létezik, és általában csak bármilyen komponens, nem feltétlenül com_content)
    • Találj ki egy álnevet, legyen "super_puper"
    • Nyissa meg a .htaccess fájlt, és a "RewriteCond %(REQUEST_FILENAME) !-f" sor elé írja be:
RewriteRule ^(super_puper) index.php?option=com_content&task=view&id=12 RewriteCond %(REQUEST_FILENAME) !-f
    • És most, feltéve, hogy a Joomla a site.ru webhelyen található, amikor megnyitja a http://site.ru/super_puper hivatkozást, megnyílik a szükséges statikus oldal az Ön adataival. Maga az "index.php?option=com_content&task=view&id=12" link bármi lehet, a lényeg, hogy a link ne abszolút (azaz http:/ /...-vel), hanem relatív (indexszel kell kezdődnie) .php?...)
Hogyan lehet letiltani a gyorsítótárazást egy adott cikknél

Erre akkor lehet szükség, ha az rd_addphp mambotot használja olyan szkriptek beszúrására, amelyeknek minden alkalommal véletlenszerű számokat vagy véletlenszerű szöveget kell generálniuk, függetlenül a Joomla gyorsítótárazási rendszerétől. Egy adott elem gyorsítótárazásának letiltásához meg kell találnia az azonosítóját (az adminisztrációs panelen szerkesztéskor nézze meg címsor, ott valami olyasmi jelenik meg, mint a "...&id=123...". Így a 123 lesz a cikkazonosítónk. Cserélni kell a /components/com_content/content.php fájlban körülbelül az 1600-as sorban.

$cache ->call ( "HTML_content::show" , $sor , $params , $access , $page ) ; if ($row ->id !="123" ) $cache ->call ( "HTML_content::show" , $sor , $params , $access , $page ) ; else HTML_content::show ($sor, $params, $access, $page) ;

Ahol 123 a szükséges cikkazonosító.

Nagyon sok összetevőt telepítettem, de az admin menüben a komponensek listája csökkentett számot mutat be, majd azt írja ki, hogy „További összetevők...”. Az összes komponens megjelenítése.

Szüksége van egy sorra a /administrator/modules/mod_fullmenu.php fájlban

$topLevelLimit = 19 ;

kicserélve

$topLevelLimit = 199 ; Hogyan telepítsünk egy komponens másolatát

Azt kell mondanunk, hogy a feladat rendkívül nehéz. Ha nem érti az összetevő működését, akkor ne is próbálkozzon. Azok számára, akik még mindig szeretnék megjegyezni a főbb pontokat:

  • Az XML-fájlban nevezze át az összetevő nevét a névcímkében
  • Ezután át kell neveznie a használt táblákat (elsősorban az XML fájlban, másodsorban az összes összetevő fájlban, ahol a $database adatbázis objektumot és a setQuery metódust használják)
  • Nevezze át az összes elérési utat a komponensekben is. Az elérési utak felhasználhatók önmagukra való hivatkozásokban vagy a mellékelt fájlok nevében. Ez leggyakrabban a com_componentname részkarakterlánc megkeresésére és egy újra cseréjére vezethető vissza.

De ez a módszer nem garantál semmit. Az egyszerűeknél ez lehetséges és elmúlik, de az összetetteknél senki sem garantálja.

Hogyan lehet egy pozíciót véletlenszerűen megjeleníteni a hozzá rendelt modulok közül
  • 1. lehetőség – törje fel a mosLoadModules funkciót. A sablonban azon a helyen, ahol meg kell jeleníteni az N modul egyikét, ezt írjuk (ügyeljen a harmadik argumentumra):
mosLoadModules("pozíció", display_setup,true);

És kissé javítjuk magát a fenti függvényt:

function mosLoadModules( $position ="left" , $style =0, $show_random = false ) ( ... $allModules =& initModules() ; if (isset ( $GLOBALS [ "_MOS_MODULES" ] [ $pozíció ] ) ) ( $modules = $GLOBALS [ "_MOS_MODULES" ] [ $pozíció ] ; ) else ( $modules = array () ; ) //add ide if ($show_random && sizeof ($modules ) >0 ) ( $tmp = $modules [ rand (0 ,sizeof ($modules ) -1 ) ] ; $modules = tömb ($tmp ) ; ) //utasítás vége if (count ( $modules )< 1 ) { $style = 0 ; }

Adtunk hozzá egy harmadik argumentumot (amit a sablonban használunk, ahol igazat írtunk), és módosítottuk a kódot.

  • A második lehetőség fájdalommentesebb, csak a sablont módosítjuk. De munkaigényesebb - több pozíciót kell létrehoznunk. Először is létrehozunk néhány új modulpozíciót, például new1 ... new10. Megment. A sablon megfelelő helyén a mosLoadModules függvény meghívása előtt adja hozzá a szükséges kódot:
$rand_num = rand (1 ,10 ) ;//1-től 10-ig - mint a pozíciónévben mosLoadModules ( "new" .$rand_num , display_settings) ; Úgy gondolom, hogy az /adminisrator/ mappa átnevezésével biztonságosabbá teszem a webhelyemet

Ez az opció nem alapfelszereltség. Valójában azonban lehetséges, hogy a Joomla-fájlokban keresést szervezve egy ilyen szó előfordulását a tiédre cserélje - titkos. Időnként később felbukkanhatnak a fájlokhoz való hozzáférés hiányával kapcsolatos hibák, de a fájl és a sorszám ismeretében ezek javíthatók. Ezért a probléma elvileg megoldható.

A YRC Weblink böngészőt az indiai YRC Group Inc. szoftvercég hozta létre és terjeszti. És ezért mint kezdőlap az alapértelmezett az indiai Google :))

Az indiai programozókat a világ egyik legmenőbbnek tartják (az orosz és a kínai után:), de valami nem jött össze nekik ezzel a böngészővel, mert ez csak valami ünnep, nem böngésző. Az ötletek, amelyeket ebben a böngészőben próbáltak megvalósítani, csodálatosak, de maga a megvalósítás nagyon rossz. A böngésző "repedéseken keresztül" működik, vagyis furcsán és rosszul. Kipróbáltam kettőn különböző számítógépek- Windows 7 és Windows 8 alatt - mindkettőben vannak hibák és lefagyások.

Azonban menjünk sorban.

A telepítés után a böngésző felkéri Önt, hogy válasszon néhány beállítást (mint például a fenti képernyőképen), és hozzon létre fiókot a felhőalapú szinkronizáláshoz, valamint a beállítások, könyvjelzők, jegyzetek és fájlok tárolására.

Jó ötlet! Rákattintok a Regisztráció linkre, ami azt jelenti, hogy „Regisztráció”, megnyílik egy oldal vicces képekkel, de valamiért nem a YRC Weblinkben nyílik meg, hanem az alapértelmezés szerint a számítógépre telepített böngészőben, és ez az első furcsa dolog. Egy másik furcsa dolog, hogy elég sok adatot kell megadnia – miért? Például a Maxthon böngészőben a felhőbe való regisztrációhoz csak az e-mail címet és a jelszót kell megadni, ami sokkal egyszerűbb, kellemesebb és nem vet fel felesleges kérdéseket.

Rendben, beírom ezeket az adatokat. Levelet kapok a fiókom megerősítésére, rákattintok a linkre, de a webhely azt mondja: "Hoppá! - Nem találom az adatait az adatbázisban." De aztán jön egy újabb levél új linkkel, rákattintok a benne lévő linkre és újra - Hoppá! Azonban ezeknek a hoppáknak a folyamatában érkezik egy harmadik levél, amely azt mondja - gratulálok, fiókja megerősítést nyert! Ez egyfajta indiai fiókellenőrzés.

Megnyitom a böngészőt, a beállításokat, és megpróbálom importálni a könyvjelzőket. A böngésző nem látja a könyvjelző fájlt .html formátumban, amit minden általam ismert böngésző lát, megért és gond nélkül elfogad. Kézzel beírom a fájlnevet, rákattintok az Importálás gombra és jelentést kapok - a könyvjelzők importálása sikeresen megtörtént!

De hova importálták sikeresen??? Sem a böngészőben, sem a felhőben nincsenek. Megismétlem a műveletet, és ugyanaz az eredmény. Nem fontos. Menjünk tovább.

A felhőben és a beállításokban van egy Notes elem. Emlékezve a Maxthon böngészőben található jegyzetekre, amelyeket a beépített jegyzettömb segítségével lehet létrehozni, és amelyek automatikusan a felhőbe mentődnek, próbálok valami hasonlót találni a YRC Weblinkben, sajnos, hiába. A jegyzetekhez van nézet, de létrehozásukhoz nincs eszköz. Furcsa? És hogyan!

Akkor jó. Lássuk, mi van még. A telepítés során maga a böngésző (kérés nélkül) két parancsikont telepített az asztalra - egy böngésző parancsikont (ez normális) és egy Twitter parancsikont.

Erre a parancsikonra kattintva egy külön böngészőablak nyílik meg a Twitterrel. Miért a fenéért csinálja ezt, sőt alapértelmezés szerint? Lehet, hogy egyáltalán nem használom a Twittert? Oké, töröltem a Twitter parancsikont az asztalról, de nem volt szerencsém! Most, ha rákattint a böngésző parancsikonjára (nem a Twitterre), a böngésző kiemeli a Twittert a tálcán! Életemben nem láttam még ilyen ünnepi hibát!

Egyébként erről a három ablakról, amelyeket a fenti képernyőképen lát. Az Összegzés beállításai ablak időnként lefagy. Sőt, csak a folyamat letiltásával lehet kikapcsolni a Feladatkezelőben, nincs más lehetőség. A szinkronizálási ablakot pedig csak a rendszerből való kijelentkezéssel zárhatja be.

Ha a "Nem" gombra kattint, az ablak mindig nyitva marad. Annak ellenére, hogy maga a böngésző éppen ellenkezőleg, időről időre spontán kikapcsol. És ami vicces: a böngésző kikapcsol, és az Összegzés ablak lefagy és nyitott ablak Nincs szinkronizálás, csak gazdátlanul lógnak a böngésző által elhagyva, amíg ki nem kapcsolod őket a Feladatkezelőben. Varázslatos hibák!

Helytelen lenne azonban nem felsorolni pozitív oldalai böngésző.

Először is ez a mód névtelen szörfözés. A beállításoknál engedélyezi ezt a módot, és a böngésző nem használ gyorsítótárat, cookie-kat, és nem rögzíti a böngészési előzményeket. Vannak böngészők, amelyek csak ebben a módban működnek, például a Browzar, amely néha szükséges, de általában rendkívül kényelmetlen. Az üzemmód gyors csatlakozásának és letiltásának lehetősége pedig nagy előnyt jelent a böngésző számára.

Másodszor, az YRC Weblinknek van választási lehetősége keresőmotor alapértelmezett. Azonban egy meglehetősen specifikus listáról kell választania:

A keresőmotor címe azonban manuálisan is megadható az Új definiálása gombra kattintva (a képernyőképen nem látszik, a lista alatt van).

Nos, az utolsó, de nagyon jelentős plusz - az YRC Weblink alig tölti be a rendszert! Összehasonlításképpen 10 lapot nyitottam meg benne, és 10 lapot nyitottam meg azonos címekkel a Yandex böngészőben (a böngészők között vezető a rendszer betöltésében), és ez a kép.

Yandex böngésző:

Nem nehéz kitalálni, hogy a YRC Weblink ebben az értelemben gyakorlatilag páratlan, jó értelemben.


ÖSSZEFOGLALÁS . Ha minden ötlet, amit az alkotók ebben a böngészőben próbáltak megvalósítani, helyesen megvalósulna, nem lenne ára, a YRC Weblink a legjobbnak mondhatná magát, vagy legalábbis az egyiknek. legjobb böngészők. De a benne megfigyelhető hiányosságokkal még csak nem is „C” minősítést kap. 3-as értékelést adok rá.

A tesztelés után eltávolítom a böngészőt - egyáltalán nem szükséges, hogy ilyen hibás program legyen a számítógépen. Nos, várjuk a további lépéseket a YRC Group Inc. részéről. Vajon az indiai programozók képesek lesznek-e minden hiányosságot kiküszöbölni és valóban kiadni működő változat böngészők, tisztelet és dicséret nekik. Ha kudarcot vallanak, lesz még egy halvaszületett böngésző a világon.

Ebben a hónapban a hibakeresők nem akarnak elkényeztetni minket a népszerű alkalmazások új, nagy horderejű exploitjaival. Természetesen sok tanácsot tettek közzé ismert cégek termékeiben, de ezek közül nagyon kevés tartalmaz olvasható PoC kódot. Áttekintésünkben megpróbáltam összegyűjteni a közelmúltban leírt legjelentősebb és legteljesebb sebezhetőségeket, úgyhogy dőljön hátra és élvezze az olvasást.

PHP sebezhetőség a HTTP Head kérések feldolgozása során Rövid

Március 3-án egy bizonyos Adam Ivanyuk felfedezte érdekes tulajdonság a PHP interpreterben, amely nem egészen megfelelően dolgozza fel a HEAD kéréseket. A kutató ezt a sérülékenységet „HTTP HEAD módszer trükk php szkriptekben” nevezte.

Sok kódoló megtervezi PHP szkriptjeit abban a reményben, hogy az összes benne írt utasítás sikeresen végrehajtódik anélkül, hogy valahol a közepén eltörne (különösen a rövid szkripteknél). Ez történik, ha a szkriptet a végfelhasználó kéri a GET, POST, PUT metódusokkal.

De tudnia kell, hogy vannak más HTTP-módszerek is – például a HEAD. Pontosan ennek a módszernek a PHP-ben való feldolgozása során keletkezhet biztonsági rés.

Nézzük meg az egyik értelmező forrást: ./main/SAPI.c, 315. sor:

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

Amikor bármilyen adat érkezik, a php_ub_body_write függvény végrehajtásra kerül. Ezután nézze meg a main/output.c 699. sorát:

if (SG(request_info).headers_only) (
if(SG(fejlécek_elküldve))
{
visszatérés 0;
}
php_header(TSRMLS_C);
zend_bailout();
}

Itt látható, hogy a képernyőre való első nyomtatáskor és a HEAD metódus használatakor a zend_bailout függvény megtöri a szkriptet.

Kihasználni

Most pedig érjük el ezt a szkriptet a HEAD metódussal:

Ahogy várhatta, a mi Vendégkönyv leállítja a végrehajtását az „echo $data;” sornál, így a book.txt fájl egyszerűen nullára áll vissza.
Ez a példa meglehetősen romboló jellegű. A második példában megkerülhetjük az engedélyezést a primitív adminisztrációs panelen:

Ebben a szkriptben a szokásos módszerekkel történő bejelentkezéskor egy adminisztrációs változó kerül beállításra a munkamenetben. Ezután, ha a felhasználó helytelen jelszót ad meg, ez a változó visszaáll, és a felhasználó nem lesz rendszergazda.

Ha a HEAD-en keresztül érjük el az adminisztrációs panelt, akkor az „echo” kódrészletnél megszakad annak végrehajtása, így az adminisztrációs változó nem áll vissza, és nyugodtan bolyonghatunk az alkalmazás zárt részén. Itt érdemes szem előtt tartani, hogy a legtöbb webszerver kimeneti pufferelési értéke 4096 bájt, így egy működő példában szükségünk lehet a "A hosszú karakterlánc körülbelül 4090 karaktert tartalmaz" karakterláncra.

Kihasználni
  • PHP

    Itt a $check tömb tartalmazza a POST adatainkat, a $locked változó pedig egy szerializált karakterlánc, amelyet az str_rot13() függvény segítségével obfuszkálunk, amely teljes mértékben a mi ellenőrzésünk alatt áll.

    Ezen a ponton érdemes egy kis kitérőt tenni azoknak, akik nem olvasták a ][ megfelelő cikkeit, és röviden beszélni a PHP varázslatos módszereiben megjelenő hibáról. Így a PHP 5-ös verziójában megjelent az OOP programozás alapkoncepciója: konstruktor és destruktor. A konstruktor a "__construct" metódussal, a destruktor pedig a "__destruct" metódussal kerül megvalósításra. Munkájának befejeztével és az unserialize() függvényen keresztül történő híváskor minden objektum végrehajtja a saját __ destruct metódusát, ha az be van írva a kódba.

    Most térjünk vissza a keretrendszerünkhöz, és nézzük meg az App class destruktort a ./libs/configure.php fájlból:

    függvény __destruct()
    {
    if ($this->__cache)
    {
    $core = App::core("torta");
    unset($this->__paths);
    Cache::write("dir_map", array_fi lter($this->__paths),
    "torta_mag");
    Cache::write("fi le_map", array_fi lter($this->__map),
    "torta_mag");
    Cache::write("object_map", $this->__objects,
    "torta_mag");
    }
    }

    A fenti kódból láthatja, hogy ez a módszer sérülhet, ha tetszőleges értékeket ír a Cache objektumba. A feltörés legérdekesebb kulcsa a 'file_map'. Kezeli az osztályok és a megfelelő PHP fájlok közötti kapcsolatokat, és további osztályok betöltésére is szolgál a szkript végrehajtása során.

    Az osztályok betöltésének tényleges kódja egy kicsit bonyolultabb, de mindez az App osztályon belüli __load metódus következő kódjára csapódik le:

    Bingó! A $file változó behelyettesítésével saját PHP kódot is beilleszthetünk! Ráadásul ez egy igazi Remote File Inclusion bug lesz – így nincs szükségünk további trükkökre a helyi fájlok szerverre való feltöltéséhez. A talált sebezhetőség szerzője azonban egy LFI lehetőséget kínál ennek a lyuknak a kihasználására, mivel a CakePHP fájl alapú helyi gyorsítótárat használ, amely szerializált formában a támadó által ismert könyvtárban található.

    Kihasználni

    Kis PoC-ként egy mérgező szerializált karakterlánc generálásához a felix a következő kódot kínálja:

    Természetesen először fel kell venni a szükséges osztályokat a CakePHP-ből. Van egy teljesen működőképes Python exploit is, amelyet a malloc.im/burnedcake.py oldalon találhat meg.

    Ennek az exploitnak minden CakePHP-re épített alkalmazásban működnie kell, amely biztonsági tokenekkel ellátott POST űrlapokat használ, és amelyekben a cache fájlok szabványos helye nem változott. Az exploit alapértelmezés szerint az adatbázis konfigurációját jeleníti meg, a beépített PHP hasznos terhelés megváltoztatásával egyéb hasznos funkciók is egyszerűen hozzáadhatók.

    Célok
    • CakePHP 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");
      // Mindenről listát kell szereznünk
      // weblinkek az adott kategóriában
      $query = "SELECT *" .
      "FROM #__weblinks" .
      "WHERE catid = ". (int) $this->_id.
      "ÉS megjelent = 1" .
      "ÉS archivált = 0".
      "RENDEZÉS". $fi lter_order "".
      $fi lter_order_dir .", rendezés";
      return $query;
      }

      Itt látható, hogy a $filter_order és a $filter_order_dir változók nem felelnek meg a szigorú egyezési ellenőrzésnek SQL utasítások, az ellenőrzés csak a JFilterInput osztály szabványos tiszta metódusával történik:

      Ezt a kódot bárhová beillesztjük a webhelyre, amely 5 véletlenszerű hivatkozást jelenít meg az adatbázisból és egy véletlenszerű horgonyt. Jobb hígítani a horgonyokat, mint csak 1-et írni a hivatkozásra. Nál nél hozzáértő linkelés az oldalon azonnal látni fogja a forgalom növekedését és a webhely egyéb mutatóinak javulását.

      Várom kérdéseiteket a bejegyzéshez fűzött kommentekben.

      Megjelenés időpontja: 2014. március 03
        Vélemények és megjegyzések:

        Dmitrij:
        Köszönöm a forgatókönyvet, megvalósítom. A forráskódot nem lehet lemásolni az oldalról, csak kis töredékekben másolják, kényelmesebb lenne teljes egészében.

        Kirill :
        Köszönöm a megjegyzést a másolással kapcsolatban, most láttam, hamarosan megpróbálom megjavítani.

        Alekszej Pavlov:
        Hiba a $tex = explode(":",$sendlist[$count] sorban, pontosvessző kell, nem kettőspont. Kicsit módosítottam a kódon, hogy világosabb legyen: