Listons ensemble tout ce qui existe déjà ou ce qui pourrait être mise en oeuvre pour lutter contre ces âneries.
Ce qui existe déjà
1. Spécification des contenus non indexés
La page listant les "révisions" (pages archivées) n'est pas indexée par Google et les liens de cette page ne sont pas suivis par Google (grâce à la directive
<meta name="robots" content="noindex, nofollow"/>) ; cette protection fait en sorte que le spammeur ne pourra pas profiter, en théorie, d'un bon google ranking du fait des liens vers son site ; ce système est perfectible ; (cf.
PrevenirLIndexationDesRobotsDeRecherche)
2. Faire en sorte qu'il y ait toujours deux entrées dans l'historique
Lors d'attaques de plusieurs de nos Wikini (
http://www.nib-jiq.org/ et
http://www.videontv.org/wikini/), nous avons pu tester la facilité pour revenir à une page antérieure et donc tout l'intérêt du Wiki pour qu'il soit beaucoup plus rapide pour réparer après une attaque malveillante que pour casser. Nous avons même fait une page guide pour que chaque participant du projet ou même chaque visiteur bien intentionné puisse facilement réparer une page pervertie :
http://www.nib-jiq.org/wakka.php?wiki=CommentReparerLesPagesApresUneAttaque
Mais ce n'est pas vrai si la page n'a pas été modifiée depuis plus de trois mois (par exemple les pages expliquant comment utiliser le Wiki sur notre site). Dans ce cas, si la page apparait bien dans l'historique (avec une entrée et la bonne date même si celle-ci est plus ancienne que 3 mois), après une modification bienveillante ou malveillante, il ne reste plus que la dernière version de la page dans l'historique.
Ma proposition serait que l'on ait toujours au moins deux entrées dans l'historique et donc ne supprimer une entrée de plus de trois mois que si il y a eu au moins deux modifications depuis. Comme cela, lorsqu'une page est modifiée de façon malententionnée, il est toujours possible de revenir en arrière, même si la dernière modif date de plus de trois mois. --
JeanMichelCornu
- Ah, toi aussi host-80-95-35-138.dialup.sura.ru est passé par là... Ton besoin pour éditer existe déjà dans wikini (je ne dois pas l'avoir) ? Sinon pour garder des pages vieilles de plus de 3 mois, je suis pour aussi : par exemple avec de la gestion de version (tout comme dans CVS, possibilité de tagguer une version stable du wiki, ce qui permet d'y revenir). -- BenoitAudouard 20040329
- c'est bon j'ai retrouvé la fonctionnalité, on pourrait bannir host-80-95-35-172.dialup.sura.ru maintenant ? ok j'ai vu ci-dessous... -- BenoitAudouard 20040330
La fonctionnalité
dans
WikiNi depuis le 28/08/2003 (CVS, puis publiée dans 0.4.1) mais elle est sans doute insuffisante : ce qui se passe actuellement, c'est que lorsqu'une page est modifiée, on conserve au minimum l'avant dernière version de la page, quelquesoit son ancienneté.
On a donc le scénario suivant :
- pages_purge_time = t (par exemple t = 90 jours)
- nombre de jour d'ancienneté d'une version x donnée d'une PageX? = vx (par exemple v1 = 30 jours ; v2 = 28 jours ; etc.)
- au moment où on modifie une page, par exemple v3 :
- si v1 < t, alors toutes les versions sont conservées (il n'y a aucun problème dans ce cas)
- si v1 > t et que v2 < t alors on obtient : v1 est suprimée, v2 est conservée et v3 devient la dernière version.
- si v1 > t et que v2 > t alors on obtient : v1 est supprimée, v2 est conservée et v3 devient la dernière version.
- si on introduit une v4 dans la même journée que v3 :
- si v2 < t, alors toutes les versions sont conservées (il n'y a aucun problème dans ce cas)
- si v2 > t alors on obtient : v2 est supprimée, v3 est conservée et v4 devient la dernière version.
Conclusion : si je veux supprimer définitivement le contenu d'une page sans pouvoir revenir en arrière : j'attend que son avant-dernière version ai plus de t jours (ce qui est assez fréquent, il n'y a alors pas à attendre) et je modifie deux fois cette page dans la même journée. J'ai bien conscience que le scénario n'est pas satisfaisant, c'est pourquoi je propose le scénario alternatif ci-dessous.
Ce qui pourrait être mis en oeuvre
- 1. Sur le contenu, en amont :
- 1.1. filtre adaptatif sur le contenu (cf : http://www.xhtml.net/scripts/PHPNaiveBayesianFilter.html [fr] )
- 1.2. une blacklist de mots : Une liste de mots "interdit" qui serait remplacé par des XXXXXX dans les pages contenant ces mots. Ce remplacement doit inclure les URLs.
- 1.3. interdire la purge de la dernière page arrivée en période de purge (cf. proposition ci-dessus)
- 2. Sur l'accès, en amont :
- 2.1. la possibilité de passer le wiki en lecture seule (en cas d'attaque massive robotisée avec changement automatique d'IP ou de nom de machine)
- 2.2. filtrer les noms de machine : plusieurs pistes ont été évoquées :
- 2.2.1. la solution de Laurent est un exemple.
- 2.2.2. Autre exemple, pour les serveurs web le permettant, un filtre sur une adresse ip ou un domaine avec le fichier .htaccess : Deny from .sura.ru
- Cela me semble à éviter car faisant appel à un système exterieur à WikiNi. Ceci dit, il peut être utile de le mettre en place tant que WikiNi n'aura pas été modifié pour une protection interne --GarfieldFr. Idem -- CharlesNepote
- 2.2.3. filtrer les noms de machine à partir d'une liste noire, maintenue dans une page d'un wiki(ni) et accessible en écriture par un utilisateur identifié, ou par un administrateur.
- 2.2.4. une blacklist d'adresse/hote : Dès qu'un abus est remarqué par l'administrateur du WikiNi, il peut mettre le nom de l'hote ou son adresse IP dans une liste qui lui interdira l'accès en écriture aux pages de WikiNi
- 2.3. filtrer les "Références"
- 2.4. la possibilité de passer en validation manuelle : demander à l'utilisateur d'entrer un ticket de validation variable à chaque édition ; par exemple quelquechose du genre : "Pour éviter les robots spammeurs nous vos demandons de bien vouloir saisir le 4ème caractère du titre de la page"... (cf. TestAntiRobot)
- 3. En aval, sur la correction/nettoyage des pages vandalisées
- 3.1. Un outil pour l'administrateur afin de nettoyer rapidement le site
- 3.1.1 suppression (intelligente) de toutes les pages mises à jours ou crées par une adresse IP donnée
- 3.1.2 Nettoyage selon date de début et date de fin
- 3.1.3 Restauration d'une ancienne version sans en créer une nouvelle (pas de passage par la page "édition") - c'est aussi dans les SuggestionsRapiditeDeTraitement, section "Optimisation de l'utilisation de la bdd"
(à compléter)
--
CharlesNepote,
DavidDelon et
GarfieldFr
Protection supplémentaire à partir de l'authentification
Ajouter une sécurité au niveau de l'authentification des utilisateurs. Pour ceux qui le désireraient, n'autoriser l'édition de page qu'aux utilisateurs identifiés (cela existe déjà). Le niveau de protection supplémentaire serai d'ajouter un contrôle de l'adresse e-mail pour l'activation du compte utilisateur (option pour le Wiki) par l'envoi d'un mail d'activation comme l'on trouve dans bon nombre d'autre logiciel (phpbb, spip, ...). Cela permet de responsabiliser les personnes participant au Wiki mais réduit un peu l'esprit Wiki. Cela n'empêchera pas les actes mal intentionnés mais cela pourrait les réduire. --
OlivierB
- Je suis d'accord avec cette proposition, qui n'est d'ailleurs pas nouvelle d'ailleurs vu que j'en ai aussi déjà parlé ;-), mais je n'ai pas encore vu de vandale prendre la peine de s'authentifier... :-) Donc, ce ne sera probablement pas très étudié sur cette page-ci. -- ProgFou
1. Sur le contenu, en amont
Rappel des idées :
- 1. Sur le contenu, en amont :
- 1.1. filtre adaptatif sur le contenu (cf : http://www.xhtml.net/scripts/PHPNaiveBayesianFilter.html [fr] )
- 1.2. une blacklist de mots : Une liste de mots "interdit" qui serait remplacé par des XXXXXX dans les pages contenant ces mots. Ce remplacement doit inclure les URLs.
- 1.3. interdire la purge de la dernière page arrivée en période de purge
- 1.4. Ne jamais purger la dernière version enregistrée par le dernier propriétaire de la page
Pour le backlist de certains mots, ou autres filtres, bof bof (solutions 1.1. et 1.2.).
Quand à l'idée de
CharlesNepote (1.3.), c'est tout à fait à quoi je pensais, sans arriver à l'exprimer : avoir toujours un version "potable" d'une page, même en cas d'attaque méchante avec proxy et trottinette. Perso j'ai mis en place une sauvegarde hebdomadaire de la base (merci alternc), mais sauf a sauvegarder toutes les heures on n'est pas à l'abri d'une attaque du genre "je fais 20 fois sauver", surtout pour un wiki au contenu politique ou engagé.
--
DaOuar
Je pense que la solution 1.3. est vraiment importante car beaucoup d'utilisateur n'ont pas les moyens et les compétences de réaliser des sauvegardes quotidiennes. C'est donc une de mes priorités. Je partage l'avis de
DaOuar sur les solutions 1.1. et 1.2. On peut vouloir écrire des cochonceté à dessein, comme par exemple un site de blague cochonnes. Le site de
DaOuar, par exemple, n'a pas vocation à faire dans le politiquement correct et c'est heureux.
--
CharlesNepote
2004-04-02
Je viens de regarder le code de
WikiNi, il n'y a pas de limite au nombre de versions sauvée pour une page. L'histoire des 20 pages concerne
l'affichage du nombre de révision d'une page et c'est un paramètre utilisateur. Donc pourir un
WikiNi en enregistrant plus de 20 fois une page ne fonctionne pas. Une révision de page n'est supprimée que si elle est plus vieille que 90 jours (par défaut) et en gardant toujours 2 versions de la page. Donc pour que la page soit irrécupérable, il faudrait que le "mechant" enregistre 2 fois une page pourit et que l'administrateur ne s'en apperçoive que 90 jours plus tard.
--
GarfieldFr
- Ton raisonnement est tronqué car il existe de très nombreux cas où :
- il existe deux versions de page plus anciennes que le délai de purge et seulement ces deux versions
- le "méchant tout plein" fait deux modifications dans la journée
- les deux anciennes pages sont donc supprimées car il y a bien deux pages dans l'historique
- C'est la raison pour laquelle je propose de faire en sorte qu'il y ait toujours dans l'historique une entrée plus ancienne que le délai de purge (cf. ma proposition ci-dessus).
- . -- CharlesNepote
- En effet, je n'avais pas poussé mon raisonnement assez loin. --GarfieldFr
1.3 Faire en sorte qu'il y ait toujours dans l'historique une entrée plus ancienne que le délai de purge
Il faudrait mettre en oeuvre le scénario suivant : on conserve obligatoirement la dernière version d'une page ayant dépassée le temps de purge. On aurai donc le scénario suivant :
- au moment où on modifie une page, par exemple v3 :
- si v1 < t, alors toutes les versions sont conservées (il n'y a aucun problème dans ce cas)
- si v1 > t et que v2 < t alors on obtient : v1 et v2 sont conservées et v3 devient la dernière version.
- si v1 > t et que v2 > t alors on obtient : v1 est supprimée, v2 est conservée et v3 devient la dernière version.
- si on introduit une v4 dans la même journée que v3 :
- si v2 < t, alors toutes les versions sont conservées (il n'y a aucun problème dans ce cas)
- si v2 > t alors on obtient : v2 et v3 sont conservées et v4 devient la dernière version.
On assure donc une bonne sécurité de l'ensemble, un malfaisant devant obligatoirement attendre "t" jours avant que son acte malfaisant puisse prendre effet, ce qui laisse largement le temps de s'en apercevoir.
Est-ce que ma proposition est claire ? Qu'en pensez-vous ?
--
CharlesNepote
- Oui, cela me semble une protection suffisante. La quasi totalité des actes de malveillance se font ponctuellement. l'idée de se protéger de plusieurs modifs dans la même journée me semble très bonne.
- Cela rend de nouveau vrai les conseils que j'ai proposé aux participants et même aux visiteurs d'un site pour le protéger et même le réparer avant que le jardinier ne s'en rende compte : http://www.nib-jiq.org/wakka.php?wiki=CommentReparerLesPagesApresUneAttaque (il verifiera tout de même si c'est une vrai réparation grâce à la comparaison entre deux versions ;-).
- En tout cas je suis presque content de cette attaque car malgré qu'il ait fallut aller réparer des vieilles pages (j'avais des pages InscrivezVous? et ModifiezUnePage? qui avait plus de 3 mois, mais je les ai recopiées depuis d'autres Wiki. C'est bien pratique d'avoir plusieurs Wiki :-) cette attaque a permis de faire de la pédagogie : Le premier réflexe des utilisateurs est : il faut fermer le site ! mais en moins de 20 secondes (pour les pages pas trop vieilles...) alors qu'une des personnes m'en parlait au téléphone, j'ai tout réparé (alors que je ne suis même pas le webmestre-jardinier du Wiki attaqué). Le vandale pour sa part a mis 3 heures pour chercher et modifier les pages...
- Qu'il recommence ! il est tout seul et maintenant une bonne vingtaine de personnes peuvent corriger son bazar en vingt secondes :-)
- Résultat, grâce à cette aventure, j'ai pu expliquer à pas mal de personnes pourquoi un Wiki ouvert avantage ceux qui font des contribs par rapport aux vandales alors que normalement c'est totalement incompréhensible et anticulturel à quelqu'un qui n'a pas l'habitude du Wiki.
- C'est pour cela que le Wiki est le premier outils de collaboration qui me bleuf ! Il a réussit à montrer un exemple concret de l'opposition entre gérer par contrainte (on se protège des pirates) et gérer des opportunités (on permet à d'autres personnes pas identifiées à priori de faire des apports). C'est très exactement le genre de différences qui fait la différence entre la gestion de projets traditionnels et la gestion de projets coopératifs que je présente dans --Jean-Michel
Et bibi propose son premier jet de code qui à l'air de fonctionner (à vérifier néanmoins car je n'ai testé que les requêtes SQL). Il s'agit uniquement de modifier la fonction
PurgePages(), en la simplifiant par ailleurs puisque le processus est maintenant le suivant :
- on recherche toutes les versions de pages qui ont dépassé le délai de purge
- pour chaque version de page, on supprime toutes les versions qui lui sont plus anciennes : seule reste donc la moins ancienne des versions qui ont dépassé le délai de purge
<?php
function PurgePages()
{
if ($days = $this->GetConfigValue('pages_purge_time'))
{
// Selection of every versions older than the page_purge delay
$pages = $this->LoadAll("
select distinct tag, time from ".$this->config['table_prefix']."pages
where time < date_sub(now(), interval '".mysql_escape_string($days)."' day)
and latest = 'N' group by tag order by time asc");
// For each page, delete every version older than the youngest version
foreach ($pages as $page)
{
$this->Query("
delete from ".$this->config['table_prefix']."pages
where time < '".mysql_escape_string($page['time'])."'
and tag = '".mysql_escape_string($page['tag'])."'");
}
}
}
?>
Qu'en pensez-vous ? Il s'agit selon moi d'une nécessité majeure si l'on veut correctement protéger un site sous
WikiNi.
J'ajoute que la modification étant triviale et n'apportant que des avantages, on peut facilement imaginer l'intégrer dans la prochaine 0.4.2 (la documentation n'étant pas en place, on peut faire passer cette évolution fonctionnelle primordiale).
--
CharlesNepote
Je ne l'ai pas encore testé, mais sur le principe je suis tout à fait d'accord. --
DavidDelon
Suite à discussions via Jabber avec
ProgFou, on a corrigé la requête SQL (merci
ProgFou) et on a convenu que le fait de pouvoir conserver
n versions n'avait pas un intérêt extraordinaire. --
CharlesNepote
Je vais essayer sur une version locale de wikini.net pour être sûr des résultats. --
CharlesNepote
ProgFou, il y a un problème pour la sélection des pages plus anciennes que le délai de purge (j'ai fixé 60 jours dans mon exemple) :
SELECT distinct tag, time
FROM wikini_pages
WHERE time < date_sub( now( ) , INTERVAL '60'
DAY ) AND latest = 'N'
and tag='WikiniSemantique'
GROUP BY tag
ORDER BY time ASC
me donne :
WikiniSemantique 2004-04-07 18:24:55
alors qu'il existe aussi :
WikiniSemantique 2004-04-12 19:15:02
La bonne requête me paraît donc bien être :
SELECT distinct tag, time
FROM wikini_pages
WHERE time < date_sub( now( ) , INTERVAL '60'
DAY ) AND latest = 'N'
and tag='WikiniSemantique'
ORDER BY time ASC
qui me donne bien :
WikiniSemantique 2004-04-07 18:24:55
WikiniSemantique 2004-04-12 19:15:02
(note que j'ai enlevé le
GROUP BY tag)
[Ce qui n'est pas correct vis-à-vis du DISTINCT, AMHA. -- ProgFou]
En effet, le but c'est bien de sélectionner toutes les versions d'une page antérieures au délai de purge, puis, pour chacune des ces pages sélectionnées, d'effacer les pages plus anciennes : ainsi on ne conserve qu'une seule page plus ancienne que le délai de purge. J'ai fait des tests grandeur nature avec un backup de wikini.net et ça à l'air de fonctionner parfaitement. Je confirme que cela parait bien fonctionner, mais cela multiplie les requêtes SQL dans le cas d'un gros wiki comme wikini.net : le temps SQL monte à plus de 80%... --
CharlesNepote
- Mhhh... Je ne comprends pas ton idée... Il me semble qu'il y a un problème de cohérence dans l'algorithme. Tu parles tout d'abord de sélectionner des versions de pages, puis de travailler sur les pages sélectionnées, ce n'est pas cohérent AMHA. Moi j'avais compris ton algorithme ainsi : sélectionner les pages pour lesquelles il existe des versions à purger (DISTINCT et GROUP BY impératifs) puis, pour chacune de ces pages, effacer toutes les versions à purger sauf la moins ancienne. Le code SQL que j'ai validé au début correspond bien à cet algorithme. Si cet algorithme n'est pas ce que tu attendais, il faut le ré-exprimer plus clairement et corriger le code SQL au dessus. -- ProgFou
Pour mémoire, je reproduis nos discussions via Jabber :
--
CharlesNepote
Le problème de votre
GROUP BY est qu'il est fait avant
DISTINCT et
ORDER BY. Du coup on n'est pas sûr que le
time qu'on va obtenir sera le plus petit (il faudrait lui passer un
MAX dessus en fait, pour ensuite faire la suppression par comparaison "plus petit ou égal"). A noter que le
DISTINCT ne sert normalement plus à rien dès qu'il y a un
GROUP BY sur uniquement des champs sélectionnés, puisque le regroupement fera déjà qu'il n'y aura pas deux lignes de résultats dont les champs spécifiés dans la clause
GROUP BY seront les mêmes (donc toutes les lignes seront différentes)
Dans le cas présent le
DISTINCT est de toute façon inutile puisqu'il ne peut pas exister deux pages dont la combinaison tag-time soit identique (probabilité murphique: il faudrait que deux personnes arrivent à envoyer deux versions d'une même page à des moments tellement proches quand le
HanlerEdit? vérifie si la page n'a pas été éditée entretemps pour la deuxième personne, l'insertion de la première ne soit pas encore faite... Ou alors il faut truquer la base de données !) --
LordFarquaad
Comme je l'ai dit dans
SuggestionsRapiditeDeTraitement, voici ma version en deux requêtes (nb.: ça doit être faisable en une seule avec
MySQL4?):
<?php
if ($days = $this->GetConfigValue("pages_purge_time")) { // La purge est-elle active ?
// selection des pages à supprimer: passage obligé car même mysql ne gère pas les delete multi-tables avant la version 4.0
$wnPages = $this->GetConfigValue('table_prefix') . 'pages';
$sql = 'SELECT DISTINCT a.id FROM ' . $wnPages . ' a,' . $wnPages . ' b WHERE a.latest = \'N\' AND a.time < date_sub(now(), INTERVAL \'' . addslashes($days) . '\' DAY) AND a.tag = b.tag AND a.time < b.time AND b.time < date_sub(now(), INTERVAL \'' . addslashes($days) . '\' DAY)';
$ids = $this->LoadAll($sql);
if (count($ids)) { // il y a des pages supprimer (on pourrait aussi vérifier qu'il y a plus de n pages à supprimer pour ne pas faire de requête s'il y en a peu
// fabrication de le requête de suppression...
$sql = 'DELETE FROM ' . $wnPages . ' WHERE id IN (';
foreach($ids as $key => $line){
$sql .= ($key ? ', ':'') . $line['id']; // nb.: le champ id est un int => rien chapper, pas besoin de guillemets
}
$sql .= ')';
// ... et exécution
$this->Query($sql);
}
}
?>
(code non testé, je n'ai d'ailleurs pas de base de données suffisemment grosse pour le faire, mais j'ai confiance)
NB. au sujet des performances:
MySQL optimise les
DISTINCT de sorte que quand elle (il ? lol Non, une fille c'est mieux entre le
PhP et l'Apache :D) aura trouvé un
a.id, elle arrêtera de chercher dans la table b, puisque les champs de la table b ne nous intéressent pas.
--
LordFarquaad
- Explications. On fait une sélection en travaillant deux fois sur la table wikini_pages simultanément. Pour ce faire, on est obligé de leur donner des alias (FROM ' . $wnPages . ' a,' . $wnPages . ' b). Je vais d'ailleurs parler de "table a" et "table b" dans la suite, bien qu'il s'agisse en fait de la même...
- MySQL prend dans la table a les entrées qui ne sont pas la dernière version (WHERE a.latest = \'N\') mais antérieures à la date de purge (AND a.time < date_sub(now(), INTERVAL \'' . addslashes($days) . '\' DAY) - il s'agit d'une optimisation)
- et cherche dans la table b une entrée ayant le même tag (AND a.tag = b.tag), mais une date de modification ultérieure à celle de l'entrée de la table a (AND a.time < b.time) et également antérieure à la date de purge (AND b.time < date_sub(now(), INTERVAL \'' . addslashes($days) . '\' DAY)).
- Du coup la version la plus récente ayant dépassé la période de purge ne sera pas supprimmée (il n'y aura pas de version dont la date est comprise entre sa date et la date correspondant à la période de purge), mais toutes les versions antérieures à celles-ci le seront.
- Normalement une requête de ce type pourrait être très longue vu le nombre de combinaisons possibles, mais grâce au DISTINCT et au fait qu'on ne sélectionne que le champ id de la table a, MySQL arrêtera de chercher des correspondances dans la table b dès qu'elle en aura trouvé une, et passera à l'entrée suivante de la table a. (sans le DISTINCT une même version pourraît se retrouver plusieurs fois dans le résultat s'il y a plusieurs versions entre sa date de modification et la date de purge) -- LordFarquaad
- Sinon je pense que la requête de suppression devrait être très rapide (plus rapide même que celle de sélection) car MySQL n'a qu'à parcourir les éléments un à un et vérifier s'ils sont dans la liste fournie ou non. Le problème de lenteur actuel est dû au fait que la suppression se fait à l'intérieur d'une boucle (qui contient d'ailleurs deux requêtes) -- LordFarquaadASuivre
Ok. Ca a l'air de fonctionner parfaitement d'après mes premiers tests et c'est en effet plutôt rapide tant qu'il n'y a pas des dizaines de pages à purger. Je nous laisse encore un petit délai de réflexion (mettons jusqu'à mercredi 12) du fait qu'il s'agit d'une modification touchant une fonction sensible. Cela dit, un grand bravo
LordFarquaad pour tes résultats qui dépassent mes espérences : non seulement on gagne en fiabilité (puisque qu'on conserve désormais la dernière page arrivée en période de purge) mais également en performance ! Pour vérifier avec certitude que cela fonctionne bien, j'envisage de l'implémenter quelques temps sur wikini.net pour en observer le fonctionnement. Qu'en pensez-vous tous ? --
CharlesNepote
- Il serait peut-être bon d'imaginer un système logs à ce moment là, où les entrées supprimmées seraient d'abord recopiées dans une autre table (ayant la même structure que wikini_pages). Etant donné que la requête de sélection est assez complexe, je pense que le mieux serait d'utiliser une requête de ce genre:
- "INSERT INTO wikini_deleted_pages SELECT * FROM wikini_pages WHERE where_cond" où where_cond est la même condition que pour la requête de suppressio
- A noter que, si je ne me trompe, INSERT... SELECT ne fonctionne qu'avec MySQL4?. Par ailleurs cela aura pour conséquence de ralentir la purge, donc ceci ne pourrait être mis en oeuvre en même temps que les tests de performances. (je pense qu'il est préférable de faire d'abord ceci pour vérifier la fiabilité, et ensuite de faire les tests de performances) -- LordFarquaad
Optimisation : calcul de la date de purge via php
Une optimisation possible (et certainement bonne car elle éviterait à
MySQL certains calculs) consisterait à construire la date de purge via php au préalable. Je sais que
MySQL évalue une seule fois le
NOW() pour toute la requête, mais je suppose qu'à chaque nouvelle entrée dans la table a ou la table b, elle recalcule le
DATE_SUB et le
INTERVAL, malgré que ce soit toujours la même valeur... --
LordFarquaad
- Oui. On peut voir dans un second temps. -- CharlesNepote
- Je pense que ce serait une optimisation assez importante et qu'il vaudrait mieux faire les tests avec, car cela réduit considérablement le nombre de calculs côté mysql. Le seul truc c'est qu'il faudrait faire attention au timezone, puisque les pages sont sauvées avec le tz du serveur. A noter qu'à l'échelle de 90jours, supprimer les pages avec une heure ou deux d'avance ou de retard (une demie journée au pire) ne serait pas trop grave je pense, c'est donc peut-être négligeable... En tout cas pour avoir la date de purge (sans se soucier du tz):
- $purge_date = date('Y-m-d H:i:s', time() - $days * 86400);
- Cette date est normalement retournée en utilisant le fuseau horaire du serveur, qui devrait être le même que pour mysql (sauf si le serveur mysql se trouve ailleurs...)
- -- LordFarquaad
- Ce qui m'ennuie c'est que, dans le cas où la base et le serveur web sont sur deux serveurs différents, si un jour il y a l'horloge d'un serveur qui tombe en panne, il y a un risque pour que tous les contenus soient effacés. Non ? -- CharlesNepote
- La dernière version ne pourra être effacée grâce au WHERE a.latest = \'N\'. Je ne sais pas si c'est vraiment nécessaire d'envisager ce genre de cas, je pense qu'en général l'horloge interne de la plupart des serveurs est assez fiable, et que si elle se met à dérailler ce serait beaucoup trop aléatoire que pour qu'on puisse y faire quelque chose a priori... De toute façon ça m'étonnerait qu'une horloge qui déraille se mette à avancer de beaucoup... [Je pense que CharlesNepote fait plutôt allusion à désynchronisation d'horloges entre deux serveurs, ce qui est déjà beaucoup plus fréquent. Pour éviter cela, il faut toujours travailler avec l'heure du serveur MySQL en utilisant des fonction comme NOW(). -- ProgFou - C'est pour cette question que j'avais parlé du TZ plus haut en fait, je pense que le déphasage entre les deux serveurs est assez négligeable...-- LordFarquaad]
- Sinon ce qui est faisable aussi, c'est de récupérer la date de purge dans une première requête et de la réinsérer dans le select. Il faudrait faire des tests pour voir quel est le plus performant (les requêtes en elles-mêmes seraient plus performantes, mais ce qui prend le plus de temps c'est la communication entre le module php et le serveur mysql...) -- LordFarquaad
- Ce qui arrive fréquement (pour l'avoir vu personnellement plus d'une fois), c'est que lorsqu'une horloge déraille, elle revient à la date de 01-01-1980 (ou 1970 je ne sais plus) : dans ce cas le risque est bien réel. Franchement je ne souhaite pas du tout prendre ce risque. -- CharlesNepote
- Ah ok, je ne croyais pas que tu parlais de ce genre de truc... En principe ça revient au 1970-01-01 = Epoch = "naissance" de Unix. Ok, ça arrive fréquement sur les vieux PC, dont la batterie (ou la pile CR-2032 de nos jours) ne fonctionne plus. Mais ça n'est pas sensé arriver sur un serveur un tant soit peu sérieux ! D'autant plus que tout serveur correctement installé doit se mettre à l'heure au démarrage, puis synchroniser son horloge régulièrement (via NTP par exemple : apt-cache show ntp-simple). Donc pour ma part, je ne gèrerais pas ce genre de problème. Sinon, autant essayer aussi de gérer les barrettes mémoire défectueuses... ;-) -- ProgFou
- Tout à fait d'accord. A la limite faire une requête pour récupérer le NOW() et le réinsérer ensuite s'il y a un gain de performance, mais sinon je pense que le mieux est de calculer cela en php. (en fait je trouve que les dates auraient dû toujours être calculées via php, étant donné que c'est php et non mysql qui traite la majeure partie des données, notemment l'affichage) -- LordFarquaad
Optimisation : purge par paquet
Avec le principe que tu utilises, pour optimiser la fonction on pourait purger par paquet : par exemple : 1/10ème par 1/10ème évitant un long temps d'attente pour celui qui "tombe" sur la purge. Ton idée de valeur en deça de laquelle il ne faut pas purger est aussi à retenir. --
CharlesNepote
Je ne pense pas que ce soit si intéressant de ne purgrer qu'une fraction étant donné que le plus lent est la requête de sélection. --
LordFarquaad
Optimisation : purge conditionnelle
Par contre ce qui pourrait être intéressant c'est une purge conditionnelle : dans certains cas on n'effectue pas la suppression car le script "estime" que ça n'en vaut pas le coup (par exemple faire une requête pour supprimer moins de x pages ne serait pas assez intéressant)
- Oui, pourquoi pas. Peux-tu préciser les cas ? Pour le fait de ne pas supprimer moins de x pages, ce qui m'ennui c'est qu'on ne respecte donc pas le délai de purge (mais est-ce si important ?) (et encore : il est possible qu'à 8 heures du matin on ai 6 pages à supprimer et 19 pages à 20 heures : ce qui ferait que toutes les pages seraient bien supprimées dans la journée). -- CharlesNepote
En fait je pensais principalement au fait de ne pas purger quand il y a trop peu de pages à supprimer (avec une nombre minimum choisi par l'utilisateur), mais l'idéal serait probablement une estimation plus complexe basée sur différentes choses:
- Le temps écoulé depuis la date de dernière purge
- La charge du serveur (mais difficile à estimer pour un serveur mysql distant...)
- Le nombre de pages éditées au cours des x derniers jours, semaines, mois (si on est dans une période d'activité intense, alors on peut laisser la purge se faire lors d'une prochaine page...)
- ...
En fait ces facteurs pourraient influencer la probabilité de lancer une purge. Je vois bien une probabilité de ce genre:
- (1 - "période minimale entre deux purges" / (facteur1 * "temps écoulé depuis la dernière purge")) * (1 - "charge du serveur" / facteur2) * ("nombre de pages éditées au cours des derniers jours" / facteur3) * ...
Ensuite, après la sélection des pages à supprimer il ne reste plus qu'à vérifier combien il y en a, et ne pas le faire s'il y en a peu. --
LordFarquaad
Optimisation : purge conditionnée par la date de la dernière purge
Ce qui serait bien c'est de passer certains paramètres de configuration dans la base de données, comme ça on pourrait aussi vérifier d'abord la date de la dernière purge... --
LordFarquaad
Il y a deux possibilités en fait:
- Soit on ne fais jamais de purge si la période minimale entre deux purges n'est pas dépassée
- Soit on laisse ce facteur réduire la probabilité d'une purge dans la formule que je propose ci-dessus
--
LordFarquaad
On en revient encore et encore au même problème : la possibilité d'intégrer des données de configuration dans la base de manière souple. Et la encore, un stockage sous la forme de triplets (RDF ou éventuellement notre sauce (mais je préfèrerai RDF)) permettrai d'avoir une grande souplesse. Exemple pour résoudre ce présent problème (j'ai utilisé la
notation N-Triples qui est très proche de ce qui serait stocké dans la base) :
<
http://www.wikini.net/wakka.php?wiki=CeWiki> <
http://wikini.net/vocabulaire/DernierePurge> "2005-01-15" .
--
CharlesNepote
Ah oui c'est sûr, ce serait une optimisation à faire une fois que cette décision sera prise, en attendant on peut se contenter de ne pas faire la requête de suppression s'il y a trop peu de pages à supprimer. Il faut voir le gain:
- Avantage:
- Une requête en moins (ça peut être considérable, quand on voit des logiciels comme PhpBB? auxquels on reproche déjà de faire trop de requêtes, alors que de base il n'y en a que 10-15 par page... WikiNi c'est facilement 30-40 vu que c'est principalement proportionnel au nombre de liens internes de la page)
- Inconvéniants
- Certaines pages peuvent rester longtemps sans être supprimées (est-ce si grave ? la purge sert à diminuer l'espace occupé par la bdd, or s'il y a peu de pages à supprimer, il y a peu d'espace à gagner... On pourrait éventuellement jouer sur l'espace occupé par les pages d'ailleurs (en mysql: l'utilisation de LENGTH sur le champ body devrait être une indication suffisante [à multiplier par deux tant que le champ body sera indexé...]))
- Le fait de supprimer des pages de la base de données diminue le nombre de résultats qu'il y aura au prochain SELECT effectué pour la purge. Dans le cas présent il est probable que la vitesse de cette requête dépende fortement du nombre de résultats potentiels (par "potentiel" je veux dire les pages qui sont entérieures à la date de purge et qui ne sont pas la dernière version, cela correspond à la première partie de la requête), donc si on ne supprime pas les pages à chaque coup; on alourdit les requêtes suivantes...
--
LordFarquaad
1.4 Ne jamais purger la dernière version enregistrée par le propriétaire de la page
31/03/2004 - Encore une autre solution qui pourrait être mise en oeuvre pour pallier à la limite de l'historique des révisions d'une page (quelque soit la profondeur de cet historique) : Ne jamais purger la dernière révision enregistrée par le propriétaire de la page !
- 1. Une première mise en ?uvre possible : pour "sauvegarder" sa page, le propriétaire n'a qu'à faire une modification (même insignifiante comme ajouter un espace, une ligne vide, un point ... peu importe) pour que sa page soit sauvegardée, car lors de l'ajout d'une révision de cette page l'historique de ses révisions sera géré come suit :
- si la plus ancienne révision de cette page est la dernière à avoir été éditée par le propriétaire, alors cette révision est conservée au détriment de la révision suivante qui sera purgée;
- sinon la révision est purgée et cela signifie qu'au moins une révision encore présente a été faite par le propriétaire de la page.
- Ce traitement peut être ajouter de manière totallement transparente pour les utilisateurs, et ne nécessite aucune modification de la structure de la base, par contre, c'est un traitement qui risque peut-être d'alourdir l'enregistrement d'une page (rien que parcequ'il faut évaluer où se trouve la dernière révision du propriétaire).
- 2. Une autre possibilité serait d'ajouter une fonction de sauvegarde pour le propriétaire de la page : cela serait plus simple pour lui, il n'aurait pas à ajouter artificiellement des modifications bidons pour sauvegarder sa page (éventuellement, on peut considérer qu'une édition de la part du modérateur entraine une sauvegarde de la page en l'état de cette dernière révision). Pour réaliser cela, je ne vois que deux moyens :
- 2.1. soit ajouter dans la base un attribut associé à chaque page qui permette de savoir quelle est la révision de sauvegarde dans l'historique. La gestion de cet historique serait alors quasiment similaire à celle exposée dans la solution 1 mais en plus simple : si la page à purger est la sauvegarde, alors on la conserve et on purge la suivante.
- 2.2. soit enregistrer à part (en dehors de l'historique) la révision de sauvegarde de cette page (en créant un nouvelle table ? du moins une nouvelle entrée dans une table), mais cela me semble plus lourd et redondant avec l'historique.
Pour toutes ces raisons, la solution que je privilégierai serait d'ajouter un marqueur de sauvegarde (par un attribut dans la base) à une révision de l'historique (solution 2.1 donc), car cela conjugue une facilité d'emploi pour les utilisateurs avec une charge de traitements raisonnables pour déterminer quelle révision est à conserver.
-- Yxorp
Lorsque le propriétaire dédits pages concernées s'identifie il aura accée à une version de celle-ci que les "simple vandal" ne peuvent n'auront pas connaissance --
SloYvY
- Ça revient à l'idée de toujours garder la dernière version du propriétaire (au moins), ce qui me paraît une bonne idée. -- ProgFou
-- Moi aussi je pense qu'il vaut mieux une solution basée sur la facilité de reconstruction, comme ce que propose
CharlesNepote, et pour intégrer l'idée de la dernière version du propriétaire, il suffirait de conserver les DEUX dernières révisions, celle du propriétaires et/ou une entrée plus ancienne que le délai de purge. Qu'est-ce qu'il faut modifier en PHP et où ? -- Bastien
Pour chaque page, on pourrait garder toutes les révisions suivant la dernière révision par le propriétaire de la page, cette dernière faisant donc autorité. Ainsi, en cas de vandalisme, il suffirait d'
effacer toutes les révisions faites depuis l'adresse du vandal, tout simplement. Attention cependant aux gens qui passeraient à plusieurs derrière un proxy... On pourrait améliorer le filtre d'effacement par une date de début vandalisme. --
ProgFou
2. Sur l'accès, en amont
- 2.1. la possibilité de passer le wiki en lecture seule (en cas d'attaque massive robotisée avec changement automatique d'IP ou de nom de machine)
- 2.2. filtrer les noms de machine : plusieurs pistes ont été évoquées :
- 2.2.1. la solution de Laurent est un exemple.
- 2.2.2. Autre exemple, pour les serveurs web le permettant, un filtre sur une adresse ip ou un domaine avec le fichier .htaccess : Deny from .sura.ru
- Cela me semble à éviter car faisant appel à un système exterieur. Ceci dit, il peut être utile de le mettre en place tant que WikiNi n'aura pas été modifié pour une protection interne --GarfieldFr. Idem -- CharlesNepote
- 2.2.3. filtrer les noms de machine à partir d'une liste noire, maintenue dans une page d'un wiki(ni) et accessible en écriture par un utilisateur identifié, ou par un administrateur.
- 2.2.4. une blacklist d'adresse/hote : Dès qu'un abus est remarqué par l'administrateur du WikiNi, il peut mettre le nom de l'hote ou son adresse IP dans une liste qui lui interdira l'accès en écriture aux pages de WikiNi
- 2.3. filtrer les "Références"
- 2.4. la possibilité de passer en validation manuelle : demander à l'utilisateur d'entrer un ticket de validation variable à chaque édition ; par exemple quelquechose du genre : "Pour éviter les robots spammeurs nous vos demandons de bien vouloir saisir le 4ème caractère du titre de la page"... (cf. TestAntiRobot)
2.1 Passer le wiki en lecture seule
Cf.
BasculerUnWikiEnLectureSeule
2.2 filtrer les noms de machine
Problème : Il n'y a pas de limite dans le nombre d'édition d'une page pour une IP (testé sur
WikiNi 0.1.1.0.3)
Cela peux entrainer quelqu'un de mal intentionné à détruire un wiki. Il suffit de sauver 20 fois une page vide pour que la récupération de la page soit impossible.
Solution ? A mon avis, quand une IP différente à celle de la derniere modification sauve une page plusieurs fois, il faudrait que la 20eme modification reste celle qui à une IP autre (pas facile a expliquer) : maichan.com veux detruire une page, il sauve 20 fois, mais wikini est malin, il remarque que les 20 derniers changements proviennent de la même IP, et garde le dernier changement fait avec une IP différente.
Ou alors, limiter à 19 édition par IP...
Est-ce grave docteur ?
--
DaOuar
Non. Il y a beaucoup d'autres possibilités pour pourrir un Wiki en général (et donc
WikiNi en particulier) et la limitation de modification par l'adresse IP ne sert pas à grand chose pour un "méchant"... Il est assez facile de fabriquer un petit robot pour saturer toutes les pages et faire un vrai merdier. Tous les concepteurs de Wiki en sont conscients. Vraiment, la seule méthode efficace c'est la sauvegarde régulière de la base (au moins quotidiennement). Et ce type de problème est vraiment ultra-rarissime. On peut toujours y réfléchir mais il ne faut pas fantasmer sur les solutions... Je suggère que tu déplaces ta proposition dans
VosSuggestions, car il ne s'agit pas d'un bogue.
--
CharlesNepote
Exact, ce n'est pas un bug. Mais une limitation par IP, ou mieux garder la derniere modif avec un IP différent pourait décourager les 'maichan" du dimanche. Si il faut se déconnecter, ou utiliser un proxy, il faut vraiment avoir envie de faire chier (d'ailleur je vais aller faire une sauvegarde de notre base de donnée, tiens :)
[ il existe un programme multi-poxy qui permet de changer de proxy pour chaque requête HTTP ou pour chaque site. Cela permet d'être anonyme car l'IP du client est celui du proxy qui change à chaque requête! --GarfieldFr]
--
DaOuar
2.2.1
Vu qu'il est revenu à la charge aujourd'hui (lendemain) voici un petit script à mettre dans wakka.php pour lutter contre CE spammeur, mais bien sûr c'est un patch temporaire, en attendant la tempête !!
tout au debut de wakka.php :
// check for the motherfucker/son of a bitch with a sura.ru domain
// get infos from user
$whoisit = strtolower(gethostbyaddr($_SERVER['REMOTE_ADDR']));
if ( strpos($whoisit,"sura.ru") ) {
header("Location:http://www.google.com");
exit;
}
-- laurent
2.2.3.
Ca permettrait au "plaisantin" (disont vandale) d'accéder uniquement à cette page en lecture (dès qu'il arrive il est renvoyé dessus). Avec un redirect en 5 s vers google (pour lui...). Si besoin les gens intéressés pourraient signaler (par un moyen à trouver) qu'ils souhaiteraient sortir de la blacklist... Je privilégie le mode wiki qui permettrait d'intervenir sans accès au serveur (contact admin...). Sur wikipedia je crois me rappeler qu'il y a un mode de blacklist, je ne sais plus trop comment il est implémenté (au niveau fonctionnel j'entends). --
BenoitAudouard 20040330
2.3 filtrer les "Références"
2.4 la possibilité de passer en validation manuelle
Parfois dans mes web-promenades, je m'enregistre, et pour ce faire je suis obligé de lire une image de quelques chiffres, illisibles par un robot. Pourquoi ne pas utiliser ce procédé ? --
FidelioEspoir
- Parce qu'il ne fonctionne pas pour les aveugles (cf. TestAntiRobot). -- CharlesNepote
- L'argument de l'accessibilité pour les aveugles n'est pas très pertinent, car éditer du contenu tel qu'un wiki reste problématique pour eux (essayez !). Par contre, même des bon-voyants peuvent être dérangés par des images mal conçues et illisibles pour eux aussi, ou très désagréables à décrypter. -- Gniarf
30/03/2004 - Conscient des possibilités de vandalisme potentiel sur un Wiki, et dans le cadre d'un
site communautaire francophone sur Linux Slackware, nous avons choisi de n'autoriser l'édition des pages qu'aux membres authentifiés du site. Cela a bien évidemment nécessité la modification du code de
WikiNi pour intégrer la gestion des comptes utilisateurs avec celle du site. Après tout,
notre Wiki est un espace de travail pour les contributions des membres, donc cela ne va pas dans le sens contraire de "l'esprit Wiki" dans ce cadre précis. Bien évidemment, cela n'empêche pas qu'une personne créée un compte pour polluer le Wiki, mais ça reste une barrière somme toute acceptable pour empêcher les abus et ne pas gêner les membres actifs qui souhaitent contribuer. Ce qui serait souhaitable, surtout avec la démocratisation des Wikis et la recherche des nouvelles techniques de "spam référenceurs", ce serait de :
- 1. permettre à WikiNi de n'autoriser l'édition des page qu'aux personnes authentifiées. Ça ne résoudrait évidemment pas le problème, mais ça rajouterait une "barrière". [C'est déjà intégré : il suffit de mettre un + dans les droits d'écriture. -- ProgFou]
- 2. Une autre fonctionnalité serait d'enregistrer l'adresse IP de l'éditeur, même s'il est authentifié afin de pouvoir remonter à la source dans le cadre des abus répréhensibles par la loi qui attribue malheureusement à l'hébergeur la responsabilité de son contenu. C'est regrettable d'en arriver là, j'en conviens, mais avec la nouvelle loi sur l'économie numérique, celui qui reste impassible et qui met en place un Wiki se tire un balle dans les pieds. [Je serais également assez pour ajouter une colonne ipaddr à la table des pages. -- ProgFou]
--
LiNuCe
3.
- 3.1. Un outil pour l'administrateur afin de nettoyer rapidement le site
- 3.1.1 suppression (intelligente) de toutes les pages mises à jours ou crées par une adresse IP donnée
- 3.1.2 Nettoyage selon date de début et date de fin
3.1 me paraît également un excellent outil ! --
CharlesNepote
Pouvoir éliminer les ajouts d'une IP précises serait un grand plus pour "dépourrir" un wiki touché. --
DaOuar
-- Oui IP précise, mais les "anonymous" passant par des sites ad hoc ? tu ne pourras les interdire -- Je ne crois plus aux lignes Magino...mais au plan de reconstruction facile ....--
FidelioEspoir
Ailleurs
une idée de
PhpWiki :
I also wish to block robots to dig through diff, info, etc pages from my wiki sites, and currently I only check their user agents. However, instead of sending status 302 back to the bots, I use a little SEO trick called cloaking, i.e. sending back different contents when I detect a bot. For example, in my template/browse.html, I don't include the toolbar at bottom (which has all the links to different actions) when a bot is requesting that page. There are other cloaking tricks you can do to avoid stupid search engine bots (or to grab their attentions), but not all cloaking usage are approved by the seach engine companies. --
ScottYang?
-> Avoir une liste d'ip et de nom de domaines dans une blacklist, c'est toujours utile. Il n'affiche pas la barre des outils et sans doute n'accepte aucune requete POST de la part d'ip ou nom de domaines (NS lookup) dans la blacklist.
-- Propos d'un non-informaticien : La défense a plusieurs niveaux : la page, un ensemble de page, le wiki affiché, la base,..le serveur...la brevètabilité...
- L'historique avec les modifications proposées ici me semble efficace pour lutter contre le vandalisme sur quelques pages.
- Si l'attaque concerne 153 pages sur 600 ? Est-il possible de provoquer une restauration fondée sur un critère : choix du texte (tous les textes où l'on peut lire "*?§€$$*"), des pages, date, dernierUser, telUserattaqué...?
- Si l'attaque concerne la présentation (style : désorganisation de la page, body invisible...) ?
- Si l'attaque concerne le wiki ? : la sauvegarde complète : est-il possible de créer une action qui se charge de la restauration par une sauvegarde ? problème informatique, temps traitement, limite de l'adminphp, limite du volume de la base ( j'avoue ne pas comprendre comment faire malgré la page qui en parle)....
- Si l"attaque concerne la base ?........
- Si l'attaque est une destruction repétée, massive oups ! je m'égare....
Mais ne jamais oublier qu'une défense isolée est aussi une arme : si je puis systématiquement réécrire un texte, je peux systématiquement écrire "*?§€$$*" l'injure de toute à l'heure.
Une défense efficace = la
wiki-défense ou wiki-immunité :
- une action {{défendre}}
- facile (style : je crée une page, y met l'action et sauver !)
- par TOUS
- à Toute échelle ( mot, texte,page,wiki)
- à TOUT moment, systématique
-- un non-informaticien courageux mais pas php-téméraire, pas encore ! ;-)
FidelioEspoir
Solution à base d'action
Mettre en place une action dans le genre {{denied ip="192.168.0.1;142.254.169.152"}} où dès que cette ip se connectera il recuperrera un beau die ("vous n'êtes plus autorisé à modifier cette page"); l'avantage de cette solution est d'être simple et rapide et ne nécessiste pas de modification. -- Crazy pops
- L'idée est intéressante mais je vois deux problèmes :
- cela veut dire qu'il faut insérer cette action dans chaque page pour bloquer un wiki complet !...
- cela veut dire aussi que n'importe quel utilisateur peut chercher à bloquer les adresses IP d'utilisateurs parfaitement honnètes...
- Vois-tu une solution ? -- CharlesNepote
- Beaucoup de gens ont une ip dynamique et par conséquent le blocage d'ip sera souvent inefficace. -- PatrickPaul
- Les nuisibles et autres vandales savent déjà utiliser des proxy web depuis des années (pour des forums et autres) et s'en serviront au moindre filtre sur IP. -- Gniarf
- ceci permetrait de bloquer un vandale temporairement , ceci n est pas une solution universel a tout les probleme de vanfalise mais seulement empecher le vandalisme sur une page de maniere simple et rapide
Historique des débats
(j'ai viré tout ce qui n'est pas relatif au débat)
On peux par contre cumumler les idées de
GarfieldFr et
DavidDelon, à savoir une admin qui permet de supprimer les pages d'une IP donnée (3.1.), et de lui empécher l'accès au site (2.2.) (quoique en général ces attaques de spam sont ponctuelles, le malotru se contente de polluer tous les wiki qu'il trouve...)
En fait, on reparle d'une
InterfaceDAdministrationWikiNi --
DaOuar
- Oui. On ne va pas y couper : il faut se lancer et faire des propositions. Je vais m'y attaquer prochainement. -- CharlesNepote
D'autant que les pages n'apparaitraient pas dans les
DerniersChangements. C'est aussi une possibilité de censure qui est donné à l'administrateur ; il faut bien réfléchir.
2.2.3, 2.2.4 et 2.3 me paraissent aussi intéressantes.
--
CharlesNepote
Sauvegarde Page type
Bonjour, d'abord juste un petit bravo pour Wikini qui est vraiment super. Comme je suis nouveau je ne suis pas sûr exactement de l'endroit où écrire cela; si je me trompe excusez-moi. Voilà pour le moment je teste wikini donc la sécurité n'est pas la priorité, toutefois lorsque je rendrai publique mon site je me rends compte qu'il y a une possibilité de vandalisme.
Et je me rends compte qu'il manque (enfin je crois que cela n'existe pas encore) une solution simple de récupération de donnée: pouvoir faire une sauvegarde par l'administrateur d'une page considérée comme correcte.
Petite explication:
- Lors de la création d'une page, la première version est considérée comme "page type". Une "page type" ne peut pas être purgée.
- Le système de sauvegarde/modification ne change pas par rapport au système actuel.
- Lors de la lecture d'une page modifiée, l'administrateur, si celui-ci la considère correcte, peut définir la nouvelle version de la page comme "page type". L'ancienne version de la "page type" est alors considérée comme normale et est régie au même régime de purge que les autres pages.
- Si il y a vandalisme sur le site, l'administrateur ou les utilisateurs pourront restaurer soit une version correcte toujours dans l'historique soit si il n'existe plus de versions "correctes" restaurer la "page type".
- Si le vandalisme s'étend sur toutes les pages, l'administrateur pourra restaurer toutes les pages avec les "pages types" correspondantes.
Un tel système permet de garder une version de page jugée correcte tout en laissant la possibilté de modification.
De plus cela permet de simplifier le système de purge: si les pages ont plus de 3 mois, elles sont effacées sauf la dernière version et la version "page type".
Même pour les personnes faisant des sauvegardes régulières de leur base de données, cela permet de restaurer facilement et rapidement une page.
Toutefois cela implique la notion d'administrateur ou de groupe d'administration.
Pour avoir accès aux fonctions d'administrations (restauration intégrale de toutes lespages), un panneau d'administration doit être créé.
Voilà j'espère avoir été clair. Je n'ai pas trop réfléchi sur la question, donc cette solution peut sûrement être améliorée, mais je pense qu'elle présente un bon début de piste.
-- Animemint
La page devenait trop longue et commençait à s'effacer au fur et à mesure qu'on l'éditait, j'ai coupé cette partie:
ProtectionContreLeVandalismeFiltresAntiSpam
(j'espère que c'est le seul cas sur wikini.net car c'est vraiment embêtant cette histoire quand on n'y preête pas attention, il faudrait resortir la discussion à ce sujet mais je ne sais plus où elle se toruvait... peut-être dans les suggestions ou un truc du genre --
LordFarquaad)
Confirmation anti-robot
Personellement je serait pour l'ajout d'une image "anti robots" qui affiche un texte qu'il faut retaper pour validation lors de l'édition de pages quand on est pas propriétaire de la page ou si la page n'existe pas encore... --
MagicalTux
- Pour ma part, je ne suis pas favorable à l'image "anti-robot" pour les raisons suivantes :
- beaucoup de vandalisme ne viennent pas de robots
- cette solution empêche toute participation à un aveugle
- elle pénalise tous les utilisateurs par une manipulation supplémentaire
- .- CharlesNepote