Skip to content
Extraits de code Groupes Projets
Valider 2e19e691 rédigé par Fil's avatar Fil
Parcourir les fichiers

resécurisation des forums contre les double envois etc

parent a7288684
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
<form action='[(#HTTP_VARS{url})]' method='post' name='formulaire'>
<form action="[(#HTTP_VARS{url})]" method="post" name="formulaire">
<input type='hidden' name='ajout_forum' value="oui" />
<input type='hidden' name='alea' value="[(#HTTP_VARS{alea})]" />
<input type='hidden' name='hash' value="[(#HTTP_VARS{hash})]" />
<input type='hidden' name='retour' value="[(#HTTP_VARS{retour})]" />
<input type="hidden" name="ajout_forum" value="oui" />
[<input type="hidden" name="alea" value="(#HTTP_VARS{alea})" />]
[<input type="hidden" name="hash" value="(#HTTP_VARS{hash})" />]
[<input type="hidden" name="retour" value="(#HTTP_VARS{retour})" />]
[<p>(#HTTP_VARS*{modere})</p>]
[(#HTTP_VARS*{afficher_texte_hidden})]
[(#HTTP_VARS*{afficher_texte_input})
[(#HTTP_VARS*{previsu})
<fieldset class='spip_encadrer'>
<fieldset class="spip_encadrer">
<legend><b><:forum_titre:></b></legend>
<label><input type='text' name='titre'
[value="(#HTTP_VARS{titre})" ]class='forml' size='40' />
<label><input type="text" name="titre"
[value="(#HTTP_VARS{titre})" ]class="forml" size="40" />
</label>
</fieldset>
<br />
<fieldset class='spip_encadrer'>
<fieldset class="spip_encadrer">
<legend><b><:forum_texte:></b></legend>
<p><:info_creation_paragraphe:></p>
[(#HTTP_VARS{texte}|barre_forum)]
</fieldset>
<br />
[<p>(#HTTP_VARS*{table})</p>]
<fieldset class='spip_encadrer'>
<fieldset class="spip_encadrer">
<legend><:forum_lien_hyper:></legend>
<p><:forum_page_url:></p>
<p><label><:forum_titre:>
<input type='text' name='nom_site_forum' class='forml' size='40'
<input type="text" name="nom_site_forum" class="forml" size="40"
value="[(#HTTP_VARS{nom_site_forum})]" />
</label></p>
<p><label><:forum_url:>
<input type='text' name='url_site' class='forml' size='40'
<input type="text" name="url_site" class="forml" size="40"
value="[(#HTTP_VARS{url_site})]" />
</label></p>
</fieldset>
<br />
<fieldset class='spip_encadrer'>
<fieldset class="spip_encadrer">
<legend><:forum_qui_etes_vous:></legend>
<p><label><:forum_votre_nom:>
<input type='text' name='auteur' value="[(#HTTP_VARS{auteur})]"
class='forml' size='40' [(#HTTP_VARS{disabled})] />
<input type="text" name="auteur" value="[(#HTTP_VARS{auteur})]"
class="forml" size="40" [(#HTTP_VARS{disabled})] />
</label></p>
<p><label><:forum_votre_email:>
<input type='text' name='email_auteur'
<input type="text" name="email_auteur"
value="[(#HTTP_VARS{email_auteur})]"
class='forml' size='40' [(#HTTP_VARS{disabled})] />
class="forml" size="40" [(#HTTP_VARS{disabled})] />
</label></p>
</fieldset>
<br />
<div align='right'><input type='submit' value="<:forum_voir_avant:>"
class='spip_bouton'></div>
<div align="#LANG_RIGHT"><input type="submit" value="<:forum_voir_avant:>"
class="spip_bouton"></div>
]
]
</form>
......
<?php
$fond = "forum";
$delais = 3600;
......@@ -6,7 +7,7 @@ $delais = 3600;
// @ http://www.spip.net/fr_article1825.html
//
// 1. seuls les mots-cles du groupe de mots numero 1 doivent s'afficher
// $afficher_groupe = array(9);
// $afficher_groupe = array(1);
//
// 2. faire des forums uniquement pour affecter des mots-cles
// $afficher_texte = "non";
......
......@@ -605,13 +605,14 @@ function balise_EXTRA_dist ($p) {
function balise_PARAMETRES_FORUM_dist($p) {
include_local('inc-formulaire_forum.php3');
$_accepter_forum = champ_sql('accepter_forum', $p);
$_id_article = champ_sql('id_article', $p);
$p->code = '
// refus des forums ?
('.$_accepter_forum.'=="non" OR
(lire_meta("forums_publics") == "non" AND !ereg("^(pos|pri|abo)", '.$_accepter_forum.')))
? "" : // sinon:
';
// refus des forums ?
(sql_accepter_forum('.$_id_article.')=="non" OR
(lire_meta("forums_publics") == "non"
AND sql_accepter_forum('.$_id_article.') == ""))
? "" : // sinon:
';
switch ($p->type_requete) {
case 'articles':
......
......@@ -353,12 +353,28 @@ function sql_petitions($id_article, $table, $id_boucle, $serveur, &$Cache) {
# retourne le chapeau d'un article, et seulement s'il est publie
function sql_chapo($id_article) {
if ($id_article)
return spip_abstract_fetsel(array('chapo'),
array('articles'),
array("id_article=".intval($id_article),
"statut='publie'"));
}
# retourne le champ 'accepter_forum' d'un article
function sql_accepter_forum($id_article) {
static $cache = array();
if (!$id_article) return;
if (!isset($cache[$id_article]))
$cache[$id_article] = spip_abstract_fetsel(array('accepter_forum'),
array('articles'),
array("id_article=".intval($id_article)));
return $cache[$id_article];
}
// Calcul de la rubrique associee a la requete
// (selection de squelette specifique par id_rubrique & lang)
......
......@@ -21,21 +21,21 @@ else
/* GESTION DU FORMULAIRE FORUM */
/*******************************/
global $balise_FORMULAIRE_FORUM_collecte;
$balise_FORMULAIRE_FORUM_collecte = array('id_rubrique', 'id_forum', 'id_article', 'id_breve', 'id_syndic');
$balise_FORMULAIRE_FORUM_collecte = array('id_rubrique', 'id_forum', 'id_article', 'id_breve', 'id_syndic', 'alea', 'hash');
function balise_FORMULAIRE_FORUM_stat($args, $filtres)
{
list ($idr, $idf, $ida, $idb, $ids) = $args;
// recuperer les donnees du forum auquel on repond, false = forum interdit
if (!$r = sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids))
return '';
list($titre, $table, $forums_publics) = $r;
return
array($titre, $table, $forums_publics, $idr, $idf, $ida, $idb, $ids);
function balise_FORMULAIRE_FORUM_stat($args, $filtres) {
list ($idr, $idf, $ida, $idb, $ids, $alea, $hash) = $args;
// recuperer les donnees du forum auquel on repond, false = forum interdit
if (!$r = sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids))
return '';
list($titre, $table, $forums_publics) = $r;
return
array($titre, $table, $forums_publics, $idr, $idf, $ida, $idb, $ids, $alea, $hash);
}
function balise_FORMULAIRE_FORUM_dyn($titre, $table, $forums_publics, $id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic) {
function balise_FORMULAIRE_FORUM_dyn($titre, $table, $forums_publics, $id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic, $alea, $hash) {
global $REMOTE_ADDR, $id_message, $afficher_texte, $spip_forum_user;
......@@ -146,17 +146,39 @@ function balise_FORMULAIRE_FORUM_dyn($titre, $table, $forums_publics, $id_rubriq
}
}
// Generation d'une valeur de securite pour validation
$seed = (double) (microtime() + 1) * time() * 1000000;
@mt_srand($seed);
$alea = @mt_rand();
if (!$alea) {srand($seed);$alea = rand();}
$forum_id_rubrique = intval($id_rubrique);
$forum_id_forum = intval($id_forum);
$forum_id_article = intval($id_article);
$forum_id_breve = intval($id_breve);
$forum_id_syndic = intval($id_syndic);
$hash = calculer_action_auteur("ajout_forum $forum_id_rubrique $forum_id_forum $forum_id_article $forum_id_breve $forum_id_syndic $alea");
$id_rubrique = intval($id_rubrique);
$id_forum = intval($id_forum);
$id_article = intval($id_article);
$id_breve = intval($id_breve);
$id_syndic = intval($id_syndic);
// Une securite qui nous protege contre :
// - les doubles validations de forums (derapages humains ou des brouteurs)
// - les abus visant mettre des forums malgre nous sur un article (??)
// On installe un fichier temporaire dans _DIR_SESSIONS (et pas _DIR_CACHE
// afin de ne pas bugguer quand on vide le cache)
// Le lock est leve au moment de l'insertion en base (inc-messforum.php3)
if ($GLOBALS['HTTP_POST_VARS']['ajout_forum']) {
$alea = preg_replace('/[^0-9]/', '', $alea);
if(!$alea OR !@file_exists(_DIR_SESSIONS."forum_$alea.lck")) {
while (
# astuce : mt_rand pour autoriser les hits simultanes
$alea = time() + @mt_rand()
AND @file_exists($f = _DIR_SESSIONS."forum_$alea.lck")) {};
@touch ($f);
@chmod ($f,0666);
}
# et maintenant on purge les locks de forums ouverts depuis > 4 h
if ($dh = @opendir(_DIR_SESSIONS))
while (($file = @readdir($dh)) !== false)
if (preg_match('/^forum_([0-9]+)\.lck$/', $file)
AND (time()-@filemtime(_DIR_SESSIONS.$file) > 4*3600))
@unlink(_DIR_SESSIONS.$file);
$hash = calculer_action_auteur("ajout_forum $id_rubrique $id_forum $id_article $id_breve $id_syndic $alea");
}
// Faut-il ajouter des propositions de mots-cles
if ((lire_meta("mots_cles_forums") == "oui") && ($table != 'forum'))
......
......@@ -108,32 +108,38 @@ if ((strlen($texte) + strlen($titre) + strlen($nom_site_forum) + strlen($url_sit
if (strlen($confirmer) > 0
OR ($afficher_texte=='non' AND $ajouter_mot)) {
// verifier droit (pour interdire de hack-poster sur des forums fermes ?)
// prevoir le redirect
$redirect = $retour_forum;
// Verifier hash securite
include_ecrire("inc_admin.php3");
if (!(verifier_action_auteur("ajout_forum $id_rubrique".
if (!verifier_action_auteur("ajout_forum $id_rubrique".
" $id_forum $id_article $id_breve".
" $id_syndic $alea", $hash))) {
header("Status: 404");
exit;
}
" $id_syndic $alea", $hash))
return; # echec silencieux du POST
// verifier fichier lock
$alea = preg_replace('/[^0-9]/', '', $alea);
if (!file_exists($f = _DIR_SESSIONS."forum_$alea.lck"))
return; # echec silencieux du POST
unlink($f);
// Entrer le message dans la base
$id_message = spip_abstract_insert('forum',
"(date_heure)",
"(NOW())");
$id_message = spip_abstract_insert('forum', '(date_heure)', '(NOW())');
$statut =
($forums_publics == 'non') ? 'off' :
(($forums_publics == 'pri') ? 'prop' :
'publie');
if ($id_forum > 0)
$id_thread = $id_forum;
if ($id_forum)
list($id_thread) = spip_fetch_array(spip_query(
"SELECT id_thread FROM spip_forum WHERE id_forum = $id_forum"));
else
$id_thread = $id_message; # id_thread oblige INSERT puis UPDATE.
spip_query("UPDATE spip_forum SET id_parent = $id_forum,
id_rubrique =$id_rubrique,
id_rubrique = $id_rubrique,
id_article = $id_article,
id_breve = $id_breve,
id_syndic = $id_syndic,
......@@ -183,8 +189,6 @@ OR ($afficher_texte=='non' AND $ajouter_mot)) {
$id_syndic) . "'");
}
$redirect = $retour_forum;
}
?>
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter