<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://jvflux.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexandre</id>
	<title>JVFlux - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://jvflux.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexandre"/>
	<link rel="alternate" type="text/html" href="https://jvflux.fr/Sp%C3%A9cial:Contributions/Alexandre"/>
	<updated>2026-04-11T02:52:41Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://jvflux.fr/index.php?title=Fonctionnement_technique_de_Jeuxvideo.com&amp;diff=158246</id>
		<title>Fonctionnement technique de Jeuxvideo.com</title>
		<link rel="alternate" type="text/html" href="https://jvflux.fr/index.php?title=Fonctionnement_technique_de_Jeuxvideo.com&amp;diff=158246"/>
		<updated>2024-11-22T22:30:27Z</updated>

		<summary type="html">&lt;p&gt;Alexandre : JvCare Python liste en compréhension&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Bannière Info|Contenu=Co-rédacteur de l&#039;[[API|article sur l&#039;API de JVC]], j&#039;aurais besoin de l&#039;aide d&#039;un khey calé sur l&#039;API de JVC et/ou le fonctionnement technique de jeuxvideo.com. J&#039;ai plusieurs questions à poser en vue de la réalisation d&#039;un projet informatique. (Edwado si tu passes par là…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merci de me contacter sur JVC (pseudo &#039;&#039;&#039;ContrapunctusI&#039;&#039;&#039;{{CDV|Pseudo=ContrapunctusI}}). Toute aide sera appréciée.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[Jeuxvideo.com]] utilise 2 serveurs frontaux qui sont depuis le 7 mai 2022 protégés par le service [https://cloudflare.com Cloudflare]. Chaque serveur frontal utilise un serveur HTTP Apache, tout ce qu&#039;il y a de plus classique. En revanche, avant d&#039;arriver sur le serveur Apache, on a plusieurs mailles dans la chaîne. En effet, lorsque vous faites une requête auprès de JVC, la chaîne suivante est effectuée avant d&#039;arriver jusqu&#039;au back-end :&lt;br /&gt;
 Cloudflare → Round-robin entre les 2 serveurs frontaux → HAProxy → Varnish → Apache → PHP / Express (Node.js)&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;une requête HTTP ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cloudflare&#039;&#039;&#039; est le premier point d&#039;entrée pour accéder à JVC. Il gère les enregistrements DNS du site et ses IPs sont majoritairement aléatoires et anycastées/géocastées. Ce service touche la couche réseau/transport tout comme la couche applicative du modèle OSI : il fait office d&#039;anti-DDoS à forte valeur (bien que JVC utilise le service &amp;quot;Volterra&amp;quot; en tant qu&#039;anti-DDoS sur couches basses du côté des IPs de son AS 35717). Une partie de la couche applicative est protégée par Cloudflare, via des règles éditées manuellement par [[Webedia]] (entre autre, blocages de pools IPv4 de VPN connus, et de certains pays d&#039;après certains retours d&#039;utilisateurs).&lt;br /&gt;
&lt;br /&gt;
Un round-robin est effectué via Cloudflare auprès des serveurs DNS de Webedia. Le but est de déterminer de façon algorithmique quel serveur frontal va être utilisé pour la requête HTTP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HAProxy&#039;&#039;&#039; est un proxy et load-balancer TCP d&#039;une efficacité remarquable, il est utilisé sur la totalité des environnements de production gérés par Webedia. C&#039;est entre autre ce service à l&#039;origine de l&#039;erreur 403 Forbidden. En effet, HAProxy fait aussi office de protection applicative (on peut donc en déduire que JVC utilise plusieurs services sur couche haute pour protéger l&#039;applicatif). On peut notamment remarquer le blacklistage des IPs du réseau &amp;quot;Tor&amp;quot;, mais également le blacklistage des pools de l&#039;AS 16276 (appartenant à la société OVH et n&#039;étant utilisé que dans des contextes d&#039;hébergement) - blocage mené suite à l&#039;utilisation massive des services de la société OVH dans le but de scrapper/attaquer JVC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Apache&#039;&#039;&#039; est un serveur HTTP. Il a été optimisé par l&#039;équipe technique actuelle de Webedia, mais également par l&#039;ancienne équipe du site (on peut notamment citer [[Dargor]] et [[Haazel]] en tant que personnes ayant participées à l&#039;élaboration de tunning du serveur HTTP).&lt;br /&gt;
&lt;br /&gt;
Le dernier point est selon la page qui est demandée. Des parties du site sont développées en PHP, et d&#039;autres en Node.js. Pour l&#039;anecdote, le site est hébergé côté serveur dans le dossier /opt/datas/sites/JEUXVIDEO.COM/&amp;lt;ref&amp;gt;La norme [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] n’incluait pas &amp;lt;code&amp;gt;/srv&amp;lt;/code&amp;gt;, qui est plus approprié, avant 2004.&amp;lt;/ref&amp;gt;. Il n&#039;y a quasiment aucune protection de ce côté (si ce n&#039;est une protection contre les IPs Tor).&lt;br /&gt;
&lt;br /&gt;
=== Protection applicative Cloudflare ===&lt;br /&gt;
&lt;br /&gt;
L&#039;applicatif est donc, comme on a pu le voir, protégé par Cloudflare en premier point d&#039;entrée. Cloudflare est binaire : si l&#039;IP source est blacklistée, une HTTP 403 est retournée et l&#039;accès à l&#039;URI est refusé.&amp;lt;br&amp;gt;Le blocage est en outre simple à bypasser, pour le moment, on peut constater que l&#039;usage d&#039;IPs géolocalisées en France est un bon bypass.&lt;br /&gt;
&lt;br /&gt;
=== Domaine de fichiers statiques ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;static.jvc.gg&#039;&#039;&#039; est notamment utilisé pour servir les feuilles de styles et scripts et utilise comme serveur &#039;&#039;&#039;nginx&#039;&#039;&#039; au lieu d&#039;Apache. N’étant pas protégé par Cloudflare en janvier 2023 il permet d’avoir un aperçu technique de comment était servi l’ensemble du site avant la mise en place de Cloudflare.&lt;br /&gt;
&lt;br /&gt;
Côté DNS, cinq serveurs de noms sont utilisés : ns1.webedia-group.org, ns2.webedia-group.net, ns3.webedia-group.com, ns4.webedia-group.biz, ns5.webedia-group.app. Les deux premiers sont sur leur AS 35717 ; les trois derniers sont respectivement hébergés chez Scaleway, OVH, Gandi.&lt;br /&gt;
&lt;br /&gt;
== Avant Respawn ==&lt;br /&gt;
&lt;br /&gt;
Avant [[Projet Respawn|Respawn]], JVC était développé sur plusieurs langages différents côté back-end : on peut citer le C et le PHP. La base de données finale utilisait le moteur de base de données PostgreSQL. L&#039;anarchie technique du back-end a menée au développement de [[Respawn]] (qui est également anarchique).&lt;br /&gt;
&lt;br /&gt;
=== Les Cartes de visite ===&lt;br /&gt;
&lt;br /&gt;
Les [[Carte de Visite|Cartes de visite]] étaient développés en PHP et avaient la particularité notable de stocker les données publiques de chaque utilisateur (par exemple, sa description personnelle) dans de simples fichiers HTML stockés sur disque : il n&#039;y avait pas de requête SQL d&#039;invoquée pour obtenir certaines données liées aux CDV. Lors de certains floods d&#039;avis utilisateurs (notamment menés par &#039;&#039;UnifiedLinux&#039;&#039;), les CDV retournaient aléatoirement des pages blanches. La cause est toujours inconnue.&lt;br /&gt;
&lt;br /&gt;
=== Les forums ===&lt;br /&gt;
&lt;br /&gt;
Les forums étaient en C, et [[Dargor]] les nommaient &amp;quot;modulaires&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Les articles ===&lt;br /&gt;
&lt;br /&gt;
Les articles n&#039;étaient pas mis en ligne immédiatement après leur rédaction. Un système de &amp;quot;compilation&amp;quot; était nécessaire et à effectuer manuellement afin que le site &amp;quot;compile&amp;quot; les articles pour qu&#039;ils deviennent accessibles au public. On peut imaginer que ce système de compilation a été développé dans un but de gestion de charge applicative.&lt;br /&gt;
&lt;br /&gt;
=== Modération ===&lt;br /&gt;
&lt;br /&gt;
La modération des forums était liée à une authentification à 2 étapes, menant à l&#039;attribution du cookie [[mocoedivxuejdom]] permettant la modération de certains forums selon les permissions attribuées à chaque modérateur. Cette deuxième étape était une page spéciale réclamant 5 mots de passe, qui avaient la particularité d&#039;être remplis de caractères aléatoires et spéciaux.&lt;br /&gt;
&lt;br /&gt;
=== Authentification ===&lt;br /&gt;
&lt;br /&gt;
Le cookie [[wenvjgol]] était utilisé pour l&#039;authentification.&lt;br /&gt;
&lt;br /&gt;
=== La recherche des forums ===&lt;br /&gt;
&lt;br /&gt;
La recherche des forums était connue pour être atrocement lente et affichant incorrectement la liste des résultats, des topics étaient manquants et s&#039;affichaient une fois sur deux.&lt;br /&gt;
&lt;br /&gt;
=== Sécurité informatique ===&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;une IP tentait d&#039;envoyer trop de requêtes HTTP (HTTPS n&#039;était pas déployé à ce moment-là), le site redirigeait chaque requête HTTP vers une erreur 404. La page d&#039;erreur 404 étant très peu consommatrice techniquement, cela permettait de désaturer la charge serveur en cas de DoS/DDoS.&lt;br /&gt;
&lt;br /&gt;
Sur les CDV et les forums, il y a eu un grand nombre de failles XSS, notamment exploitées en masse par [[PyjamaSam]].&lt;br /&gt;
&lt;br /&gt;
Le [[Captcha]] était également tout le temps cassé, permettant des floods de topics/messages/contributions. Cela a permis par exemple de créer un pseudo rang rubis en moins d&#039;un jour, dont le pseudo était &#039;&#039;RubyOne&#039;&#039; (par &#039;&#039;UnifiedLinux&#039;&#039;, qui a également créé un pseudo rang diamant en moins d&#039;un jour via un flood de contributions).&lt;br /&gt;
&lt;br /&gt;
== Respawn ==&lt;br /&gt;
&lt;br /&gt;
[[Respawn]] a été développé entièrement en PHP côté back-end. Il utilise notamment des frameworks tels que Symfony côté forums, et des moteurs de templates tel que Twig. Respawn semble être divisé techniquement en plusieurs parties : en effet, on peut constater que certaines parties du site respectent le modèle vue-contrôleur (on peut citer les forums), bien que d&#039;autres parties du site n&#039;utilisent pas ce modèle et utilisent de l&#039;url rewriting hardcodé dans des fichiers .htaccess. Respawn semble posséder une base de code identique entre JVC et [[ForumJV]] (désormais fermé), on pouvait constater de nettes interactions entre les 2 sites lorsque ForumJV était ouvert, interactions ayant menées à certains abus (ForumJV accordait des droits de modération sur son forum personnel, des failles de sécurité était donc existantes derrière ce privilège).&lt;br /&gt;
&lt;br /&gt;
=== Schéma de base de données ===&lt;br /&gt;
&lt;br /&gt;
Le schéma de base de données de Respawn semble anarchique et composé de mélange entre le Français et l&#039;Anglais. Exemples de tables appartenant à Respawn : &amp;quot;get_compte_infos&amp;quot;, &amp;quot;session_renew_v2&amp;quot;, &amp;quot;jeu_get_v7&amp;quot;. Notez le &amp;quot;v&amp;quot; à la fin de chaque table, laissant penser qu&#039;il existe plusieurs versions de celles-ci.&lt;br /&gt;
&lt;br /&gt;
==== Exemple d&#039;appel en base de données ====&lt;br /&gt;
 &#039;&#039;SELECT out_id_type, out_nom_type, out_dirname_type, out_affichage, out_date_publication, out_date_modification, out_id_alias_auteur, out_id_groupe_auteur, out_ip, out_titre, out_texte, out_commentaire, out_visibilite, out_liaisons, out_tags, out_medias, out_version, out_fiche, out_jeu, out_data, out_url, out_id_jeux FROM jeu_get_v7 WHERE id_contenu = xxx&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Organisation technique ===&lt;br /&gt;
&lt;br /&gt;
Comme dit précédemment, Respawn semble être un mélange de MVC et de code classique sans modèle particulier de respecté. Les fichiers du back-end sont également mitigés du côté de leur appellation, laissant encore droit au mélange entre Français et Anglais. Exemples de fichiers côté back-end :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/htdocs/forums/liste_topic.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/core/OiPDOStatement.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Transaction.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/GoogleTagManager.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Compte.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/controllers/forum/liste_topic.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Session.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/vendor/...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Nommage des fonctions ===&lt;br /&gt;
&lt;br /&gt;
Respawn possède aussi des fonctions dont le nommage est entre le Français et l&#039;Anglais. Exemples de fonctions côté back-end :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;getInfoFromIdForum&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;loadMenu&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;checkMenuItem&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;getSingleton&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;getHtmlJeuForum&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;blocHtmlBoutiqueRandom&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Optimisations ===&lt;br /&gt;
&lt;br /&gt;
Le back-end PHP utilise Memcache (https://www.php.net/manual/fr/book.memcache.php) afin de faire baisser la charge technique de l&#039;applicatif.&lt;br /&gt;
&lt;br /&gt;
=== Stockage des utilisateurs ===&lt;br /&gt;
&lt;br /&gt;
Depuis Respawn, les utilisateurs de JVC sont référencés sous un identifiant numérique côté base de données, contrairement au fonctionnement de l&#039;ancien JVC où les utilisateurs étaient référencés par leur pseudo (pouvant mener à des posts sur les forums avec des pseudos identiques organisés différemment côté minuscules/majuscules).&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;obtenir son ID via la page permettant d&#039;éditer votre profil, l&#039;ID est à la fin de l&#039;URL.&lt;br /&gt;
&lt;br /&gt;
=== Les forums ===&lt;br /&gt;
&lt;br /&gt;
Les posts des forums sont déclarés sur plusieurs serveurs différents. Les IDs de ceux-ci semblent aléatoires (bien qu&#039;un offset était attribué pour les posts présents sur ForumJV). Les IDs sont choisis selon l&#039;emplacement dans lequel la ressource sera stockée lors de la création du topic. Le choix de l&#039;emplacement se fait à la création du topic, les messages dans le topic sont alors stockés dans le même emplacement. Il semblerait qu&#039;il y ait 8 emplacements. ID + 8 pour accéder à la ressource suivante, et ID - 8 pour accéder à la ressource précédente.&lt;br /&gt;
&lt;br /&gt;
Exemple de messages séquentiels:&lt;br /&gt;
&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193382&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193390&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193398&lt;br /&gt;
&lt;br /&gt;
L&#039;ID est incrémenté de 8 à chaque fois. Tous ces messages sont répertoriés dans le 7ème serveur (&amp;lt;code&amp;gt;ID % 8&amp;lt;/code&amp;gt;, donc &amp;lt;code&amp;gt;905193382 % 8 = 6&amp;lt;/code&amp;gt;, 7ème).&lt;br /&gt;
&lt;br /&gt;
À noter toutefois que les messages datant d&#039;avant respawn sont complètement désordonnés, certainement dû à la migration durant respawn où la migration de ces messages a été effectué en parallèle.&lt;br /&gt;
&lt;br /&gt;
=== Modération ===&lt;br /&gt;
&lt;br /&gt;
La modération sur Respawn se nomme &amp;quot;Accès étendu&amp;quot;. L&#039;accès étendu peut être appelé via la page qui lui est dédiée : https://www.jeuxvideo.com/sso/auth.php ; il nécessite en revanche également un mot de passe, qui est envoyé via un lien sécurisé utilisable une seule fois par MP à chaque modérateur. A noter que le [[103]] est accessible à n&#039;importe quel modérateur même sans authentification à l&#039;accès étendu.&lt;br /&gt;
&lt;br /&gt;
=== Authentification ===&lt;br /&gt;
&lt;br /&gt;
Le cookie [[coniunctio]] est utilisé pour l&#039;authentification.&lt;br /&gt;
&lt;br /&gt;
=== Recherche des forums ===&lt;br /&gt;
&lt;br /&gt;
La recherche des forums utilise le moteur de recherche Sphinx qui est intégré au site. La recherche des forums est limitée à 1 mois sur les blablas, elle peut être contournée via https://jvarchive.com/.&lt;br /&gt;
&lt;br /&gt;
=== Sécurité informatique ===&lt;br /&gt;
&lt;br /&gt;
Dans les débuts de Respawn, le site était rempli de failles permettant de faire exploser la charge du site. Il existait également de nombreuses failles sur [[ForumJV]] qui permettaient de modérer sans être modérateur, sur n&#039;importe quel forum. Les failles ici citées ont en majorité été exploitées par [[edwado]].&lt;br /&gt;
&lt;br /&gt;
Il a également existé une faille RCE (Remote Code Execution) exploitée par [[Tsain]], qui permettait d&#039;injecter du CSS sur n&#039;importe quelle partie du site (la faille fut très mal exploitée étant-donné que celle-ci n&#039;était pas qu&#039;une simple injection CSS mais bien une RCE où il était possible d&#039;injecter un shell PHP).&lt;br /&gt;
&lt;br /&gt;
=== JvCare ===&lt;br /&gt;
&lt;br /&gt;
JvCare est un algorithme d&#039;obfuscation des liens externes postés sur le site. Il a été développé depuis Respawn. Il permet d&#039;éviter la création de backlinks qui pourraient optimiser indirectement le SEO de sites externes à Jeuxvideo.com.&lt;br /&gt;
&lt;br /&gt;
Les codes ci-après permettent de décoder une chaîne obfusquée.&lt;br /&gt;
&lt;br /&gt;
==== PHP ====&lt;br /&gt;
&lt;br /&gt;
 function jvCare(string $classe) : string {&lt;br /&gt;
   $base16 = &amp;quot;0A12B34C56D78E9F&amp;quot;;&#039;&#039;&lt;br /&gt;
   $lien = &amp;quot;&amp;quot;;&lt;br /&gt;
   $s = explode(&amp;quot; &amp;quot;, $classe)[1];&lt;br /&gt;
   for ($i = 0; $i &amp;lt;= strlen($s)-1; $i += 2) {&lt;br /&gt;
     $lien .= chr(strrpos($base16, $s[$i]) * 16 + strrpos($base16, $s[$i+1]));&lt;br /&gt;
   }&lt;br /&gt;
   return $lien;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== JavaScript ====&lt;br /&gt;
&lt;br /&gt;
 function jvCake(classe) {&lt;br /&gt;
   const base16 = &#039;0A12B34C56D78E9F&#039;;&lt;br /&gt;
   let lien = &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
   const s = classe.split(&#039; &#039;)[1];&lt;br /&gt;
   for (let i = 0; i &amp;lt; s.length; i += 2) {&lt;br /&gt;
     lien += String.fromCharCode(base16.indexOf(s.charAt(i)) * 16 + base16.indexOf(s.charAt(i + 1)));&lt;br /&gt;
   }&lt;br /&gt;
   return lien;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
 def jvcare(classe: str) -&amp;gt; str:&lt;br /&gt;
     base16 = &#039;0A12B34C56D78E9F&#039;&lt;br /&gt;
     s = classe.split()[1]&lt;br /&gt;
     url = &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     for i, j in zip(s[0::2], s[1::2]):&lt;br /&gt;
         url += chr(base16.index(i) * 16 + base16.index(j))&lt;br /&gt;
     return url&lt;br /&gt;
&lt;br /&gt;
====== Liste en compréhension ======&lt;br /&gt;
&lt;br /&gt;
 def jvcare(classe: str) -&amp;gt; str:&lt;br /&gt;
     base16 = &#039;0A12B34C56D78E9F&#039;&lt;br /&gt;
     s = classe.split()[1]&lt;br /&gt;
     return &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;.join([chr(base16.index(i) * 16 + base16.index(j)) for i, j in zip(s[0::2], s[1::2])])&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 const char *__jvcarebase16 = &amp;quot;0A12B34C56D78E9F&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 char *jvcare(const char *class) {&lt;br /&gt;
     char *s = strchr(class, &#039; &#039;) + 1;&lt;br /&gt;
 &lt;br /&gt;
     int urllen = strlen(s) / 2;&lt;br /&gt;
     char *url = malloc(urllen + 1);&lt;br /&gt;
     for (int i = 0; i &amp;lt; urllen; i++) {&lt;br /&gt;
         char pos1 = strchr(__jvcarebase16, s[i * 2]) - __jvcarebase16;&lt;br /&gt;
         char pos2 = strchr(__jvcarebase16, s[i * 2 + 1]) - __jvcarebase16;&lt;br /&gt;
         url[i] = pos1 * 16 + pos2;&lt;br /&gt;
     }&lt;br /&gt;
     url[urllen] = &#039;\0&#039;;&lt;br /&gt;
     return url;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Awk ====&lt;br /&gt;
&lt;br /&gt;
 BEGIN {&lt;br /&gt;
     base16 = &amp;quot;0A12B34C56D78E9F&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 {&lt;br /&gt;
     s = $2&lt;br /&gt;
     for (i = 1; i &amp;lt; length(s); i += 2) {&lt;br /&gt;
         pos1 = index(base16, substr(s, i, 1))&lt;br /&gt;
         pos2 = index(base16, substr(s, i + 1, 1))&lt;br /&gt;
         url = url sprintf(&amp;quot;%c&amp;quot;, (pos1 - 1) * 16 + pos2 - 1)&lt;br /&gt;
     }&lt;br /&gt;
     print url&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Phoenix ==&lt;br /&gt;
&lt;br /&gt;
Phoenix est une partie de JVC développée en Node.js et utilisant React. Elle semble de plus en plus abandonnée, et nous n&#039;avons pas beaucoup d&#039;informations à son sujet. Phoenix utilise une API spéciale hébergée au sous-domaine [[Documentation_de_l%27API_Jeuxvideo.com#API_jvc.gg|&#039;&#039;api.jvc.gg&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
== Liens externes ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml Interview sur l’architecture de jeuxvideo.com de 1997 à 2005] ([http://web.archive.org/web/20070629165914/http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml archive.org])&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Voir aussi ==&lt;br /&gt;
&lt;br /&gt;
* [[Documentation de l&#039;API Jeuxvideo.com]]&lt;br /&gt;
&lt;br /&gt;
{{SectionRéférences}}&lt;br /&gt;
{{TableauCatégorieFonctionnementJVC}}&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Fonctionnement technique de Jeuxvideo.com]]&lt;br /&gt;
[[Catégorie:Extensions et outils]]&lt;/div&gt;</summary>
		<author><name>Alexandre</name></author>
	</entry>
	<entry>
		<id>https://jvflux.fr/index.php?title=Fonctionnement_technique_de_Jeuxvideo.com&amp;diff=158245</id>
		<title>Fonctionnement technique de Jeuxvideo.com</title>
		<link rel="alternate" type="text/html" href="https://jvflux.fr/index.php?title=Fonctionnement_technique_de_Jeuxvideo.com&amp;diff=158245"/>
		<updated>2024-11-22T22:27:57Z</updated>

		<summary type="html">&lt;p&gt;Alexandre : JvCare Python : tabulations plus lisibles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Bannière Info|Contenu=Co-rédacteur de l&#039;[[API|article sur l&#039;API de JVC]], j&#039;aurais besoin de l&#039;aide d&#039;un khey calé sur l&#039;API de JVC et/ou le fonctionnement technique de jeuxvideo.com. J&#039;ai plusieurs questions à poser en vue de la réalisation d&#039;un projet informatique. (Edwado si tu passes par là…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merci de me contacter sur JVC (pseudo &#039;&#039;&#039;ContrapunctusI&#039;&#039;&#039;{{CDV|Pseudo=ContrapunctusI}}). Toute aide sera appréciée.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[Jeuxvideo.com]] utilise 2 serveurs frontaux qui sont depuis le 7 mai 2022 protégés par le service [https://cloudflare.com Cloudflare]. Chaque serveur frontal utilise un serveur HTTP Apache, tout ce qu&#039;il y a de plus classique. En revanche, avant d&#039;arriver sur le serveur Apache, on a plusieurs mailles dans la chaîne. En effet, lorsque vous faites une requête auprès de JVC, la chaîne suivante est effectuée avant d&#039;arriver jusqu&#039;au back-end :&lt;br /&gt;
 Cloudflare → Round-robin entre les 2 serveurs frontaux → HAProxy → Varnish → Apache → PHP / Express (Node.js)&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;une requête HTTP ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cloudflare&#039;&#039;&#039; est le premier point d&#039;entrée pour accéder à JVC. Il gère les enregistrements DNS du site et ses IPs sont majoritairement aléatoires et anycastées/géocastées. Ce service touche la couche réseau/transport tout comme la couche applicative du modèle OSI : il fait office d&#039;anti-DDoS à forte valeur (bien que JVC utilise le service &amp;quot;Volterra&amp;quot; en tant qu&#039;anti-DDoS sur couches basses du côté des IPs de son AS 35717). Une partie de la couche applicative est protégée par Cloudflare, via des règles éditées manuellement par [[Webedia]] (entre autre, blocages de pools IPv4 de VPN connus, et de certains pays d&#039;après certains retours d&#039;utilisateurs).&lt;br /&gt;
&lt;br /&gt;
Un round-robin est effectué via Cloudflare auprès des serveurs DNS de Webedia. Le but est de déterminer de façon algorithmique quel serveur frontal va être utilisé pour la requête HTTP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HAProxy&#039;&#039;&#039; est un proxy et load-balancer TCP d&#039;une efficacité remarquable, il est utilisé sur la totalité des environnements de production gérés par Webedia. C&#039;est entre autre ce service à l&#039;origine de l&#039;erreur 403 Forbidden. En effet, HAProxy fait aussi office de protection applicative (on peut donc en déduire que JVC utilise plusieurs services sur couche haute pour protéger l&#039;applicatif). On peut notamment remarquer le blacklistage des IPs du réseau &amp;quot;Tor&amp;quot;, mais également le blacklistage des pools de l&#039;AS 16276 (appartenant à la société OVH et n&#039;étant utilisé que dans des contextes d&#039;hébergement) - blocage mené suite à l&#039;utilisation massive des services de la société OVH dans le but de scrapper/attaquer JVC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Apache&#039;&#039;&#039; est un serveur HTTP. Il a été optimisé par l&#039;équipe technique actuelle de Webedia, mais également par l&#039;ancienne équipe du site (on peut notamment citer [[Dargor]] et [[Haazel]] en tant que personnes ayant participées à l&#039;élaboration de tunning du serveur HTTP).&lt;br /&gt;
&lt;br /&gt;
Le dernier point est selon la page qui est demandée. Des parties du site sont développées en PHP, et d&#039;autres en Node.js. Pour l&#039;anecdote, le site est hébergé côté serveur dans le dossier /opt/datas/sites/JEUXVIDEO.COM/&amp;lt;ref&amp;gt;La norme [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] n’incluait pas &amp;lt;code&amp;gt;/srv&amp;lt;/code&amp;gt;, qui est plus approprié, avant 2004.&amp;lt;/ref&amp;gt;. Il n&#039;y a quasiment aucune protection de ce côté (si ce n&#039;est une protection contre les IPs Tor).&lt;br /&gt;
&lt;br /&gt;
=== Protection applicative Cloudflare ===&lt;br /&gt;
&lt;br /&gt;
L&#039;applicatif est donc, comme on a pu le voir, protégé par Cloudflare en premier point d&#039;entrée. Cloudflare est binaire : si l&#039;IP source est blacklistée, une HTTP 403 est retournée et l&#039;accès à l&#039;URI est refusé.&amp;lt;br&amp;gt;Le blocage est en outre simple à bypasser, pour le moment, on peut constater que l&#039;usage d&#039;IPs géolocalisées en France est un bon bypass.&lt;br /&gt;
&lt;br /&gt;
=== Domaine de fichiers statiques ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;static.jvc.gg&#039;&#039;&#039; est notamment utilisé pour servir les feuilles de styles et scripts et utilise comme serveur &#039;&#039;&#039;nginx&#039;&#039;&#039; au lieu d&#039;Apache. N’étant pas protégé par Cloudflare en janvier 2023 il permet d’avoir un aperçu technique de comment était servi l’ensemble du site avant la mise en place de Cloudflare.&lt;br /&gt;
&lt;br /&gt;
Côté DNS, cinq serveurs de noms sont utilisés : ns1.webedia-group.org, ns2.webedia-group.net, ns3.webedia-group.com, ns4.webedia-group.biz, ns5.webedia-group.app. Les deux premiers sont sur leur AS 35717 ; les trois derniers sont respectivement hébergés chez Scaleway, OVH, Gandi.&lt;br /&gt;
&lt;br /&gt;
== Avant Respawn ==&lt;br /&gt;
&lt;br /&gt;
Avant [[Projet Respawn|Respawn]], JVC était développé sur plusieurs langages différents côté back-end : on peut citer le C et le PHP. La base de données finale utilisait le moteur de base de données PostgreSQL. L&#039;anarchie technique du back-end a menée au développement de [[Respawn]] (qui est également anarchique).&lt;br /&gt;
&lt;br /&gt;
=== Les Cartes de visite ===&lt;br /&gt;
&lt;br /&gt;
Les [[Carte de Visite|Cartes de visite]] étaient développés en PHP et avaient la particularité notable de stocker les données publiques de chaque utilisateur (par exemple, sa description personnelle) dans de simples fichiers HTML stockés sur disque : il n&#039;y avait pas de requête SQL d&#039;invoquée pour obtenir certaines données liées aux CDV. Lors de certains floods d&#039;avis utilisateurs (notamment menés par &#039;&#039;UnifiedLinux&#039;&#039;), les CDV retournaient aléatoirement des pages blanches. La cause est toujours inconnue.&lt;br /&gt;
&lt;br /&gt;
=== Les forums ===&lt;br /&gt;
&lt;br /&gt;
Les forums étaient en C, et [[Dargor]] les nommaient &amp;quot;modulaires&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Les articles ===&lt;br /&gt;
&lt;br /&gt;
Les articles n&#039;étaient pas mis en ligne immédiatement après leur rédaction. Un système de &amp;quot;compilation&amp;quot; était nécessaire et à effectuer manuellement afin que le site &amp;quot;compile&amp;quot; les articles pour qu&#039;ils deviennent accessibles au public. On peut imaginer que ce système de compilation a été développé dans un but de gestion de charge applicative.&lt;br /&gt;
&lt;br /&gt;
=== Modération ===&lt;br /&gt;
&lt;br /&gt;
La modération des forums était liée à une authentification à 2 étapes, menant à l&#039;attribution du cookie [[mocoedivxuejdom]] permettant la modération de certains forums selon les permissions attribuées à chaque modérateur. Cette deuxième étape était une page spéciale réclamant 5 mots de passe, qui avaient la particularité d&#039;être remplis de caractères aléatoires et spéciaux.&lt;br /&gt;
&lt;br /&gt;
=== Authentification ===&lt;br /&gt;
&lt;br /&gt;
Le cookie [[wenvjgol]] était utilisé pour l&#039;authentification.&lt;br /&gt;
&lt;br /&gt;
=== La recherche des forums ===&lt;br /&gt;
&lt;br /&gt;
La recherche des forums était connue pour être atrocement lente et affichant incorrectement la liste des résultats, des topics étaient manquants et s&#039;affichaient une fois sur deux.&lt;br /&gt;
&lt;br /&gt;
=== Sécurité informatique ===&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;une IP tentait d&#039;envoyer trop de requêtes HTTP (HTTPS n&#039;était pas déployé à ce moment-là), le site redirigeait chaque requête HTTP vers une erreur 404. La page d&#039;erreur 404 étant très peu consommatrice techniquement, cela permettait de désaturer la charge serveur en cas de DoS/DDoS.&lt;br /&gt;
&lt;br /&gt;
Sur les CDV et les forums, il y a eu un grand nombre de failles XSS, notamment exploitées en masse par [[PyjamaSam]].&lt;br /&gt;
&lt;br /&gt;
Le [[Captcha]] était également tout le temps cassé, permettant des floods de topics/messages/contributions. Cela a permis par exemple de créer un pseudo rang rubis en moins d&#039;un jour, dont le pseudo était &#039;&#039;RubyOne&#039;&#039; (par &#039;&#039;UnifiedLinux&#039;&#039;, qui a également créé un pseudo rang diamant en moins d&#039;un jour via un flood de contributions).&lt;br /&gt;
&lt;br /&gt;
== Respawn ==&lt;br /&gt;
&lt;br /&gt;
[[Respawn]] a été développé entièrement en PHP côté back-end. Il utilise notamment des frameworks tels que Symfony côté forums, et des moteurs de templates tel que Twig. Respawn semble être divisé techniquement en plusieurs parties : en effet, on peut constater que certaines parties du site respectent le modèle vue-contrôleur (on peut citer les forums), bien que d&#039;autres parties du site n&#039;utilisent pas ce modèle et utilisent de l&#039;url rewriting hardcodé dans des fichiers .htaccess. Respawn semble posséder une base de code identique entre JVC et [[ForumJV]] (désormais fermé), on pouvait constater de nettes interactions entre les 2 sites lorsque ForumJV était ouvert, interactions ayant menées à certains abus (ForumJV accordait des droits de modération sur son forum personnel, des failles de sécurité était donc existantes derrière ce privilège).&lt;br /&gt;
&lt;br /&gt;
=== Schéma de base de données ===&lt;br /&gt;
&lt;br /&gt;
Le schéma de base de données de Respawn semble anarchique et composé de mélange entre le Français et l&#039;Anglais. Exemples de tables appartenant à Respawn : &amp;quot;get_compte_infos&amp;quot;, &amp;quot;session_renew_v2&amp;quot;, &amp;quot;jeu_get_v7&amp;quot;. Notez le &amp;quot;v&amp;quot; à la fin de chaque table, laissant penser qu&#039;il existe plusieurs versions de celles-ci.&lt;br /&gt;
&lt;br /&gt;
==== Exemple d&#039;appel en base de données ====&lt;br /&gt;
 &#039;&#039;SELECT out_id_type, out_nom_type, out_dirname_type, out_affichage, out_date_publication, out_date_modification, out_id_alias_auteur, out_id_groupe_auteur, out_ip, out_titre, out_texte, out_commentaire, out_visibilite, out_liaisons, out_tags, out_medias, out_version, out_fiche, out_jeu, out_data, out_url, out_id_jeux FROM jeu_get_v7 WHERE id_contenu = xxx&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Organisation technique ===&lt;br /&gt;
&lt;br /&gt;
Comme dit précédemment, Respawn semble être un mélange de MVC et de code classique sans modèle particulier de respecté. Les fichiers du back-end sont également mitigés du côté de leur appellation, laissant encore droit au mélange entre Français et Anglais. Exemples de fichiers côté back-end :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/htdocs/forums/liste_topic.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/core/OiPDOStatement.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Transaction.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/GoogleTagManager.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Compte.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/controllers/forum/liste_topic.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Session.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/vendor/...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Nommage des fonctions ===&lt;br /&gt;
&lt;br /&gt;
Respawn possède aussi des fonctions dont le nommage est entre le Français et l&#039;Anglais. Exemples de fonctions côté back-end :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;getInfoFromIdForum&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;loadMenu&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;checkMenuItem&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;getSingleton&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;getHtmlJeuForum&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;blocHtmlBoutiqueRandom&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Optimisations ===&lt;br /&gt;
&lt;br /&gt;
Le back-end PHP utilise Memcache (https://www.php.net/manual/fr/book.memcache.php) afin de faire baisser la charge technique de l&#039;applicatif.&lt;br /&gt;
&lt;br /&gt;
=== Stockage des utilisateurs ===&lt;br /&gt;
&lt;br /&gt;
Depuis Respawn, les utilisateurs de JVC sont référencés sous un identifiant numérique côté base de données, contrairement au fonctionnement de l&#039;ancien JVC où les utilisateurs étaient référencés par leur pseudo (pouvant mener à des posts sur les forums avec des pseudos identiques organisés différemment côté minuscules/majuscules).&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;obtenir son ID via la page permettant d&#039;éditer votre profil, l&#039;ID est à la fin de l&#039;URL.&lt;br /&gt;
&lt;br /&gt;
=== Les forums ===&lt;br /&gt;
&lt;br /&gt;
Les posts des forums sont déclarés sur plusieurs serveurs différents. Les IDs de ceux-ci semblent aléatoires (bien qu&#039;un offset était attribué pour les posts présents sur ForumJV). Les IDs sont choisis selon l&#039;emplacement dans lequel la ressource sera stockée lors de la création du topic. Le choix de l&#039;emplacement se fait à la création du topic, les messages dans le topic sont alors stockés dans le même emplacement. Il semblerait qu&#039;il y ait 8 emplacements. ID + 8 pour accéder à la ressource suivante, et ID - 8 pour accéder à la ressource précédente.&lt;br /&gt;
&lt;br /&gt;
Exemple de messages séquentiels:&lt;br /&gt;
&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193382&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193390&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193398&lt;br /&gt;
&lt;br /&gt;
L&#039;ID est incrémenté de 8 à chaque fois. Tous ces messages sont répertoriés dans le 7ème serveur (&amp;lt;code&amp;gt;ID % 8&amp;lt;/code&amp;gt;, donc &amp;lt;code&amp;gt;905193382 % 8 = 6&amp;lt;/code&amp;gt;, 7ème).&lt;br /&gt;
&lt;br /&gt;
À noter toutefois que les messages datant d&#039;avant respawn sont complètement désordonnés, certainement dû à la migration durant respawn où la migration de ces messages a été effectué en parallèle.&lt;br /&gt;
&lt;br /&gt;
=== Modération ===&lt;br /&gt;
&lt;br /&gt;
La modération sur Respawn se nomme &amp;quot;Accès étendu&amp;quot;. L&#039;accès étendu peut être appelé via la page qui lui est dédiée : https://www.jeuxvideo.com/sso/auth.php ; il nécessite en revanche également un mot de passe, qui est envoyé via un lien sécurisé utilisable une seule fois par MP à chaque modérateur. A noter que le [[103]] est accessible à n&#039;importe quel modérateur même sans authentification à l&#039;accès étendu.&lt;br /&gt;
&lt;br /&gt;
=== Authentification ===&lt;br /&gt;
&lt;br /&gt;
Le cookie [[coniunctio]] est utilisé pour l&#039;authentification.&lt;br /&gt;
&lt;br /&gt;
=== Recherche des forums ===&lt;br /&gt;
&lt;br /&gt;
La recherche des forums utilise le moteur de recherche Sphinx qui est intégré au site. La recherche des forums est limitée à 1 mois sur les blablas, elle peut être contournée via https://jvarchive.com/.&lt;br /&gt;
&lt;br /&gt;
=== Sécurité informatique ===&lt;br /&gt;
&lt;br /&gt;
Dans les débuts de Respawn, le site était rempli de failles permettant de faire exploser la charge du site. Il existait également de nombreuses failles sur [[ForumJV]] qui permettaient de modérer sans être modérateur, sur n&#039;importe quel forum. Les failles ici citées ont en majorité été exploitées par [[edwado]].&lt;br /&gt;
&lt;br /&gt;
Il a également existé une faille RCE (Remote Code Execution) exploitée par [[Tsain]], qui permettait d&#039;injecter du CSS sur n&#039;importe quelle partie du site (la faille fut très mal exploitée étant-donné que celle-ci n&#039;était pas qu&#039;une simple injection CSS mais bien une RCE où il était possible d&#039;injecter un shell PHP).&lt;br /&gt;
&lt;br /&gt;
=== JvCare ===&lt;br /&gt;
&lt;br /&gt;
JvCare est un algorithme d&#039;obfuscation des liens externes postés sur le site. Il a été développé depuis Respawn. Il permet d&#039;éviter la création de backlinks qui pourraient optimiser indirectement le SEO de sites externes à Jeuxvideo.com.&lt;br /&gt;
&lt;br /&gt;
Les codes ci-après permettent de décoder une chaîne obfusquée.&lt;br /&gt;
&lt;br /&gt;
==== PHP ====&lt;br /&gt;
&lt;br /&gt;
 function jvCare(string $classe) : string {&lt;br /&gt;
   $base16 = &amp;quot;0A12B34C56D78E9F&amp;quot;;&#039;&#039;&lt;br /&gt;
   $lien = &amp;quot;&amp;quot;;&lt;br /&gt;
   $s = explode(&amp;quot; &amp;quot;, $classe)[1];&lt;br /&gt;
   for ($i = 0; $i &amp;lt;= strlen($s)-1; $i += 2) {&lt;br /&gt;
     $lien .= chr(strrpos($base16, $s[$i]) * 16 + strrpos($base16, $s[$i+1]));&lt;br /&gt;
   }&lt;br /&gt;
   return $lien;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== JavaScript ====&lt;br /&gt;
&lt;br /&gt;
 function jvCake(classe) {&lt;br /&gt;
   const base16 = &#039;0A12B34C56D78E9F&#039;;&lt;br /&gt;
   let lien = &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
   const s = classe.split(&#039; &#039;)[1];&lt;br /&gt;
   for (let i = 0; i &amp;lt; s.length; i += 2) {&lt;br /&gt;
     lien += String.fromCharCode(base16.indexOf(s.charAt(i)) * 16 + base16.indexOf(s.charAt(i + 1)));&lt;br /&gt;
   }&lt;br /&gt;
   return lien;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
 def jvcare(classe: str) -&amp;gt; str:&lt;br /&gt;
     base16 = &#039;0A12B34C56D78E9F&#039;&lt;br /&gt;
     url = &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     s = classe.split()[1]&lt;br /&gt;
     for i, j in zip(s[0::2], s[1::2]):&lt;br /&gt;
         url += chr(base16.index(i) * 16 + base16.index(j))&lt;br /&gt;
     return url&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 const char *__jvcarebase16 = &amp;quot;0A12B34C56D78E9F&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 char *jvcare(const char *class) {&lt;br /&gt;
     char *s = strchr(class, &#039; &#039;) + 1;&lt;br /&gt;
 &lt;br /&gt;
     int urllen = strlen(s) / 2;&lt;br /&gt;
     char *url = malloc(urllen + 1);&lt;br /&gt;
     for (int i = 0; i &amp;lt; urllen; i++) {&lt;br /&gt;
         char pos1 = strchr(__jvcarebase16, s[i * 2]) - __jvcarebase16;&lt;br /&gt;
         char pos2 = strchr(__jvcarebase16, s[i * 2 + 1]) - __jvcarebase16;&lt;br /&gt;
         url[i] = pos1 * 16 + pos2;&lt;br /&gt;
     }&lt;br /&gt;
     url[urllen] = &#039;\0&#039;;&lt;br /&gt;
     return url;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Awk ====&lt;br /&gt;
&lt;br /&gt;
 BEGIN {&lt;br /&gt;
     base16 = &amp;quot;0A12B34C56D78E9F&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 {&lt;br /&gt;
     s = $2&lt;br /&gt;
     for (i = 1; i &amp;lt; length(s); i += 2) {&lt;br /&gt;
         pos1 = index(base16, substr(s, i, 1))&lt;br /&gt;
         pos2 = index(base16, substr(s, i + 1, 1))&lt;br /&gt;
         url = url sprintf(&amp;quot;%c&amp;quot;, (pos1 - 1) * 16 + pos2 - 1)&lt;br /&gt;
     }&lt;br /&gt;
     print url&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Phoenix ==&lt;br /&gt;
&lt;br /&gt;
Phoenix est une partie de JVC développée en Node.js et utilisant React. Elle semble de plus en plus abandonnée, et nous n&#039;avons pas beaucoup d&#039;informations à son sujet. Phoenix utilise une API spéciale hébergée au sous-domaine [[Documentation_de_l%27API_Jeuxvideo.com#API_jvc.gg|&#039;&#039;api.jvc.gg&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
== Liens externes ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml Interview sur l’architecture de jeuxvideo.com de 1997 à 2005] ([http://web.archive.org/web/20070629165914/http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml archive.org])&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Voir aussi ==&lt;br /&gt;
&lt;br /&gt;
* [[Documentation de l&#039;API Jeuxvideo.com]]&lt;br /&gt;
&lt;br /&gt;
{{SectionRéférences}}&lt;br /&gt;
{{TableauCatégorieFonctionnementJVC}}&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Fonctionnement technique de Jeuxvideo.com]]&lt;br /&gt;
[[Catégorie:Extensions et outils]]&lt;/div&gt;</summary>
		<author><name>Alexandre</name></author>
	</entry>
	<entry>
		<id>https://jvflux.fr/index.php?title=Fonctionnement_technique_de_Jeuxvideo.com&amp;diff=158244</id>
		<title>Fonctionnement technique de Jeuxvideo.com</title>
		<link rel="alternate" type="text/html" href="https://jvflux.fr/index.php?title=Fonctionnement_technique_de_Jeuxvideo.com&amp;diff=158244"/>
		<updated>2024-11-22T22:19:06Z</updated>

		<summary type="html">&lt;p&gt;Alexandre : Tabulation plus visible, includes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Bannière Info|Contenu=Co-rédacteur de l&#039;[[API|article sur l&#039;API de JVC]], j&#039;aurais besoin de l&#039;aide d&#039;un khey calé sur l&#039;API de JVC et/ou le fonctionnement technique de jeuxvideo.com. J&#039;ai plusieurs questions à poser en vue de la réalisation d&#039;un projet informatique. (Edwado si tu passes par là…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merci de me contacter sur JVC (pseudo &#039;&#039;&#039;ContrapunctusI&#039;&#039;&#039;{{CDV|Pseudo=ContrapunctusI}}). Toute aide sera appréciée.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[Jeuxvideo.com]] utilise 2 serveurs frontaux qui sont depuis le 7 mai 2022 protégés par le service [https://cloudflare.com Cloudflare]. Chaque serveur frontal utilise un serveur HTTP Apache, tout ce qu&#039;il y a de plus classique. En revanche, avant d&#039;arriver sur le serveur Apache, on a plusieurs mailles dans la chaîne. En effet, lorsque vous faites une requête auprès de JVC, la chaîne suivante est effectuée avant d&#039;arriver jusqu&#039;au back-end :&lt;br /&gt;
 Cloudflare → Round-robin entre les 2 serveurs frontaux → HAProxy → Varnish → Apache → PHP / Express (Node.js)&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;une requête HTTP ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cloudflare&#039;&#039;&#039; est le premier point d&#039;entrée pour accéder à JVC. Il gère les enregistrements DNS du site et ses IPs sont majoritairement aléatoires et anycastées/géocastées. Ce service touche la couche réseau/transport tout comme la couche applicative du modèle OSI : il fait office d&#039;anti-DDoS à forte valeur (bien que JVC utilise le service &amp;quot;Volterra&amp;quot; en tant qu&#039;anti-DDoS sur couches basses du côté des IPs de son AS 35717). Une partie de la couche applicative est protégée par Cloudflare, via des règles éditées manuellement par [[Webedia]] (entre autre, blocages de pools IPv4 de VPN connus, et de certains pays d&#039;après certains retours d&#039;utilisateurs).&lt;br /&gt;
&lt;br /&gt;
Un round-robin est effectué via Cloudflare auprès des serveurs DNS de Webedia. Le but est de déterminer de façon algorithmique quel serveur frontal va être utilisé pour la requête HTTP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HAProxy&#039;&#039;&#039; est un proxy et load-balancer TCP d&#039;une efficacité remarquable, il est utilisé sur la totalité des environnements de production gérés par Webedia. C&#039;est entre autre ce service à l&#039;origine de l&#039;erreur 403 Forbidden. En effet, HAProxy fait aussi office de protection applicative (on peut donc en déduire que JVC utilise plusieurs services sur couche haute pour protéger l&#039;applicatif). On peut notamment remarquer le blacklistage des IPs du réseau &amp;quot;Tor&amp;quot;, mais également le blacklistage des pools de l&#039;AS 16276 (appartenant à la société OVH et n&#039;étant utilisé que dans des contextes d&#039;hébergement) - blocage mené suite à l&#039;utilisation massive des services de la société OVH dans le but de scrapper/attaquer JVC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Apache&#039;&#039;&#039; est un serveur HTTP. Il a été optimisé par l&#039;équipe technique actuelle de Webedia, mais également par l&#039;ancienne équipe du site (on peut notamment citer [[Dargor]] et [[Haazel]] en tant que personnes ayant participées à l&#039;élaboration de tunning du serveur HTTP).&lt;br /&gt;
&lt;br /&gt;
Le dernier point est selon la page qui est demandée. Des parties du site sont développées en PHP, et d&#039;autres en Node.js. Pour l&#039;anecdote, le site est hébergé côté serveur dans le dossier /opt/datas/sites/JEUXVIDEO.COM/&amp;lt;ref&amp;gt;La norme [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] n’incluait pas &amp;lt;code&amp;gt;/srv&amp;lt;/code&amp;gt;, qui est plus approprié, avant 2004.&amp;lt;/ref&amp;gt;. Il n&#039;y a quasiment aucune protection de ce côté (si ce n&#039;est une protection contre les IPs Tor).&lt;br /&gt;
&lt;br /&gt;
=== Protection applicative Cloudflare ===&lt;br /&gt;
&lt;br /&gt;
L&#039;applicatif est donc, comme on a pu le voir, protégé par Cloudflare en premier point d&#039;entrée. Cloudflare est binaire : si l&#039;IP source est blacklistée, une HTTP 403 est retournée et l&#039;accès à l&#039;URI est refusé.&amp;lt;br&amp;gt;Le blocage est en outre simple à bypasser, pour le moment, on peut constater que l&#039;usage d&#039;IPs géolocalisées en France est un bon bypass.&lt;br /&gt;
&lt;br /&gt;
=== Domaine de fichiers statiques ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;static.jvc.gg&#039;&#039;&#039; est notamment utilisé pour servir les feuilles de styles et scripts et utilise comme serveur &#039;&#039;&#039;nginx&#039;&#039;&#039; au lieu d&#039;Apache. N’étant pas protégé par Cloudflare en janvier 2023 il permet d’avoir un aperçu technique de comment était servi l’ensemble du site avant la mise en place de Cloudflare.&lt;br /&gt;
&lt;br /&gt;
Côté DNS, cinq serveurs de noms sont utilisés : ns1.webedia-group.org, ns2.webedia-group.net, ns3.webedia-group.com, ns4.webedia-group.biz, ns5.webedia-group.app. Les deux premiers sont sur leur AS 35717 ; les trois derniers sont respectivement hébergés chez Scaleway, OVH, Gandi.&lt;br /&gt;
&lt;br /&gt;
== Avant Respawn ==&lt;br /&gt;
&lt;br /&gt;
Avant [[Projet Respawn|Respawn]], JVC était développé sur plusieurs langages différents côté back-end : on peut citer le C et le PHP. La base de données finale utilisait le moteur de base de données PostgreSQL. L&#039;anarchie technique du back-end a menée au développement de [[Respawn]] (qui est également anarchique).&lt;br /&gt;
&lt;br /&gt;
=== Les Cartes de visite ===&lt;br /&gt;
&lt;br /&gt;
Les [[Carte de Visite|Cartes de visite]] étaient développés en PHP et avaient la particularité notable de stocker les données publiques de chaque utilisateur (par exemple, sa description personnelle) dans de simples fichiers HTML stockés sur disque : il n&#039;y avait pas de requête SQL d&#039;invoquée pour obtenir certaines données liées aux CDV. Lors de certains floods d&#039;avis utilisateurs (notamment menés par &#039;&#039;UnifiedLinux&#039;&#039;), les CDV retournaient aléatoirement des pages blanches. La cause est toujours inconnue.&lt;br /&gt;
&lt;br /&gt;
=== Les forums ===&lt;br /&gt;
&lt;br /&gt;
Les forums étaient en C, et [[Dargor]] les nommaient &amp;quot;modulaires&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Les articles ===&lt;br /&gt;
&lt;br /&gt;
Les articles n&#039;étaient pas mis en ligne immédiatement après leur rédaction. Un système de &amp;quot;compilation&amp;quot; était nécessaire et à effectuer manuellement afin que le site &amp;quot;compile&amp;quot; les articles pour qu&#039;ils deviennent accessibles au public. On peut imaginer que ce système de compilation a été développé dans un but de gestion de charge applicative.&lt;br /&gt;
&lt;br /&gt;
=== Modération ===&lt;br /&gt;
&lt;br /&gt;
La modération des forums était liée à une authentification à 2 étapes, menant à l&#039;attribution du cookie [[mocoedivxuejdom]] permettant la modération de certains forums selon les permissions attribuées à chaque modérateur. Cette deuxième étape était une page spéciale réclamant 5 mots de passe, qui avaient la particularité d&#039;être remplis de caractères aléatoires et spéciaux.&lt;br /&gt;
&lt;br /&gt;
=== Authentification ===&lt;br /&gt;
&lt;br /&gt;
Le cookie [[wenvjgol]] était utilisé pour l&#039;authentification.&lt;br /&gt;
&lt;br /&gt;
=== La recherche des forums ===&lt;br /&gt;
&lt;br /&gt;
La recherche des forums était connue pour être atrocement lente et affichant incorrectement la liste des résultats, des topics étaient manquants et s&#039;affichaient une fois sur deux.&lt;br /&gt;
&lt;br /&gt;
=== Sécurité informatique ===&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;une IP tentait d&#039;envoyer trop de requêtes HTTP (HTTPS n&#039;était pas déployé à ce moment-là), le site redirigeait chaque requête HTTP vers une erreur 404. La page d&#039;erreur 404 étant très peu consommatrice techniquement, cela permettait de désaturer la charge serveur en cas de DoS/DDoS.&lt;br /&gt;
&lt;br /&gt;
Sur les CDV et les forums, il y a eu un grand nombre de failles XSS, notamment exploitées en masse par [[PyjamaSam]].&lt;br /&gt;
&lt;br /&gt;
Le [[Captcha]] était également tout le temps cassé, permettant des floods de topics/messages/contributions. Cela a permis par exemple de créer un pseudo rang rubis en moins d&#039;un jour, dont le pseudo était &#039;&#039;RubyOne&#039;&#039; (par &#039;&#039;UnifiedLinux&#039;&#039;, qui a également créé un pseudo rang diamant en moins d&#039;un jour via un flood de contributions).&lt;br /&gt;
&lt;br /&gt;
== Respawn ==&lt;br /&gt;
&lt;br /&gt;
[[Respawn]] a été développé entièrement en PHP côté back-end. Il utilise notamment des frameworks tels que Symfony côté forums, et des moteurs de templates tel que Twig. Respawn semble être divisé techniquement en plusieurs parties : en effet, on peut constater que certaines parties du site respectent le modèle vue-contrôleur (on peut citer les forums), bien que d&#039;autres parties du site n&#039;utilisent pas ce modèle et utilisent de l&#039;url rewriting hardcodé dans des fichiers .htaccess. Respawn semble posséder une base de code identique entre JVC et [[ForumJV]] (désormais fermé), on pouvait constater de nettes interactions entre les 2 sites lorsque ForumJV était ouvert, interactions ayant menées à certains abus (ForumJV accordait des droits de modération sur son forum personnel, des failles de sécurité était donc existantes derrière ce privilège).&lt;br /&gt;
&lt;br /&gt;
=== Schéma de base de données ===&lt;br /&gt;
&lt;br /&gt;
Le schéma de base de données de Respawn semble anarchique et composé de mélange entre le Français et l&#039;Anglais. Exemples de tables appartenant à Respawn : &amp;quot;get_compte_infos&amp;quot;, &amp;quot;session_renew_v2&amp;quot;, &amp;quot;jeu_get_v7&amp;quot;. Notez le &amp;quot;v&amp;quot; à la fin de chaque table, laissant penser qu&#039;il existe plusieurs versions de celles-ci.&lt;br /&gt;
&lt;br /&gt;
==== Exemple d&#039;appel en base de données ====&lt;br /&gt;
 &#039;&#039;SELECT out_id_type, out_nom_type, out_dirname_type, out_affichage, out_date_publication, out_date_modification, out_id_alias_auteur, out_id_groupe_auteur, out_ip, out_titre, out_texte, out_commentaire, out_visibilite, out_liaisons, out_tags, out_medias, out_version, out_fiche, out_jeu, out_data, out_url, out_id_jeux FROM jeu_get_v7 WHERE id_contenu = xxx&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Organisation technique ===&lt;br /&gt;
&lt;br /&gt;
Comme dit précédemment, Respawn semble être un mélange de MVC et de code classique sans modèle particulier de respecté. Les fichiers du back-end sont également mitigés du côté de leur appellation, laissant encore droit au mélange entre Français et Anglais. Exemples de fichiers côté back-end :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/htdocs/forums/liste_topic.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/core/OiPDOStatement.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Transaction.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/GoogleTagManager.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Compte.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/controllers/forum/liste_topic.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Session.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/vendor/...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Nommage des fonctions ===&lt;br /&gt;
&lt;br /&gt;
Respawn possède aussi des fonctions dont le nommage est entre le Français et l&#039;Anglais. Exemples de fonctions côté back-end :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;getInfoFromIdForum&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;loadMenu&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;checkMenuItem&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;getSingleton&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;getHtmlJeuForum&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;blocHtmlBoutiqueRandom&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Optimisations ===&lt;br /&gt;
&lt;br /&gt;
Le back-end PHP utilise Memcache (https://www.php.net/manual/fr/book.memcache.php) afin de faire baisser la charge technique de l&#039;applicatif.&lt;br /&gt;
&lt;br /&gt;
=== Stockage des utilisateurs ===&lt;br /&gt;
&lt;br /&gt;
Depuis Respawn, les utilisateurs de JVC sont référencés sous un identifiant numérique côté base de données, contrairement au fonctionnement de l&#039;ancien JVC où les utilisateurs étaient référencés par leur pseudo (pouvant mener à des posts sur les forums avec des pseudos identiques organisés différemment côté minuscules/majuscules).&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;obtenir son ID via la page permettant d&#039;éditer votre profil, l&#039;ID est à la fin de l&#039;URL.&lt;br /&gt;
&lt;br /&gt;
=== Les forums ===&lt;br /&gt;
&lt;br /&gt;
Les posts des forums sont déclarés sur plusieurs serveurs différents. Les IDs de ceux-ci semblent aléatoires (bien qu&#039;un offset était attribué pour les posts présents sur ForumJV). Les IDs sont choisis selon l&#039;emplacement dans lequel la ressource sera stockée lors de la création du topic. Le choix de l&#039;emplacement se fait à la création du topic, les messages dans le topic sont alors stockés dans le même emplacement. Il semblerait qu&#039;il y ait 8 emplacements. ID + 8 pour accéder à la ressource suivante, et ID - 8 pour accéder à la ressource précédente.&lt;br /&gt;
&lt;br /&gt;
Exemple de messages séquentiels:&lt;br /&gt;
&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193382&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193390&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193398&lt;br /&gt;
&lt;br /&gt;
L&#039;ID est incrémenté de 8 à chaque fois. Tous ces messages sont répertoriés dans le 7ème serveur (&amp;lt;code&amp;gt;ID % 8&amp;lt;/code&amp;gt;, donc &amp;lt;code&amp;gt;905193382 % 8 = 6&amp;lt;/code&amp;gt;, 7ème).&lt;br /&gt;
&lt;br /&gt;
À noter toutefois que les messages datant d&#039;avant respawn sont complètement désordonnés, certainement dû à la migration durant respawn où la migration de ces messages a été effectué en parallèle.&lt;br /&gt;
&lt;br /&gt;
=== Modération ===&lt;br /&gt;
&lt;br /&gt;
La modération sur Respawn se nomme &amp;quot;Accès étendu&amp;quot;. L&#039;accès étendu peut être appelé via la page qui lui est dédiée : https://www.jeuxvideo.com/sso/auth.php ; il nécessite en revanche également un mot de passe, qui est envoyé via un lien sécurisé utilisable une seule fois par MP à chaque modérateur. A noter que le [[103]] est accessible à n&#039;importe quel modérateur même sans authentification à l&#039;accès étendu.&lt;br /&gt;
&lt;br /&gt;
=== Authentification ===&lt;br /&gt;
&lt;br /&gt;
Le cookie [[coniunctio]] est utilisé pour l&#039;authentification.&lt;br /&gt;
&lt;br /&gt;
=== Recherche des forums ===&lt;br /&gt;
&lt;br /&gt;
La recherche des forums utilise le moteur de recherche Sphinx qui est intégré au site. La recherche des forums est limitée à 1 mois sur les blablas, elle peut être contournée via https://jvarchive.com/.&lt;br /&gt;
&lt;br /&gt;
=== Sécurité informatique ===&lt;br /&gt;
&lt;br /&gt;
Dans les débuts de Respawn, le site était rempli de failles permettant de faire exploser la charge du site. Il existait également de nombreuses failles sur [[ForumJV]] qui permettaient de modérer sans être modérateur, sur n&#039;importe quel forum. Les failles ici citées ont en majorité été exploitées par [[edwado]].&lt;br /&gt;
&lt;br /&gt;
Il a également existé une faille RCE (Remote Code Execution) exploitée par [[Tsain]], qui permettait d&#039;injecter du CSS sur n&#039;importe quelle partie du site (la faille fut très mal exploitée étant-donné que celle-ci n&#039;était pas qu&#039;une simple injection CSS mais bien une RCE où il était possible d&#039;injecter un shell PHP).&lt;br /&gt;
&lt;br /&gt;
=== JvCare ===&lt;br /&gt;
&lt;br /&gt;
JvCare est un algorithme d&#039;obfuscation des liens externes postés sur le site. Il a été développé depuis Respawn. Il permet d&#039;éviter la création de backlinks qui pourraient optimiser indirectement le SEO de sites externes à Jeuxvideo.com.&lt;br /&gt;
&lt;br /&gt;
Les codes ci-après permettent de décoder une chaîne obfusquée.&lt;br /&gt;
&lt;br /&gt;
==== PHP ====&lt;br /&gt;
&lt;br /&gt;
 function jvCare(string $classe) : string {&lt;br /&gt;
   $base16 = &amp;quot;0A12B34C56D78E9F&amp;quot;;&#039;&#039;&lt;br /&gt;
   $lien = &amp;quot;&amp;quot;;&lt;br /&gt;
   $s = explode(&amp;quot; &amp;quot;, $classe)[1];&lt;br /&gt;
   for ($i = 0; $i &amp;lt;= strlen($s)-1; $i += 2) {&lt;br /&gt;
     $lien .= chr(strrpos($base16, $s[$i]) * 16 + strrpos($base16, $s[$i+1]));&lt;br /&gt;
   }&lt;br /&gt;
   return $lien;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== JavaScript ====&lt;br /&gt;
&lt;br /&gt;
 function jvCake(classe) {&lt;br /&gt;
   const base16 = &#039;0A12B34C56D78E9F&#039;;&lt;br /&gt;
   let lien = &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
   const s = classe.split(&#039; &#039;)[1];&lt;br /&gt;
   for (let i = 0; i &amp;lt; s.length; i += 2) {&lt;br /&gt;
     lien += String.fromCharCode(base16.indexOf(s.charAt(i)) * 16 + base16.indexOf(s.charAt(i + 1)));&lt;br /&gt;
   }&lt;br /&gt;
   return lien;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
 def jvcare(classe: str) -&amp;gt; str:&lt;br /&gt;
   base16 = &#039;0A12B34C56D78E9F&#039;&lt;br /&gt;
   url = &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   s = classe.split()[1]&lt;br /&gt;
   for i, j in zip(s[0::2], s[1::2]):&lt;br /&gt;
     url += chr(base16.index(i) * 16 + base16.index(j))&lt;br /&gt;
   return url&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 const char *__jvcarebase16 = &amp;quot;0A12B34C56D78E9F&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 char *jvcare(const char *class) {&lt;br /&gt;
     char *s = strchr(class, &#039; &#039;) + 1;&lt;br /&gt;
 &lt;br /&gt;
     int urllen = strlen(s) / 2;&lt;br /&gt;
     char *url = malloc(urllen + 1);&lt;br /&gt;
     for (int i = 0; i &amp;lt; urllen; i++) {&lt;br /&gt;
         char pos1 = strchr(__jvcarebase16, s[i * 2]) - __jvcarebase16;&lt;br /&gt;
         char pos2 = strchr(__jvcarebase16, s[i * 2 + 1]) - __jvcarebase16;&lt;br /&gt;
         url[i] = pos1 * 16 + pos2;&lt;br /&gt;
     }&lt;br /&gt;
     url[urllen] = &#039;\0&#039;;&lt;br /&gt;
     return url;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Awk ====&lt;br /&gt;
&lt;br /&gt;
 BEGIN {&lt;br /&gt;
     base16 = &amp;quot;0A12B34C56D78E9F&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 {&lt;br /&gt;
     s = $2&lt;br /&gt;
     for (i = 1; i &amp;lt; length(s); i += 2) {&lt;br /&gt;
         pos1 = index(base16, substr(s, i, 1))&lt;br /&gt;
         pos2 = index(base16, substr(s, i + 1, 1))&lt;br /&gt;
         url = url sprintf(&amp;quot;%c&amp;quot;, (pos1 - 1) * 16 + pos2 - 1)&lt;br /&gt;
     }&lt;br /&gt;
     print url&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Phoenix ==&lt;br /&gt;
&lt;br /&gt;
Phoenix est une partie de JVC développée en Node.js et utilisant React. Elle semble de plus en plus abandonnée, et nous n&#039;avons pas beaucoup d&#039;informations à son sujet. Phoenix utilise une API spéciale hébergée au sous-domaine [[Documentation_de_l%27API_Jeuxvideo.com#API_jvc.gg|&#039;&#039;api.jvc.gg&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
== Liens externes ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml Interview sur l’architecture de jeuxvideo.com de 1997 à 2005] ([http://web.archive.org/web/20070629165914/http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml archive.org])&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Voir aussi ==&lt;br /&gt;
&lt;br /&gt;
* [[Documentation de l&#039;API Jeuxvideo.com]]&lt;br /&gt;
&lt;br /&gt;
{{SectionRéférences}}&lt;br /&gt;
{{TableauCatégorieFonctionnementJVC}}&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Fonctionnement technique de Jeuxvideo.com]]&lt;br /&gt;
[[Catégorie:Extensions et outils]]&lt;/div&gt;</summary>
		<author><name>Alexandre</name></author>
	</entry>
	<entry>
		<id>https://jvflux.fr/index.php?title=Fonctionnement_technique_de_Jeuxvideo.com&amp;diff=158243</id>
		<title>Fonctionnement technique de Jeuxvideo.com</title>
		<link rel="alternate" type="text/html" href="https://jvflux.fr/index.php?title=Fonctionnement_technique_de_Jeuxvideo.com&amp;diff=158243"/>
		<updated>2024-11-22T22:01:47Z</updated>

		<summary type="html">&lt;p&gt;Alexandre : JvCare Awk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Bannière Info|Contenu=Co-rédacteur de l&#039;[[API|article sur l&#039;API de JVC]], j&#039;aurais besoin de l&#039;aide d&#039;un khey calé sur l&#039;API de JVC et/ou le fonctionnement technique de jeuxvideo.com. J&#039;ai plusieurs questions à poser en vue de la réalisation d&#039;un projet informatique. (Edwado si tu passes par là…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merci de me contacter sur JVC (pseudo &#039;&#039;&#039;ContrapunctusI&#039;&#039;&#039;{{CDV|Pseudo=ContrapunctusI}}). Toute aide sera appréciée.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[Jeuxvideo.com]] utilise 2 serveurs frontaux qui sont depuis le 7 mai 2022 protégés par le service [https://cloudflare.com Cloudflare]. Chaque serveur frontal utilise un serveur HTTP Apache, tout ce qu&#039;il y a de plus classique. En revanche, avant d&#039;arriver sur le serveur Apache, on a plusieurs mailles dans la chaîne. En effet, lorsque vous faites une requête auprès de JVC, la chaîne suivante est effectuée avant d&#039;arriver jusqu&#039;au back-end :&lt;br /&gt;
 Cloudflare → Round-robin entre les 2 serveurs frontaux → HAProxy → Varnish → Apache → PHP / Express (Node.js)&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;une requête HTTP ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cloudflare&#039;&#039;&#039; est le premier point d&#039;entrée pour accéder à JVC. Il gère les enregistrements DNS du site et ses IPs sont majoritairement aléatoires et anycastées/géocastées. Ce service touche la couche réseau/transport tout comme la couche applicative du modèle OSI : il fait office d&#039;anti-DDoS à forte valeur (bien que JVC utilise le service &amp;quot;Volterra&amp;quot; en tant qu&#039;anti-DDoS sur couches basses du côté des IPs de son AS 35717). Une partie de la couche applicative est protégée par Cloudflare, via des règles éditées manuellement par [[Webedia]] (entre autre, blocages de pools IPv4 de VPN connus, et de certains pays d&#039;après certains retours d&#039;utilisateurs).&lt;br /&gt;
&lt;br /&gt;
Un round-robin est effectué via Cloudflare auprès des serveurs DNS de Webedia. Le but est de déterminer de façon algorithmique quel serveur frontal va être utilisé pour la requête HTTP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HAProxy&#039;&#039;&#039; est un proxy et load-balancer TCP d&#039;une efficacité remarquable, il est utilisé sur la totalité des environnements de production gérés par Webedia. C&#039;est entre autre ce service à l&#039;origine de l&#039;erreur 403 Forbidden. En effet, HAProxy fait aussi office de protection applicative (on peut donc en déduire que JVC utilise plusieurs services sur couche haute pour protéger l&#039;applicatif). On peut notamment remarquer le blacklistage des IPs du réseau &amp;quot;Tor&amp;quot;, mais également le blacklistage des pools de l&#039;AS 16276 (appartenant à la société OVH et n&#039;étant utilisé que dans des contextes d&#039;hébergement) - blocage mené suite à l&#039;utilisation massive des services de la société OVH dans le but de scrapper/attaquer JVC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Apache&#039;&#039;&#039; est un serveur HTTP. Il a été optimisé par l&#039;équipe technique actuelle de Webedia, mais également par l&#039;ancienne équipe du site (on peut notamment citer [[Dargor]] et [[Haazel]] en tant que personnes ayant participées à l&#039;élaboration de tunning du serveur HTTP).&lt;br /&gt;
&lt;br /&gt;
Le dernier point est selon la page qui est demandée. Des parties du site sont développées en PHP, et d&#039;autres en Node.js. Pour l&#039;anecdote, le site est hébergé côté serveur dans le dossier /opt/datas/sites/JEUXVIDEO.COM/&amp;lt;ref&amp;gt;La norme [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] n’incluait pas &amp;lt;code&amp;gt;/srv&amp;lt;/code&amp;gt;, qui est plus approprié, avant 2004.&amp;lt;/ref&amp;gt;. Il n&#039;y a quasiment aucune protection de ce côté (si ce n&#039;est une protection contre les IPs Tor).&lt;br /&gt;
&lt;br /&gt;
=== Protection applicative Cloudflare ===&lt;br /&gt;
&lt;br /&gt;
L&#039;applicatif est donc, comme on a pu le voir, protégé par Cloudflare en premier point d&#039;entrée. Cloudflare est binaire : si l&#039;IP source est blacklistée, une HTTP 403 est retournée et l&#039;accès à l&#039;URI est refusé.&amp;lt;br&amp;gt;Le blocage est en outre simple à bypasser, pour le moment, on peut constater que l&#039;usage d&#039;IPs géolocalisées en France est un bon bypass.&lt;br /&gt;
&lt;br /&gt;
=== Domaine de fichiers statiques ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;static.jvc.gg&#039;&#039;&#039; est notamment utilisé pour servir les feuilles de styles et scripts et utilise comme serveur &#039;&#039;&#039;nginx&#039;&#039;&#039; au lieu d&#039;Apache. N’étant pas protégé par Cloudflare en janvier 2023 il permet d’avoir un aperçu technique de comment était servi l’ensemble du site avant la mise en place de Cloudflare.&lt;br /&gt;
&lt;br /&gt;
Côté DNS, cinq serveurs de noms sont utilisés : ns1.webedia-group.org, ns2.webedia-group.net, ns3.webedia-group.com, ns4.webedia-group.biz, ns5.webedia-group.app. Les deux premiers sont sur leur AS 35717 ; les trois derniers sont respectivement hébergés chez Scaleway, OVH, Gandi.&lt;br /&gt;
&lt;br /&gt;
== Avant Respawn ==&lt;br /&gt;
&lt;br /&gt;
Avant [[Projet Respawn|Respawn]], JVC était développé sur plusieurs langages différents côté back-end : on peut citer le C et le PHP. La base de données finale utilisait le moteur de base de données PostgreSQL. L&#039;anarchie technique du back-end a menée au développement de [[Respawn]] (qui est également anarchique).&lt;br /&gt;
&lt;br /&gt;
=== Les Cartes de visite ===&lt;br /&gt;
&lt;br /&gt;
Les [[Carte de Visite|Cartes de visite]] étaient développés en PHP et avaient la particularité notable de stocker les données publiques de chaque utilisateur (par exemple, sa description personnelle) dans de simples fichiers HTML stockés sur disque : il n&#039;y avait pas de requête SQL d&#039;invoquée pour obtenir certaines données liées aux CDV. Lors de certains floods d&#039;avis utilisateurs (notamment menés par &#039;&#039;UnifiedLinux&#039;&#039;), les CDV retournaient aléatoirement des pages blanches. La cause est toujours inconnue.&lt;br /&gt;
&lt;br /&gt;
=== Les forums ===&lt;br /&gt;
&lt;br /&gt;
Les forums étaient en C, et [[Dargor]] les nommaient &amp;quot;modulaires&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Les articles ===&lt;br /&gt;
&lt;br /&gt;
Les articles n&#039;étaient pas mis en ligne immédiatement après leur rédaction. Un système de &amp;quot;compilation&amp;quot; était nécessaire et à effectuer manuellement afin que le site &amp;quot;compile&amp;quot; les articles pour qu&#039;ils deviennent accessibles au public. On peut imaginer que ce système de compilation a été développé dans un but de gestion de charge applicative.&lt;br /&gt;
&lt;br /&gt;
=== Modération ===&lt;br /&gt;
&lt;br /&gt;
La modération des forums était liée à une authentification à 2 étapes, menant à l&#039;attribution du cookie [[mocoedivxuejdom]] permettant la modération de certains forums selon les permissions attribuées à chaque modérateur. Cette deuxième étape était une page spéciale réclamant 5 mots de passe, qui avaient la particularité d&#039;être remplis de caractères aléatoires et spéciaux.&lt;br /&gt;
&lt;br /&gt;
=== Authentification ===&lt;br /&gt;
&lt;br /&gt;
Le cookie [[wenvjgol]] était utilisé pour l&#039;authentification.&lt;br /&gt;
&lt;br /&gt;
=== La recherche des forums ===&lt;br /&gt;
&lt;br /&gt;
La recherche des forums était connue pour être atrocement lente et affichant incorrectement la liste des résultats, des topics étaient manquants et s&#039;affichaient une fois sur deux.&lt;br /&gt;
&lt;br /&gt;
=== Sécurité informatique ===&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;une IP tentait d&#039;envoyer trop de requêtes HTTP (HTTPS n&#039;était pas déployé à ce moment-là), le site redirigeait chaque requête HTTP vers une erreur 404. La page d&#039;erreur 404 étant très peu consommatrice techniquement, cela permettait de désaturer la charge serveur en cas de DoS/DDoS.&lt;br /&gt;
&lt;br /&gt;
Sur les CDV et les forums, il y a eu un grand nombre de failles XSS, notamment exploitées en masse par [[PyjamaSam]].&lt;br /&gt;
&lt;br /&gt;
Le [[Captcha]] était également tout le temps cassé, permettant des floods de topics/messages/contributions. Cela a permis par exemple de créer un pseudo rang rubis en moins d&#039;un jour, dont le pseudo était &#039;&#039;RubyOne&#039;&#039; (par &#039;&#039;UnifiedLinux&#039;&#039;, qui a également créé un pseudo rang diamant en moins d&#039;un jour via un flood de contributions).&lt;br /&gt;
&lt;br /&gt;
== Respawn ==&lt;br /&gt;
&lt;br /&gt;
[[Respawn]] a été développé entièrement en PHP côté back-end. Il utilise notamment des frameworks tels que Symfony côté forums, et des moteurs de templates tel que Twig. Respawn semble être divisé techniquement en plusieurs parties : en effet, on peut constater que certaines parties du site respectent le modèle vue-contrôleur (on peut citer les forums), bien que d&#039;autres parties du site n&#039;utilisent pas ce modèle et utilisent de l&#039;url rewriting hardcodé dans des fichiers .htaccess. Respawn semble posséder une base de code identique entre JVC et [[ForumJV]] (désormais fermé), on pouvait constater de nettes interactions entre les 2 sites lorsque ForumJV était ouvert, interactions ayant menées à certains abus (ForumJV accordait des droits de modération sur son forum personnel, des failles de sécurité était donc existantes derrière ce privilège).&lt;br /&gt;
&lt;br /&gt;
=== Schéma de base de données ===&lt;br /&gt;
&lt;br /&gt;
Le schéma de base de données de Respawn semble anarchique et composé de mélange entre le Français et l&#039;Anglais. Exemples de tables appartenant à Respawn : &amp;quot;get_compte_infos&amp;quot;, &amp;quot;session_renew_v2&amp;quot;, &amp;quot;jeu_get_v7&amp;quot;. Notez le &amp;quot;v&amp;quot; à la fin de chaque table, laissant penser qu&#039;il existe plusieurs versions de celles-ci.&lt;br /&gt;
&lt;br /&gt;
==== Exemple d&#039;appel en base de données ====&lt;br /&gt;
 &#039;&#039;SELECT out_id_type, out_nom_type, out_dirname_type, out_affichage, out_date_publication, out_date_modification, out_id_alias_auteur, out_id_groupe_auteur, out_ip, out_titre, out_texte, out_commentaire, out_visibilite, out_liaisons, out_tags, out_medias, out_version, out_fiche, out_jeu, out_data, out_url, out_id_jeux FROM jeu_get_v7 WHERE id_contenu = xxx&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Organisation technique ===&lt;br /&gt;
&lt;br /&gt;
Comme dit précédemment, Respawn semble être un mélange de MVC et de code classique sans modèle particulier de respecté. Les fichiers du back-end sont également mitigés du côté de leur appellation, laissant encore droit au mélange entre Français et Anglais. Exemples de fichiers côté back-end :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/htdocs/forums/liste_topic.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/core/OiPDOStatement.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Transaction.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/GoogleTagManager.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Compte.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/controllers/forum/liste_topic.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Session.php&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;/opt/datas/JEUXVIDEO.COM/app/vendor/...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Nommage des fonctions ===&lt;br /&gt;
&lt;br /&gt;
Respawn possède aussi des fonctions dont le nommage est entre le Français et l&#039;Anglais. Exemples de fonctions côté back-end :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;getInfoFromIdForum&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;loadMenu&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;checkMenuItem&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;getSingleton&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;getHtmlJeuForum&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;blocHtmlBoutiqueRandom&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Optimisations ===&lt;br /&gt;
&lt;br /&gt;
Le back-end PHP utilise Memcache (https://www.php.net/manual/fr/book.memcache.php) afin de faire baisser la charge technique de l&#039;applicatif.&lt;br /&gt;
&lt;br /&gt;
=== Stockage des utilisateurs ===&lt;br /&gt;
&lt;br /&gt;
Depuis Respawn, les utilisateurs de JVC sont référencés sous un identifiant numérique côté base de données, contrairement au fonctionnement de l&#039;ancien JVC où les utilisateurs étaient référencés par leur pseudo (pouvant mener à des posts sur les forums avec des pseudos identiques organisés différemment côté minuscules/majuscules).&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;obtenir son ID via la page permettant d&#039;éditer votre profil, l&#039;ID est à la fin de l&#039;URL.&lt;br /&gt;
&lt;br /&gt;
=== Les forums ===&lt;br /&gt;
&lt;br /&gt;
Les posts des forums sont déclarés sur plusieurs serveurs différents. Les IDs de ceux-ci semblent aléatoires (bien qu&#039;un offset était attribué pour les posts présents sur ForumJV). Les IDs sont choisis selon l&#039;emplacement dans lequel la ressource sera stockée lors de la création du topic. Le choix de l&#039;emplacement se fait à la création du topic, les messages dans le topic sont alors stockés dans le même emplacement. Il semblerait qu&#039;il y ait 8 emplacements. ID + 8 pour accéder à la ressource suivante, et ID - 8 pour accéder à la ressource précédente.&lt;br /&gt;
&lt;br /&gt;
Exemple de messages séquentiels:&lt;br /&gt;
&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193382&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193390&lt;br /&gt;
* https://www.jeuxvideo.com/forums/message/905193398&lt;br /&gt;
&lt;br /&gt;
L&#039;ID est incrémenté de 8 à chaque fois. Tous ces messages sont répertoriés dans le 7ème serveur (&amp;lt;code&amp;gt;ID % 8&amp;lt;/code&amp;gt;, donc &amp;lt;code&amp;gt;905193382 % 8 = 6&amp;lt;/code&amp;gt;, 7ème).&lt;br /&gt;
&lt;br /&gt;
À noter toutefois que les messages datant d&#039;avant respawn sont complètement désordonnés, certainement dû à la migration durant respawn où la migration de ces messages a été effectué en parallèle.&lt;br /&gt;
&lt;br /&gt;
=== Modération ===&lt;br /&gt;
&lt;br /&gt;
La modération sur Respawn se nomme &amp;quot;Accès étendu&amp;quot;. L&#039;accès étendu peut être appelé via la page qui lui est dédiée : https://www.jeuxvideo.com/sso/auth.php ; il nécessite en revanche également un mot de passe, qui est envoyé via un lien sécurisé utilisable une seule fois par MP à chaque modérateur. A noter que le [[103]] est accessible à n&#039;importe quel modérateur même sans authentification à l&#039;accès étendu.&lt;br /&gt;
&lt;br /&gt;
=== Authentification ===&lt;br /&gt;
&lt;br /&gt;
Le cookie [[coniunctio]] est utilisé pour l&#039;authentification.&lt;br /&gt;
&lt;br /&gt;
=== Recherche des forums ===&lt;br /&gt;
&lt;br /&gt;
La recherche des forums utilise le moteur de recherche Sphinx qui est intégré au site. La recherche des forums est limitée à 1 mois sur les blablas, elle peut être contournée via https://jvarchive.com/.&lt;br /&gt;
&lt;br /&gt;
=== Sécurité informatique ===&lt;br /&gt;
&lt;br /&gt;
Dans les débuts de Respawn, le site était rempli de failles permettant de faire exploser la charge du site. Il existait également de nombreuses failles sur [[ForumJV]] qui permettaient de modérer sans être modérateur, sur n&#039;importe quel forum. Les failles ici citées ont en majorité été exploitées par [[edwado]].&lt;br /&gt;
&lt;br /&gt;
Il a également existé une faille RCE (Remote Code Execution) exploitée par [[Tsain]], qui permettait d&#039;injecter du CSS sur n&#039;importe quelle partie du site (la faille fut très mal exploitée étant-donné que celle-ci n&#039;était pas qu&#039;une simple injection CSS mais bien une RCE où il était possible d&#039;injecter un shell PHP).&lt;br /&gt;
&lt;br /&gt;
=== JvCare ===&lt;br /&gt;
&lt;br /&gt;
JvCare est un algorithme d&#039;obfuscation des liens externes postés sur le site. Il a été développé depuis Respawn. Il permet d&#039;éviter la création de backlinks qui pourraient optimiser indirectement le SEO de sites externes à Jeuxvideo.com.&lt;br /&gt;
&lt;br /&gt;
Les codes ci-après permettent de décoder une chaîne obfusquée.&lt;br /&gt;
&lt;br /&gt;
==== PHP ====&lt;br /&gt;
&lt;br /&gt;
 function jvCare(string $classe) : string {&lt;br /&gt;
   $base16 = &amp;quot;0A12B34C56D78E9F&amp;quot;;&#039;&#039;&lt;br /&gt;
   $lien = &amp;quot;&amp;quot;;&lt;br /&gt;
   $s = explode(&amp;quot; &amp;quot;, $classe)[1];&lt;br /&gt;
   for ($i = 0; $i &amp;lt;= strlen($s)-1; $i += 2) {&lt;br /&gt;
     $lien .= chr(strrpos($base16, $s[$i]) * 16 + strrpos($base16, $s[$i+1]));&lt;br /&gt;
   }&lt;br /&gt;
   return $lien;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== JavaScript ====&lt;br /&gt;
&lt;br /&gt;
 function jvCake(classe) {&lt;br /&gt;
   const base16 = &#039;0A12B34C56D78E9F&#039;;&lt;br /&gt;
   let lien = &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
   const s = classe.split(&#039; &#039;)[1];&lt;br /&gt;
   for (let i = 0; i &amp;lt; s.length; i += 2) {&lt;br /&gt;
     lien += String.fromCharCode(base16.indexOf(s.charAt(i)) * 16 + base16.indexOf(s.charAt(i + 1)));&lt;br /&gt;
   }&lt;br /&gt;
   return lien;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
 def jvcare(classe: str) -&amp;gt; str:&lt;br /&gt;
   base16 = &#039;0A12B34C56D78E9F&#039;&lt;br /&gt;
   url = &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   s = classe.split()[1]&lt;br /&gt;
   for i, j in zip(s[0::2], s[1::2]):&lt;br /&gt;
     url += chr(base16.index(i) * 16 + base16.index(j))&lt;br /&gt;
   return url&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
&lt;br /&gt;
 const char *__jvcarebase16 = &amp;quot;0A12B34C56D78E9F&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 char *jvcare(const char *class) {&lt;br /&gt;
   char *s = strchr(class, &#039; &#039;) + 1;&lt;br /&gt;
 &lt;br /&gt;
   int urllen = strlen(s) / 2;&lt;br /&gt;
   char *url = malloc(urllen + 1);&lt;br /&gt;
   for (int i = 0; i &amp;lt; urllen; i++) {&lt;br /&gt;
     char pos1 = strchr(__jvcarebase16, s[i * 2]) - __jvcarebase16;&lt;br /&gt;
     char pos2 = strchr(__jvcarebase16, s[i * 2 + 1]) - __jvcarebase16;&lt;br /&gt;
     url[i] = pos1 * 16 + pos2;&lt;br /&gt;
   }&lt;br /&gt;
   url[urllen] = &#039;\0&#039;;&lt;br /&gt;
   return url;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Awk ====&lt;br /&gt;
&lt;br /&gt;
 BEGIN {&lt;br /&gt;
     base16 = &amp;quot;0A12B34C56D78E9F&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 {&lt;br /&gt;
     s = $2&lt;br /&gt;
     for (i = 1; i &amp;lt; length(s); i += 2) {&lt;br /&gt;
         pos1 = index(base16, substr(s, i, 1))&lt;br /&gt;
         pos2 = index(base16, substr(s, i + 1, 1))&lt;br /&gt;
         url = url sprintf(&amp;quot;%c&amp;quot;, (pos1 - 1) * 16 + pos2 - 1)&lt;br /&gt;
     }&lt;br /&gt;
     print url&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Phoenix ==&lt;br /&gt;
&lt;br /&gt;
Phoenix est une partie de JVC développée en Node.js et utilisant React. Elle semble de plus en plus abandonnée, et nous n&#039;avons pas beaucoup d&#039;informations à son sujet. Phoenix utilise une API spéciale hébergée au sous-domaine [[Documentation_de_l%27API_Jeuxvideo.com#API_jvc.gg|&#039;&#039;api.jvc.gg&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
== Liens externes ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml Interview sur l’architecture de jeuxvideo.com de 1997 à 2005] ([http://web.archive.org/web/20070629165914/http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml archive.org])&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Voir aussi ==&lt;br /&gt;
&lt;br /&gt;
* [[Documentation de l&#039;API Jeuxvideo.com]]&lt;br /&gt;
&lt;br /&gt;
{{SectionRéférences}}&lt;br /&gt;
{{TableauCatégorieFonctionnementJVC}}&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Fonctionnement technique de Jeuxvideo.com]]&lt;br /&gt;
[[Catégorie:Extensions et outils]]&lt;/div&gt;</summary>
		<author><name>Alexandre</name></author>
	</entry>
</feed>