Le blog d'Arcade Village

WordPress piraté pour la dernière fois !

Chaque possesseur d'un site basé sur Wordpress expérimente au moins une fois l'attaque de son site par des pirates informatiques qui détournent les articles ou les menus vers des sites marchands.
Cette situation est pénible et ne semble pas s'améliorer malgré les nouvelles versions.
Alors, quels sont les avantages et les inconvénients de Wordpress et quelle solution ai-je trouvé suite à la dernière attaque dont j'ai été victime ?

Les inconvénients


- 60% des blog utilisent Wordpress, selon leur estimation, et le code informatique de Wordpress est facilement lisible. Ces deux particularités attirent les hackers qui peuvent trouver une faille afin d'infester un grand nombre de sites (mon site a fait partie d'un lot de 100.000 sites piratés) pour un minimum de travail.
- Les sites Wordpress sont en général lourds et peu optimisés. Cela induit des temps de chargement des pages assez long avec une connection internet lente ou un smartphone. Or, la consultation de pages internet par smartphone tend à devenir majoritaire.
- Wordpress utilise des plugins, petites briques de programmes créés par des indépendants qui sont une porte d'entrée de plus pour les pirates.

Les avantages


- Avec Wordpress, pas besoin d'informaticiens. Quelques notions suffisent pour créer un site assez simple.
- La plupart des sites reprennent la même trame. Alors, pourquoi refaire ce qui existe déjà ? C'est ce qu'offrent une infinité de plugins compatibles avec Wordpress.
- Wordpress permet à des graphistes sans connaissances informatiques de vendre des sites web.
- Wordpress fournit un traitement de texte très puissant pour l'écriture des articles. Ce traitement permet d'être indépendant pour la mise à jour du site, même si vous avez fait appel à un tiers pour le créer. Ce traitement de texte à lui seul est un raison valable d'utiliser Wordpress.

Mon cas particulier


J'utilise Wordpress comme complément à mes sites pour ajouter des blogs ou des pages de news. J'ai juste besoin d'afficher les articles. J'ai donc créé une classe PHP pour afficher les articles Wordpress dans mes sites et je continue à utiliser le traitement de texte pour les mettre à jour.

Comment sont conservés les articles dans Wordpress


La clé de Wordpress est la table wp_posts qui contient tous paramètres et le contenu des articles. Pour afficher les articles du site, nous n'avons besoins que de quelques champs de cette table :
ID est le numéro interne de l'article.
post_author est l'identifiant de l'auteur dans la table des utilisateurs. Je ne m'en sers pas.
post_title est le titre de l'article
post_date est la date de l'article. La table contient aussi la date de création, que je n'utiliserais pas. A chaque champ date est associé un champs date_gmt qui ne m'intéresse pas non plus.
post_type est le type de post. Pour Wordpress, tout est article : les actualités, les pages ou même les images. Nous ne nous intéressons qu'aux actualités. Leur colonne post_type contient la valeur 'post'.
post_status est le status de l'article. Wordpress conserve les révisions ainsi que les sauvegardes automatiques dans la table wp_posts, nous ne tiendrons compte que des articles à publier, c'est à dire ceux dont la colonne post_status contient la valeur 'publish'

La classe CCWPAccess


Cette classe offre deux fonctionnalités
- Afficher la liste des derniers articles
- Afficher un article.
La classe CCWPACCess a besoin de deux paramètres pour être instanciée :
- $prefix_table : à la création de Wordpress, le même préfixe est placé au début du nom de toutes les tables.
- $format_date : le format des tables.
J'aurais pu développer des routines pour aller chercher ces informations dans Wordpress (le fichier wp-config.php), mais mon but est de ne pas utiliser son code.
Cette classe propose une fonction loadPost qui permet de télécharger l'article et des fonctions pour l'afficher(getTitle(), getDate(), getContent()).
Elle propose une autre fonction intéressante : getNews($bdd, $limit=10)
Cette fonction télécharge les informations utiles(id,titre,date) des $limit derniers articles dans un tableau d'objet de type CCWPACCessItem
La fonction displayList permet de les afficher, la fonction getLastID() rend l'ID du dernier article.

<?php

class CCWPAccessItem
{
var $id = -1;
var $title;
var $pdate;

function fromFetch($r)
{
$this->id = $r["ID"];
$this->title = $r["post_title"];
$this->pdate = $r["post_date"];
}
}

class CCWPAccess
{
var $id = -1;
var $title;
var $pdate;
var $content;
var $tprefix;
var $dformat;
var $news;
var $idmax; // Permet d'afficher la dernière news.

function CCWPACCESS( $prefix_table, $format_date )
{
$this->tprefixe = $prefix_table;
$this->dformat = $format_date;
$this->news = array();
}

function loadPost($bdd, $id)
{
$s = "select post_type, post_title,post_date,post_content from wp_posts where ID = ".$id;
$q=mysqli_query ($bdd,$s);
if ( $r=mysqli_fetch_array($q) )
{
if ( $r["post_type"] == "post" )
{
$this->id = $id;
$this->title = $r["post_title"];
$this->pdate = $r["post_date"];
$this->content = $r["post_content"];
}
}

}

function getTitle()
{
return $this->title;
}

function getDate()
{
return date($this->dformat,strtotime($this->pdate));
}

function getContent()
{
return nl2br($this->content,false);
}

function getNews($bdd, $limit=10)
{
$this->news = array();
$this->idmax = -1;
$s = "select ID,post_title,post_date from wp_posts where post_type = 'post' and post_status = 'publish' order by post_date desc limit 0,".$limit;
$q=mysqli_query ($bdd,$s);
while ( $r=mysqli_fetch_array($q) )
{
if ( $this->idmax == -1 ) $this->idmax = $r["ID"];
$pi = new CCWPAccessItem();
$pi->fromFetch($r);
$this->news[] = $pi;
}
}

function getLastID()
{
return $this->idmax;
}

function displayList($page,$extension)
{
for ($i=0; $i < sizeof($this->news) ; $i++ )
{
$pi = $this->news[$i];
echo "<a href="".$page.$pi->id.".".$extension."">".date($this->dformat,strtotime($this->pdate))." ".$pi->title."";
}
}

}
?>

Voici un exemple de page affichant le dernier article (ou un article défini par le paramètre id) suivi de la liste des articles

<?php
include("cc_wpaccess.php");

$bdd=connect();
$wp = new CCWPAccess("wp_","d/m/Y");

$wp->getNews($bdd,5); // get the five last posts list.

if ( isset($_GET["id"]) ) // If id is specified, let's show this post
$idn = $_GET["id"];
else
$idn = $wp->getLastID(); // else let's show this post
$wp->loadPost($bdd,$idn);

// Sohw the post
echo "<h2>".$wp->getTitle()."</h2>";
echo "
".$wp->getDate()."
";
echo $wp->getContent();

disconnect($bdd);

// Propose the list
echo"<h2>Others news</h2>";
echo "
";
$wp->displayList("news","html");
echo "
";
?>


Mon site est simple. Un bandeau et les articles en dessous. Cette classe et des notions de CSS sont amplement suffisantes pour faire un joli site donc l'affichage est complétement déconnecté de Wordpress.