Maison / Leçons Windows / Layer Cake et com_weblinks Joomla. Hacks et modules complémentaires Liens Web gris php

Layer Cake et com_weblinks Joomla. Hacks et modules complémentaires Liens Web gris php

Point d'entrée vers Joomla! Le composant est similaire pour la plupart des composants. Pour cet exemple, nous utiliserons l'un des composants principaux de Joomla : les liens Web. Le premier fichier qui sera exécuté dans le front-end : …/components/com_weblinks/weblinks.php .

Nous voyons d’abord un contrôle de sécurité conçu pour garantir que personne ne peut appeler directement cette page. C'est le standard qui doit être utilisé dans tous vos fichiers php (à quelques exceptions près) :

Nous vérifions la chaîne de requête pour voir si un nom de contrôleur spécifique a été envoyé. Si tel est le cas, nous nous assurons de pouvoir charger le fichier requis dans le répertoire des contrôleurs :

// Nécessite un contrôleur spécifique si demandé if ($controller = JRequest:: getWord("controller" ) ) ( $path = JPATH_COMPONENT. DS. "controllers" . DS. $controller . ".php" ; if (file_exists ($path ) ) ( require_once $path ; ) else ( $controller = "" ; ) )

Nous instancions maintenant notre classe de contrôleur en utilisant le nom que nous avons défini ci-dessus :

Dès que la tâche est terminée, nous effectuons une redirection, si nécessaire :

// Redirection si défini par le contrôleur $controller -> redirect () ;
Classe de contrôleur

Le contrôleur générique (spécifique) du composant links est ici : .../components/com_weblinks/controller.php.
Cette classe entière définit une méthode d'affichage, qui est la méthode par défaut utilisée à moins que l'utilisateur ne spécifie une autre tâche.

défini ("_JEXEC" ) ou die ( "Accès restreint" ) ; jimport("joomla.application.component.controller" ) ; /** * Weblinks Component Controller * * @package Joomla * @subpackage Weblinks * @since 1.5 */ class WeblinksController extends JController ( /** * Méthode pour afficher une vue des liens Web * * @access public * @since 1.5 */ function display () ( // Définir une vue par défaut s'il n'en existe pas if ( ! JRequest:: getCmd ( "view") ) ( JRequest:: setVar ( "view" , "categories" ) ; ) // mettre à jour le nombre d'accès pour le lien Web if (JRequest:: getCmd ("view" ) == "weblink" ) ( $model =& $this -> getModel ("weblink" ) ; $model -> hit () ; ) // Afficher la logique de mise en cache -- simple ... sommes-nous connectés ? $user = & JFactory::getUser() ; $view = JRequest::getVar("view" ) ; $viewcache = JRequest::getVar("viewcache" , "1" , "POST " , "INT" ) ; if ($user -> get ("id" ) || ($view == "category" && $viewcache == 0 ) ) ( parent:: display (false) ; ) else ( parent :: affichage (vrai) ; ) ) )

Dans cette méthode, nous définissons la vue par défaut pour afficher les catégories, sauf si une autre vue a été transmise en tant que paramètre de chaîne de requête. Si la vue requise est un lien Web, nous incrémentons le compteur de vues du lien. Nous définissons ensuite la valeur de la variable view et appelons la méthode diplay de notre classe JController parent.
Il convient de prêter une attention particulière à l'appel à la méthode getModel. Il charge le modèle requis pour le composant. Dans cet exemple, cette méthode chargera le modèle de lien Web situé ici : .../components/com_weblinks/models/weblink.php.
Ici, nous sommes d'accord sur le fait que nous n'avons pas demandé certaine idée, et donc notre vue sera définie sur des catégories.
Ensuite, nous ouvrons la classe view.

Voir la classe

Puisque nous supposons que nous voulons une représentation de catégorie, c'est - fichier suivant qui sera exécuté : .../components/com_weblinks/views/categories/view.html.php

// Vérifiez que ce fichier est inclus dans Joomla! défini("_JEXEC") ou die("Accès restreint"); jimport( "joomla.application.component.view" ) ; /** * Classe HTML View pour le composant WebLinks * * @static * @package Joomla * @subpackage Weblinks * @since 1.0 */ class WeblinksViewCategories extends JView ( function display( $tpl = null ) ( global $mainframe ; $document = & JFactory:: getDocument() ; $categories =& $this -> get ("data" ) ; $total =& $this -> get ("total" ) ; $state =& $this -> get ("state " ) ; // Récupère la configuration de la page/du composant $params = & $mainframe -> getParams () ; $menus = & JSite:: getMenu () ; $menu = $menus -> getActive () ; // car l'application définit un titre de page par défaut, nous devons l'obtenir // directement à partir de l'élément de menu lui-même if (is_object ( $menu ) ) ( $menu_params = new JParameter( $menu -> params ) ; if (! $menu_params -> get ( "page_title" ) ) ( $params -> set ("page_title" , JText:: _( "Liens Web") ) ; ) ) else ( $params -> set ("page_title" , JText:: _( "Liens Web) " " ) ) ; ) $document -> setTitle ( $params -> get ( "page_title" ) ) ; // Définit certaines valeurs par défaut si elles ne sont pas définies pour les paramètres $params -> def ("comp_description" , JText:: _("WEBLINKS_DESC" ) ) ; // Définir les attributs des balises d'image if ($params -> get ("image" ) != - 1 ) ( if ($params -> get ("image_align" ) != "" ) $attribs [ "align" ] = $ params -> get ("image_align" ) ; else $attribs [ "align" ] = "" ; $attribs [ "hspace" ] = 6 ; // Utilisez la bibliothèque HTML statique pour créer la balise d'image $image = JHTML :: _("image" , "images/stories/" . $params -> get ("image" ) , JText:: _("Web Links" ) , $attribs ) ; ) pour ($i = 0 ; $i< count ($categories ) ; $i ++ ) { $category =& $categories [ $i ] ; $category ->link = JRoute:: _("index.php?option=com_weblinks&view=category&id=" . $category -> slug ) ; // Préparer la description de la catégorie $category -> description = JHTML:: _("content.prepare" , $category -> description ) ; ) $this -> assignRef ( "image" , $image ) ; $this -> assignRef ("params" , $params ) ; $this -> assignRef ("catégories" , $catégories ) ; parent :: display ($ tpl); ) ) ?>

Encore une fois, il s'agit d'une classe très simple avec une seule méthode d'affichage. La majeure partie de la logique ici est spécifique au composant de lien, mais si vous regardez attentivement, vous pouvez trouver des fonctionnalités utilisées dans la plupart des classes de vue de composant. A la fin de la méthode d'affichage, cette classe appelle la méthode d'affichage parent (JView), en lui transmettant le nom du modèle à afficher. Si le nom du modèle d'affichage n'est pas transmis, le modèle "par défaut" est utilisé.
Et enfin, nous ouvrons la classe modèle.

Classe de modèle

Admettons qu'un nom de modèle spécifique n'a pas été transmis, le modèle par défaut sera donc utilisé. Dans ce cas, le fichier suivant sera considéré : .../components/com_weblinks/views/categories/tmpl/default.php
-> escape ($this -> params -> get ("page_title" ) ) ; ?>

  • ( )

Une grande partie de la logique ici est spécifique au composant en cours d'exécution. Vous pouvez également voir dans le code que ce fichier contient tout du HTML mélangé à du PHP - ce sont ses fonctionnalités et son objectif.

Autres fichiers utilisés dans les composants

Plusieurs autres types de fichiers que vous pouvez trouver dans les composants :

  • Helpers - les composants utilisent souvent un fichier helper.php ou un répertoire helpers avec de nombreux fichiers. Ces fichiers ne contiennent généralement que des informations générales Fonctionnalité pour le composant.
  • Les ressources semblent être un dossier fourre-tout pour les autres fichiers inclus dans le composant.
  • router.php - ce fichier est utilisé, lorsque le paramètre URL SEF est activé, pour traduire l'URL dans les deux sens (en une URL lisible par l'homme avec des alias et dans la vue système Joomla avec des paramètres).
  • fichiers xml - ils définissent généralement les paramètres et d'autres informations sur le composant et sa présentation. Ils sont utilisés, par exemple, lors de la création d'éléments de menu de composants.
  • index.html - bonnes pratiques avoir un fichier index.html vide dans tous vos répertoires. Il s’agit d’une mesure de sécurité tellement passive.
  • css/images/js - Dossiers contenant divers fichiers pour implémenter la conception et les fonctionnalités côté client (dans le navigateur).

Il y a une suggestion dans le fichier /includes/joomla.php de la fonction cleanText pour remplacer la ligne

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

Ce hack est destiné uniquement aux images insérées comme images normales. Pour les images insérées par un mambot (mosimage), ce hack ne fonctionnera pas.

Comment faire apparaître un lien direct dans le composant com_weblinks

Dans weblinks.html.php, vous devez remplacer la ligne :

$link = sefRelToAbs( "index.php?option=com_weblinks&task=view&catid=" . $catid ."&id=" . $row ->id ) ; $lien = $ligne ->url ; Comment faire fonctionner Joomla sur deux hôtes (domaines) en même temps. Ceux. par exemple, dans réseau local au 10.0.0.15 et depuis le site Internet-firmy.ru. Malgré le fait que les deux adresses sont attribuées à la même machine.

Premièrement, tout l'intérêt du problème est que Joomla affiche toutes les images et fichiers CSS (leurs chemins dans le modèle) par rapport à sa variable $mosConfig_live_site - l'adresse de base du site saisie lors de l'installation. Et si quelqu'un essaie d'y accéder avec une adresse différente, rien dans la logique de son fonctionnement ne change - l'adresse de base est extraite du fichier de configuration. Par exemple, si la configuration indique que Joomla est situé sur localhost, alors l'accès depuis le réseau local, même à un Apache correctement configuré écoutant l'adresse 192.168.0.1, n'y changera rien - le src des images commencera quand même avec "localhost", qui pour les autres machines aura déjà son propre localhost. L'objectif des solutions pour de tels cas est de remplacer la variable $mosConfig_live_site pour l'hôte demandé, afin que toutes les fonctions puissent émettre les liens corrects et déjà amener l'utilisateur à soit l'un ou l'autre site virtuel (donnez les chemins de base corrects vers les images et les chemins de base vers les adresses). Il existe un mambot de site en direct automatique qui peut automatiser cela. Si cela ne vous convient pas d'une manière ou d'une autre, alors en principe, cela peut être répété , pour cela, dans configuration.php à la place de la définition $mosConfig_live_site, vous devez écrire votre code quelque chose comme :

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

Il faut faire attention au fait que si vous utilisez un cache, vous devez également avoir deux répertoires de mise en cache différents pour deux hôtes, car des liens vers différents hôtes peuvent se croiser dans le cache, et alors un utilisateur du mauvais réseau n'ira nulle part du tout. . La variable $mosConfig_cachepath est responsable du cache.

Comment faire apparaître deux composants simultanément sur une seule page

Je vais vous le dire tout de suite : tout n'est pas si simple. Ce n'est pas un module, après tout. Par conséquent, il convient tout d’abord de rechercher une alternative, c’est-à-dire Un composant populaire est sûrement livré avec des modules capables de reproduire ses fonctionnalités. S’il n’y a rien de tel, c’est une option. Il peut être réalisé sous forme de module ou, en théorie, il peut être inséré dans un modèle. L'idée est la suivante : appeler le composant via index2.php (quoi et pourquoi - lire l'intégralité du fait). Ceux. vous pouvez créer une iframe avec src="index2.php?option=com_component&no_html=1" au point d'insertion souhaité pour le deuxième composant. Et il y sera affiché. Une autre chose est qu'il est peu probable qu'il soit possible d'assurer pleinement la fonctionnalité. Mais néanmoins, c'est une issue.

Ou utilisez la construction : mosLoadComponent("com_mycomp" ) ;

Mais, si le composant est exécuté de cette manière, alors vous devez comprendre qu'il ne connaît pas vos manipulations et fonctionnera selon ses $option et $task.

Comment augmenter la longueur du titre dans un article

Vous devez exécuter les deux commandes suivantes dans phpMyAdmin (il existe une page spéciale pour exécuter des requêtes SQL), remplacez simplement ###_ par votre vrai préfixe de table. Le nombre maximum possible est de 255. Dans l’exemple, 200 est utilisé.

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

Comment inclure des textes d'actualité complets dans votre flux RSS, pas seulement leurs titres

Pour cela, dans le fichier /components/com_rss/rss.php, vous devez remplacer

$item_description = $row ->introtext ; $item_description = $row ->fulltext ; Comment créer deux sites Joomla en utilisant la même base de données ou en utilisant les mêmes fichiers ?

Quant à l'utilisation d'une base de données, vous devez écrire une base de données dans configuration.php pour deux moteurs, mais vous devez comprendre ce que vous faites. Car dans ce cas, maintenir les sessions des utilisateurs sera très problématique, car les domaines sont différents. Ceux. les entrées de connexion dans la table #__sessions se chevaucheront (pourront).

Si vous souhaitez utiliser les mêmes fichiers sans copier une grande distribution, vous pouvez en principe utiliser la commande « ln -s » sous Linux pour créer des liens symboliques vers des fichiers existants et ne pas les copier pour le nouveau site.

Comment créer une page virtuelle accessible à une adresse spécifique dans conception générale Joomla (http://site.ru/super_page)
  • La première consiste à utiliser une sorte de composant SEF, dans lequel vous spécifiez le chemin virtuel souhaité pour une page statique. Il y a un inconvénient ici - ce composant commencera à refaire tous les autres liens (et en général, ces composants sont très gourmands en énergie et nécessitent beaucoup de ressources pour fonctionner).
  • Créez un alias pour une telle page en utilisant mod_rewrite et .htaccess. Pour ce faire, vous avez besoin de :
    • Créez une page statique avec le texte dont vous avez besoin, découvrez son identifiant et son adresse (il n'est pas nécessaire de créer une telle page, elle peut déjà exister et en général il s'agit de n'importe quel composant, pas nécessairement com_content)
    • Trouvez un alias, que ce soit "super_puper"
    • Ouvrez .htaccess et avant la ligne "RewriteCond %(REQUEST_FILENAME) !-f" écrivez :
RewriteRule ^(super_puper) index.php?option=com_content&task=view&id=12 RewriteCond %(REQUEST_FILENAME) !-f
    • Et maintenant, à condition que Joomla se trouve sur site.ru, lorsque vous ouvrez le lien http://site.ru/super_puper, la page statique requise avec vos informations s'ouvrira. Le lien lui-même "index.php?option=com_content&task=view&id=12" peut être ce dont vous avez besoin, l'essentiel est que le lien ne soit pas absolu (c'est-à-dire avec http:/ /...) mais relatif (doit commencer par index .php ?...)
Comment désactiver la mise en cache pour un article spécifique

Cela peut être nécessaire si vous utilisez le mambot rd_addphp pour insérer des scripts devant générer des nombres aléatoires ou du texte aléatoire à chaque fois, quel que soit le système de mise en cache de Joomla. Pour désactiver la mise en cache d'un certain élément, vous devez connaître son identifiant (dans le panneau d'administration, lors de l'édition, regardez barre d'adresse, quelque chose comme "...&id=123..." y sera indiqué. Donc 123 sera notre identifiant d’article. Il faut remplacer dans le fichier /components/com_content/content.php environ à la ligne 1600

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

Où 123 est l’ID d’article dont vous avez besoin.

J'ai installé beaucoup de composants, mais la liste des composants dans le menu administrateur en affiche un nombre réduit, puis il est indiqué « Plus de composants... ». Comment afficher tous les composants.

Il vous faut une ligne dans le fichier /administrator/modules/mod_fullmenu.php

$topLevelLimit = 19 ;

remplacé par

$topLevelLimit = 199 ; Comment installer une copie d'un composant

Il faut dire que la tâche est extrêmement difficile. Si vous ne comprenez pas comment fonctionne le composant, vous ne devriez même pas essayer. Pour ceux qui souhaitent quand même noter les points principaux :

  • Dans le fichier XML, renommez le nom du composant dans la balise name
  • Ensuite, vous devez renommer les tables utilisées (d'abord dans le fichier XML, et ensuite dans tous les fichiers de composants, partout où l'objet de base de données $database et la méthode setQuery sont utilisés)
  • Renommez également tous les chemins dans les composants. Les chemins peuvent être utilisés dans des références à lui-même ou dans les noms des fichiers inclus. Le plus souvent, cela revient à rechercher la sous-chaîne com_componentname et à la remplacer par une nouvelle.

Mais cette méthode ne garantit rien. Avec les plus simples, cela est possible et cela passera, mais avec les plus complexes, personne ne peut le garantir.

Comment faire en sorte qu'une position affiche aléatoirement l'un des modules qui lui sont assignés
  • Option 1 - piratez la fonction mosLoadModules. Dans le template, à l'endroit où il faut afficher l'un des N modules, on écrit (attention au troisième argument) :
mosLoadModules("position", display_setup,true);

Et nous corrigeons légèrement la fonction ci-dessus elle-même :

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 () ; ) //ajouter ici if ($show_random && sizeof ($modules ) >0 ) ( $tmp = $modules [ rand (0 ,sizeof ($modules ) -1 ) ] ; $modules = array ($tmp ) ; ) //fin de l'instruction if (count ( $modules )< 1 ) { $style = 0 ; }

Nous y avons ajouté un troisième argument (qui est utilisé dans le modèle, où nous avons écrit true) et modifié le code.

  • La deuxième option est plus simple, nous modifions uniquement le modèle. Mais plus exigeant en main-d'œuvre, nous devons créer plusieurs postes. Tout d'abord, nous créons plusieurs nouvelles positions de module, par exemple new1 ... new10. Sauvegarder. Au bon endroit dans le template, avant d'appeler la fonction mosLoadModules, ajoutez le code nécessaire :
$rand_num = rand (1 ,10 ) ;//de 1 à 10 - comme dans le nom de position mosLoadModules ( "new" .$rand_num , display_settings) ; Je pense qu'en renommant le dossier /administrator/, je rendrai mon site plus sécurisé

Cette option n'est pas fournie en standard. Mais en fait, il est possible, en organisant une recherche dans les fichiers Joomla, de remplacer toute occurrence d'un tel mot par la vôtre - secret. Parfois, plus tard, des erreurs concernant l'impossibilité d'accéder aux fichiers peuvent apparaître, mais connaissant le fichier et le numéro de ligne, elles peuvent être corrigées. Le problème est donc, en principe, résoluble.

Le navigateur YRC Weblink est créé et distribué par la société de logiciels indienne YRC Group Inc. Et donc comme page d'accueil la valeur par défaut est Google indien :))

Les programmeurs indiens sont considérés comme l'un des plus cool au monde (après le russe et le chinois :), mais quelque chose n'a pas fonctionné pour eux avec ce navigateur, car c'est juste une sorte de vacances, pas un navigateur. Les idées qu'ils ont essayé de mettre en œuvre dans ce navigateur sont merveilleuses, mais la mise en œuvre elle-même est très mauvaise. Le navigateur fonctionne "à travers les fissures", c'est-à-dire étrangement et mauvais. Je l'ai essayé à deux différents ordinateurs- sous Windows 7 et sous Windows 8 - il y a tous deux des problèmes et des blocages.

Cependant, procédons dans l'ordre.

Après l'installation, le navigateur vous invite à sélectionner certains paramètres (comme, par exemple, dans la capture d'écran ci-dessus) et, en outre, à créer un compte pour la synchronisation dans le cloud et le stockage des paramètres, des signets, des notes et des fichiers.

Bonne idée! Je clique sur le lien d'inscription, qui signifie « S'inscrire », un site s'ouvre avec des images amusantes, mais pour une raison quelconque, il ne s'ouvre pas dans YRC Weblink, mais dans le navigateur installé par défaut sur l'ordinateur, et c'est le premier étrange chose. Une autre chose étrange est que vous devez saisir une grande partie de vos données - pourquoi ? Par exemple, dans le navigateur Maxthon, pour vous inscrire dans le cloud, il vous suffit de saisir votre email et votre mot de passe, ce qui est beaucoup plus simple, plus agréable et ne soulève pas de questions inutiles.

D'accord, je vais saisir toutes ces données. Je reçois un courrier pour confirmer mon compte, je clique sur le lien, mais le site me dit "Oups ! - Je ne trouve pas vos données dans la base de données". Mais ensuite une autre lettre arrive avec un nouveau lien, je clique sur le lien qu'elle contient et encore - Oups ! Cependant, au cours de ces oups, une troisième lettre arrive et dit : félicitations, votre compte a été confirmé ! Il s'agit d'une sorte de vérification de compte indien.

J'ouvre le navigateur, les paramètres et j'essaie d'importer des favoris. Le navigateur ne voit pas le fichier de signets au format .html, que tous les navigateurs que je connais voient, comprennent et acceptent sans problème. J'entre le nom du fichier manuellement, je clique sur Importer et j'obtiens un rapport : les favoris ont été importés avec succès !

Mais où ont-ils été importés avec succès ??? Ils ne sont ni dans le navigateur ni dans le cloud. Je répète l'opération et même résultat. Pas grave. Allons-nous en.

Dans le cloud et les paramètres, il existe un élément Notes. En me souvenant des notes du navigateur Maxthon, qui peuvent être créées à l'aide du bloc-notes intégré et qui sont automatiquement enregistrées dans le cloud, j'essaie de trouver quelque chose de similaire dans YRC Weblink, hélas, en vain. Il existe une vue pour les notes, mais il n'existe aucun outil pour les créer. Étrange? Et comment!

Bon ok. Voyons ce que nous avons d'autre. Lors de l'installation, le navigateur lui-même (sans demander) a installé deux raccourcis sur le bureau : un raccourci du navigateur (c'est normal) et un raccourci Twitter.

Cliquer sur ce raccourci ouvre une fenêtre de navigateur distincte avec Twitter. Pourquoi diable faire ça, et même par défaut ? Peut-être que je n'utilise pas Twitter du tout ? D'accord, j'ai supprimé le raccourci Twitter de mon bureau, mais pas de chance ! Désormais, lorsque vous cliquez sur le raccourci du navigateur (et non sur Twitter), le navigateur est mis en surbrillance avec Twitter dans la barre des tâches ! Je n'ai jamais vu un tel problème de vacances de ma vie !

À propos, à propos de ces trois fenêtres que vous voyez dans la capture d'écran ci-dessus. La fenêtre des paramètres de résumé se fige de temps en temps. De plus, il ne peut être désactivé qu'en désactivant le processus dans le Gestionnaire des tâches, il n'y a pas d'autre moyen. Et vous ne pouvez fermer la fenêtre de synchronisation qu'en vous déconnectant du système.

Si vous cliquez sur "Non", la fenêtre restera toujours ouverte. Malgré le fait que le navigateur lui-même, au contraire, s'éteint spontanément de temps en temps. Et ce qui est drôle : le navigateur s'éteint et la fenêtre Résumé est figée et fenêtre ouverte Il n'y a pas de synchronisation, ils se bloquent simplement sans propriétaire, abandonnés par le navigateur, jusqu'à ce que vous les désactiviez dans le Gestionnaire des tâches. Des bugs enchanteurs !

Mais on aurait tort de ne pas énumérer côtés positifs navigateur.

Tout d'abord, c'est le mode surf anonyme. Vous activez ce mode dans les paramètres et le navigateur n'utilise pas de cache, de cookies et n'enregistre pas votre historique de navigation. Il existe des navigateurs qui ne fonctionnent que dans ce mode, par exemple Browzar, ce qui est parfois nécessaire, mais généralement extrêmement gênant. Et la possibilité de se connecter et de désactiver rapidement ce mode est un gros plus pour le navigateur.

Deuxièmement, YRC Weblink a le choix moteur de recherche défaut. Il faut cependant choisir parmi une liste assez précise :

Cependant, l'adresse du moteur de recherche peut également être précisée manuellement en cliquant sur le bouton Définir nouveau (elle n'est pas visible sur la capture d'écran, elle se trouve sous la liste).

Eh bien, le dernier avantage, mais très significatif : YRC Weblink charge à peine le système ! À titre de comparaison, j'y ai ouvert 10 onglets et ouvert 10 onglets avec les mêmes adresses dans le navigateur Yandex (le leader parmi les navigateurs en matière de chargement du système) et c'est l'image que nous avons obtenue.

Navigateur Yandex :

Il n’est pas difficile de deviner que YRC Weblink dans ce sens est pratiquement sans égal, dans le bon sens.


RÉSUMÉ . Si toutes les idées que les créateurs ont essayé d'implémenter dans ce navigateur étaient correctement réalisées, cela n'aurait pas de prix, YRC Weblink pourrait prétendre être le meilleur, ou du moins l'un des meilleurs navigateurs. Mais avec les défauts qui y sont observés, il ne mérite même pas un « C ». Je lui donne une note de 3-.

Après le test, je désinstalle le navigateur - il n'est absolument pas nécessaire d'avoir un programme aussi buggé sur votre ordinateur. Eh bien, nous attendons d'autres mesures de la part de YRC Group Inc. Les programmeurs indiens seront-ils capables d'éliminer toutes les lacunes et de réellement publier version de travail navigateurs, honneur et louange à eux. S’ils échouent, il y aura un autre navigateur mort-né dans le monde.

Ce mois-ci, les chercheurs de bogues ne veulent pas nous gâter avec de nouveaux exploits très médiatisés dans des applications populaires. Bien entendu, de nombreux avis ont été publiés dans des produits d'entreprises renommées, mais très peu d'entre eux contiennent des codes PoC lisibles. Dans notre revue, j’ai essayé de rassembler les vulnérabilités les plus importantes et les plus complètes décrites récemment, alors asseyez-vous et bonne lecture.

Vulnérabilité PHP lors du traitement des requêtes HTTP Head

Le 3 mars, un certain Adam Ivanyuk découvre fonctionnalité intéressante dans l'interpréteur PHP, qui ne traite pas assez correctement les requêtes HEAD. Le chercheur a appelé cette vulnérabilité « astuce de la méthode HTTP HEAD dans les scripts php ».

De nombreux codeurs conçoivent leurs scripts PHP en espérant que toutes les instructions qui y sont écrites s'exécuteront avec succès sans rupture quelque part au milieu (en particulier dans les scripts courts). C'est ce qui se produit si le script est demandé par l'utilisateur final à l'aide des méthodes GET, POST, PUT.

Mais sachez qu'il existe d'autres méthodes HTTP, par exemple HEAD. C’est justement lors du traitement de cette méthode en PHP qu’une faille de sécurité peut survenir.

Regardons l'une des sources de l'interpréteur : ./main/SAPI.c, ligne 315 :

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

Lorsqu'une donnée arrive, la fonction php_ub_body_write est exécutée. Ensuite, regardez main/output.c, ligne 699 :

si (SG(request_info).headers_only) (
si(SG(headers_sent))
{
renvoie 0 ;
}
php_header(TSRMLS_C);
zend_bailout();
}

Ici vous pouvez voir que la première fois qu'il est imprimé à l'écran et lors de l'utilisation de la méthode HEAD, la fonction zend_bailout interrompt le script.

Exploiter

Accédons maintenant à ce script en utilisant la méthode HEAD :

Comme vous vous en doutez, notre Livre d'or arrêtera son exécution à la ligne « echo $data; », ainsi le fichier book.txt sera simplement remis à zéro.
Cet exemple est de nature plutôt destructrice. Dans le deuxième exemple, nous pouvons contourner l'autorisation dans le panneau d'administration primitif :

Dans ce script, lors de la connexion à l'aide des méthodes habituelles, une variable administrative est définie dans la session. Ensuite, si l'utilisateur saisit un mot de passe incorrect, cette variable est réinitialisée et l'utilisateur ne devient pas administrateur.

Si nous accédons au panneau d'administration via HEAD, son exécution sera interrompue au niveau du morceau de code avec « echo », donc la variable administrative ne sera pas réinitialisée et nous pourrons nous promener en toute sécurité dans la partie fermée de l'application. La chose à garder à l'esprit ici est que la plupart des serveurs Web ont une valeur de mise en mémoire tampon de sortie définie sur 4 096 octets. Ainsi, dans un exemple fonctionnel, nous pourrions avoir besoin de la chaîne "Une longue chaîne contient environ 4 090 caractères".

Exploiter
  • PHP

    Ici, le tableau $check contient nos données POST et la variable $locked est une chaîne sérialisée obscurcie à l'aide de la fonction str_rot13(), qui est entièrement sous notre contrôle.

    À ce stade, cela vaut la peine de faire une petite parenthèse pour ceux qui n’ont pas lu les articles correspondants dans ][, et de parler brièvement du bug qui se manifeste dans les méthodes magiques de PHP. Ainsi, dans PHP version 5, le concept de base de la programmation POO est apparu : constructeur et destructeur. Un constructeur est implémenté à l'aide de la méthode "__construct" et un destructeur est implémenté à l'aide de la méthode "__destruct". Une fois son travail terminé et lorsqu'il est appelé via la fonction unserialize(), chaque objet exécute sa propre méthode __ destruct, si elle est écrite dans le code.

    Revenons maintenant à notre framework et regardons le destructeur de classe App à partir du fichier ./libs/configure.php :

    fonction __destruct()
    {
    si ($this->__cache)
    {
    $core = App::core("gâteau");
    unset($this->__paths);
    Cache::write("dir_map", array_fi lter ($this->__paths),
    "gâteau_core");
    Cache::write("fi le_map", array_fi lter($this->__map),
    "gâteau_core");
    Cache::write("object_map", $this->__objects,
    "gâteau_core");
    }
    }

    À partir du code ci-dessus, vous pouvez voir que cette méthode peut être compromise en écrivant des valeurs arbitraires dans l'objet Cache. La clé la plus intéressante à cracker est 'file_map'. Il gère les connexions entre les classes et les fichiers PHP correspondants, et est également utilisé pour charger des classes supplémentaires lors de l'exécution du script.

    Le code réel pour charger les classes est un peu plus complexe, mais tout se résume au code suivant de la méthode __load à l'intérieur de la classe App :

    Bingo ! En remplaçant la variable $file, nous pouvons inclure notre propre code PHP ! De plus, ce sera un véritable bug d'inclusion de fichiers à distance - nous n'aurons donc pas besoin d'astuces supplémentaires pour télécharger des fichiers locaux sur le serveur. Cependant, l'auteur de la vulnérabilité trouvée propose une option LFI pour exploiter cette faille, car CakePHP utilise un cache local basé sur des fichiers, qui se trouve sous forme sérialisée dans un répertoire connu de l'attaquant.

    Exploiter

    En tant que petit PoC pour générer une chaîne sérialisée toxique, felix propose le code suivant :

    Bien sûr, vous devez d’abord inclure les classes nécessaires de CakePHP. Il existe également un exploit Python entièrement fonctionnel, que vous pouvez trouver sur malloc.im/burnedcake.py.

    Cet exploit devrait fonctionner dans toutes les applications construites sur CakePHP, utilisant des formulaires POST avec des jetons de sécurité, et dans lesquelles l'emplacement standard des fichiers cache n'a pas été modifié. Par défaut, l'exploit affiche la configuration de la base de données ; d'autres fonctionnalités utiles peuvent être facilement ajoutées en modifiant la charge utile PHP intégrée.

    Cibles
    • 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");
      // Nous devons obtenir une liste de tous
      // liens web dans la catégorie donnée
      $requête = "SELECT *" .
      "DE #__liens Web" .
      "OÙ catid = ". (int) $this->_id.
      "ET publié = 1" .
      "ET archivé = 0".
      "COMMANDÉ PAR". $fi lter_order "".
      $fi lter_order_dir .", commande";
      retourner $requête ;
      }

      Ici, vous pouvez voir que les variables $filter_order et $filter_order_dir ne réussissent pas le contrôle de correspondance strict Instructions SQL, la vérification s'effectue uniquement à l'aide de la méthode clean standard de la classe JFilterInput :

      On colle ce code n'importe où sur le site, qui affiche 5 liens aléatoires de la base de données et une ancre aléatoire. Il est préférable de diluer les ancres plutôt que d'en écrire une seule dans le lien. À liaison compétente sur le site, vous constaterez immédiatement une augmentation du trafic et une amélioration des autres indicateurs du site.

      J’attends avec impatience vos questions dans les commentaires de cet article.

      Date de publication : 03 mars 2014
        Avis et commentaires :

        Dmitri :
        Merci pour le script, je vais le mettre en œuvre. Il est impossible de copier le code source du site, il n'est copié que par petits fragments, il serait plus pratique dans son intégralité.

        Kirill :
        Merci pour la note sur la copie, je viens de la voir maintenant, j'essaierai de la réparer bientôt.

        Alexeï Pavlov :
        Erreur dans la ligne $tex = éclater(":",$sendlist[$count] Vous avez besoin d'un point-virgule, pas de deux-points. J'ai un peu modifié le code pour le rendre plus clair :