Le site des utilisateurs francophones de FluxBB.
Vous n'êtes pas identifié(e).
Bonjour !
Voilà, je poste ceci ici car ce que je vous présente n'est pas encore une MOD, même si elle est destinée à le devenir : disons que c'est une étape, mais que ça peut peut-être déjà intéresser certains.
Le but : obtenir des informations supplémentaires sur les utilisateurs de vos forums FluxBB, concernant les pages qu'ils ont pu consulter.
Pour l'instant, à cette étape intermédiaire, j'ai :
- écrit un "tracker" permettant, avec des variables de sessions, d'enregistrer les pages consultées pour chaque utilisateur et pour chaque session,
- créé une table supplémentaire dans la BDD pour accueillir les données précédentes,
- "inclus" le tracker dans le header.php, considérant que chaque page des forums FluxBB utilise ce header,
- créé un plugin pour afficher les résultats.
Pour en arriver à la MOD j'ai encore du travail et des idées éventuelles : intégrer la table supplémentaire à la table users (?), limiter les tracking pour ne pas alourdir la BDD (les 10 derniers pour chaque utilisateur ?), réutiliser les résultats du tracking pour alimenter des stats sur les topics (les plus vus pour chaque utilisateur ?), intégrer ces infos dans les profils, faire des fichiers lang et angliciser les commentaires (pour l'instant j'ai allègrement mélangé français et anglais au gré de mon humeur !), etc.
Si vous voulez tester voici mes codes. Le résultat est déjà, je trouve, intéressant. Merci donc par avance d'y porter intérêt et de bien vouloir tester tout ça pour me dire :
1) si ça fonctionne correctement chez vous,
2) si mon codage est suffisamment "orthodoxe",
3) pour les spécialistes, s'il n'y a pas de faille(s) de sécurité,
4) si vous avez d'éventuelles idées sur d'autres informations que vous désireriez récupérer avec ce système afin que je les intègre.
POUR TESTER :
Création de la table miaou (abrév. de More Information About Online Users ; je sais, le nom peut paraître ridicule mais je me fiche du ridicule... et j'aime bien les chats... ).
Copiez le code ci-dessous, enregistrez le sous la forme d'un fichier "install_miaou.php", uploadez-le à la racine de vos forums, puis exécutez-le :
<?php
/***********************************************************************/
// Some info about your mod.
$mod_title = 'More Information About Online Users';
$mod_version = '1.0.3';
$release_date = '2012-02-02';
$author = 'Wan';
$author_email = 'Wan@cara-vintage.com';
// Versions of FluxBB this mod was created for. A warning will be displayed, if versions do not match
$fluxbb_versions= array('1.4.7','1.4.8');
// Set this to false if you haven't implemented the restore function (see below)
$mod_restore = true;
// This following function will be called when the user presses the "Install" button
function install()
{
global $db, $db_type, $pun_config, $mod_version;
$table_name = "miaou";
$schema = array(
'FIELDS' => array(
'id' => array(
'datatype' => 'SERIAL',
'allow_null' => false
),
'session' => array(
'datatype' => 'VARCHAR(50)',
'allow_null' => false
),
'referer' => array(
'datatype' => 'VARCHAR(255)',
'allow_null' => false
),
'time' => array(
'datatype' => 'TEXT',
'allow_null' => false
),
'parcours' => array(
'datatype' => 'TEXT',
'allow_null' => false
),
'user' => array(
'datatype' => 'VARCHAR(200)',
'allow_null' => false
)
),
'PRIMARY KEY' => array('id')
);
$no_prefix = NULL;
$db->create_table($table_name, $schema, $no_prefix);
// and now, update the cache...
require_once PUN_ROOT.'include/cache.php';
generate_config_cache();
}
// This following function will be called when the user presses the "Restore" button (only if $mod_restore is true (see above))
function restore()
{
global $db, $db_type, $pun_config;
$db->drop_table("miaou");
// and now, update the cache...
require_once PUN_ROOT.'include/cache.php';
generate_config_cache();
}
/***********************************************************************/
// DO NOT EDIT ANYTHING BELOW THIS LINE!
// Circumvent maintenance mode
define('PUN_TURN_OFF_MAINT', 1);
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php';
// We want the complete error message if the script fails
if (!defined('PUN_DEBUG'))
define('PUN_DEBUG', 1);
// Make sure we are running a FluxBB version that this mod works with
$version_warning = !in_array($pun_config['o_cur_version'], $fluxbb_versions);
$style = (isset($pun_user)) ? $pun_user['style'] : $pun_config['o_default_style'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?php echo pun_htmlspecialchars($mod_title) ?> installation</title>
<link rel="stylesheet" type="text/css" href="style/<?php echo $style.'.css' ?>" />
</head>
<body>
<div id="punwrap">
<div id="puninstall" class="pun" style="margin: 10% 20% auto 20%">
<?php
if (isset($_POST['form_sent']))
{
if (isset($_POST['install']))
{
// Run the install function (defined above)
install();
?>
<div class="block">
<h2><span>Installation successful</span></h2>
<div class="box">
<div class="inbox">
<p>Your database has been successfully prepared for <?php echo pun_htmlspecialchars($mod_title) ?>. See readme.txt for further instructions.</p>
</div>
</div>
</div>
<?php
}
else
{
// Run the restore function (defined above)
restore();
?>
<div class="block">
<h2><span>Restore successful</span></h2>
<div class="box">
<div class="inbox">
<p>Your database has been successfully restored.</p>
</div>
</div>
</div>
<?php
}
}
else
{
?>
<div class="blockform">
<h2><span>Mod installation</span></h2>
<div class="box">
<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>?foo=bar">
<div><input type="hidden" name="form_sent" value="1" /></div>
<div class="inform">
<p>This script will update your database to work with the following modification:</p>
<p><strong>Mod title:</strong> <?php echo pun_htmlspecialchars($mod_title.' '.$mod_version) ?></p>
<p><strong>Author:</strong> <?php echo pun_htmlspecialchars($author) ?> (<a href="mailto:<?php echo pun_htmlspecialchars($author_email) ?>"><?php echo pun_htmlspecialchars($author_email) ?></a>)</p>
<p><strong>Disclaimer:</strong> Mods are not officially supported by FluxBB. Mods generally can't be uninstalled without running SQL queries manually against the database. Make backups of all data you deem necessary before installing.</p>
<?php if ($mod_restore): ?>
<p>If you've previously installed this mod and would like to uninstall it, you can click the Restore button below to restore the database.</p>
<?php endif; ?>
<?php if ($version_warning): ?>
<p style="color: #a00"><strong>Warning:</strong> The mod you are about to install was not made specifically to support your current version of FluxBB (<?php echo $pun_config['o_cur_version']; ?>). This mod supports FluxBB versions: <?php echo pun_htmlspecialchars(implode(', ', $fluxbb_versions)); ?>. If you are uncertain about installing the mod due to this potential version conflict, contact the mod author.</p>
<?php endif; ?>
</div>
<p class="buttons"><input type="submit" name="install" value="Install" /><?php if ($mod_restore): ?><input type="submit" name="restore" value="Restore" /><?php endif; ?></p>
</form>
</div>
</div>
<?php
}
?>
</div>
</div>
</body>
</html>
Implantation du "tracker".
Copiez le code ci-dessous, enregistrez le sous le nom de "miaou.php" et uploadez-le à la racine de vos forums :
<?php
/* __________________________________________________________________
Tracker MAIOU v. 1.0.3 for mod More Information About Online Users
(C) 2012 Wan (Wan@cara-vintage.com)
Released : 2012-02-02
Improvements :
- now recording typical pages from FluxxBB in a more understanding shape
Previously released :
1.0 : first release
1.0.1 : some vulnerabilities fixed
1.0.2 :
- code simplified
- bug with recording some special url characters fixed
__________________________________________________________________
License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
*/
// Ouverture de session
session_start();
$new = TRUE;
$current_time = strval(time());
// Analyse de l'url et traitement des cas particuliers des pages index, viewforum, viewtopic, etc.
// Ici on enlève toute la partie de l'url de "http..." à ".../racinedesforums/" pour ne garder que ce qui nous intéresse
$protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
$page = substr(str_replace(str_replace($protocol.pun_htmlspecialchars($_SERVER['SERVER_NAME']), "", $pun_config['o_base_url']), "", pun_htmlspecialchars($_SERVER['SCRIPT_NAME'])), 1);
$tracked_page = preg_replace ('/;/', '', $page); // n.b. : la fonction htmlspecialchars remplace certains caractères spéciaux par des bouts de chaîne pouvant contenir des points virgules qui viennent ensuite perturber l'utilisation du "explode" dans le plugin.
// Ici on traite le cas des pages de base de FluxBB pour un affichage plus agréable et précis
$script = explode ('/', $tracked_page);
$case = array (
'index.php' => $lang_common['Index'],
'viewforum.php' => 'Forum "'.$cur_forum['forum_name'].'", '.sprintf($lang_common['Page'], '').' '.forum_number_format($p),
'viewtopic.php' => $lang_common['Topic'].' "'.$cur_topic['subject'].'", '.sprintf($lang_common['Page'], '').' '.forum_number_format($p),
'userlist.php' => $lang_search['User search'],
'search.php' => $lang_search['Search'].' '.((isset ($keywords)) ? ' "'.pun_htmlspecialchars($keywords).'"' : ''),
'profile.php' => $lang_common['Profile'].' : '.pun_htmlspecialchars($user['username']),
'admin_index.php' => $lang_common['Admin'].'/'.$lang_admin_index['Forum admin head'],
'admin_users.php' => $lang_common['Admin'].'/'.$lang_admin_users['User search head'],
'admin_bans.php' => $lang_common['Admin'].'/'.(($pun_user['language'] == 'French') ? "Bannissements" : "Bans"),
'admin_reports.php' => $lang_common['Admin'].'/'.(($pun_user['language'] == 'French') ? "Signalements" : "Reports"),
'admin_options.php' => $lang_common['Admin'].'/'.$lang_admin_options['Options head'],
'admin_permissions.php' => $lang_common['Admin'].'/'.$lang_admin_permissions['Permissions head'],
'admin_categories.php' => $lang_common['Admin'].'/'.(($pun_user['language'] == 'French') ? "Catégories" : "Categories"),
'admin_forums.php' => $lang_common['Admin'].'/Forums',
'admin_groups.php' => $lang_common['Admin'].'/'.(($pun_user['language'] == 'French') ? "Groupes" : "Groups"),
'admin_censoring.php' => $lang_common['Admin'].'/'.$lang_admin_censoring['Censoring head'],
'admin_ranks.php' => $lang_common['Admin'].'/'.$lang_admin_ranks['Ranks head'],
'admin_maintenance.php' => $lang_common['Admin'].'/'.$lang_common['Maintenance'],
'admin_loader.php' => $lang_common['Admin'].'/plugin '.$plugin,
'register.php' => $lang_common['Register'],
'login.php' => $lang_common['Login']
);
foreach ($case as $key => $value) if ($script [0] == $key)
{
$tracked_page = $value;
break;
}
// S'il s'agit d'une nouvelle session, on ajoute un nouvel enregistrement dans la table
if(!isset($_SESSION['parcours']))
{
// on définit les variables de session
$_SESSION['user'] = $pun_user['username'];
$_SESSION['parcours'] = $tracked_page;
$_SESSION['time'] = $current_time;
// et on prépare le nouvel enregistrement dans la table
$referer = pun_htmlspecialchars($_SERVER['HTTP_REFERER']);
$parcours = pun_trim($_SESSION['parcours']);
$update = "INSERT INTO ".$db->prefix."miaou (session, user, referer, parcours ,time) VALUES('".session_id()."', '".$db->escape($_SESSION['user'])."', '".$db->escape($referer)."', '".$db->escape($parcours)."', '".$time = $_SESSION['time']."')";
}
// Sinon c'est un visiteur déjà présent
else
{ // S'il vient de s'identifier, il est encore enregistré pour cette session en tant qu'invité, il faut donc mettre à jour l'entrée du tableau correspondant à cette session avec le pseudo
if ($pun_user['username'] != $_SESSION['user'])
{
$_SESSION['user'] = $pun_user['username'];
$db->query('UPDATE '.$db->prefix."miaou SET user='".$db->escape($_SESSION['user'])."' WHERE session='".session_id()."'") or error('Unable to update MIAOU', __FILE__, __LINE__, $db->error());
}
// ensuite on ajoute aux variables de session la page consultée et l'heure à laquelle la page a été consultée, avec comme séparation un point virgule (pour exploiter plus tard le résultat on utilisera un "explode")
// n.b. : on ne met à jour que si c'est une page différente (on évite d'enregistrer les "refresh")
$last_page = substr($_SESSION['parcours'], strrpos($_SESSION['parcours'], ";")+1);
if ($last_page != $tracked_page)
{
$_SESSION['parcours'].= ';'.$tracked_page;
$_SESSION['time'].= ';'.$current_time;
// et on prépare la mise à jour de la table
$parcours = pun_trim($_SESSION['parcours']);
$update = "UPDATE ".$db->prefix."miaou SET parcours='".$db->escape($parcours)."', time='".$_SESSION['time']."' WHERE session='".session_id()."'";
}
else $new = FALSE;
}
// Dans les deux cas on exécute la requête préparée s'il y a du nouveau
if ($new) $db->query($update) or error('Unable to update MIAOU', __FILE__, __LINE__, $db->error());
Ensuite éditez "header.php", trouvez :
// Send the Content-type header in case the web server is setup to send something else
header('Content-type: text/html; charset=utf-8');
A la suite, ajoutez :
// Mod M.I.A.O.U. - Inclusion du fichier nécessaire
include_once(PUN_ROOT.'miaou.php');
Et uploadez votre "header.php" modifié bien-sûr...
Implantation du plugin.
Copiez le code ci-dessous, enregistrer le sous le nom "AP_MIAOU.php" et uploadez-le dans ../plugins/ :
<?php
/* __________________________________________________________________
Plugin MIAOU v. 1.0.3 for mod More Information About Online Users
(C) 2012 Wan (Wan@cara-vintage.com)
Released : 2012-02-02
Improvements :
- fits the traker's improvements
Previously released :
1.0 : first release
1.0.1 : - bug fixed in displaying particular dates
- clarified code
1.0.2 : Display users' tracked pages day by day with choice
__________________________________________________________________
License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
*/
// Make sure no one attempts to run this script "directly"
if (!defined('PUN'))
exit;
// Tell admin_loader.php that this is indeed a plugin and that it is loaded
define('PUN_PLUGIN_LOADED', 1);
define('PLUGIN_VERSION', '1.0.1');
define('PLUGIN_URL', $_SERVER['REQUEST_URI']);
// Display the admin navigation menu
generate_admin_menu($plugin);
// Retrieve online users and their associated sessions id's
$online = $db->query('SELECT o.ident, m.user, m.session FROM '.$db->prefix.'online AS o INNER JOIN '.$db->prefix.'miaou AS m WHERE o.ident=m.user') or error('Unable to retrieve online users information needed', __FILE__, __LINE__, $db->error());
$users_online = array();
$users_session = array();
while ($db_online = $db->fetch_assoc($online))
{
$users_online[] = $db_online['ident'];
$users_session[$db_online['ident']] = $db_online['session']; // Even if there are past sessions in the array, it only records the current session at the end...
}
// Retrieve the different dates of recorded tracked sessions in order to display them in the select box
$result = $db->query('SELECT time FROM '.$db->prefix.'miaou ORDER BY time') or error('Unable to retrieve informations needed from MIAOU table', __FILE__, __LINE__, $db->error());
$tracked_day = array();
$tracked_date = array();
$previous_day = -1;
while ($db_times = $db->fetch_assoc($result))
{
$time = explode(';', $db_times['time']);
$session_time = intval($time[0]);
$session_day = intval($session_time/86400);
if ($session_day > $previous_day)
{
$previous_day = $session_day;
$tracked_day[]= $session_day;
switch (date('d/m/Y',$session_time)):
case date('d/m/Y') :
$tracked_date[] = $lang_common['Today'];
break;
case date('d/m/Y', mktime(0, 0, 0, date("m"), date("d")-1, date("Y"))) :
$tracked_date[] = $lang_common['Yesterday'];
break;
default :
$tracked_date[] = date('d/m/Y', $session_time);
endswitch;
}
}
?>
<div class="block">
<h2><span>More Information About Online Users v.<?php echo PLUGIN_VERSION; ?>    (C) 2012 Wan</span></h2>
<div class="box">
<div class="inbox">
<p><?php echo 'Ce plugin liste l\'ensemble des parcours enregistrés pour chaque visiteur de vos forums.'?></p>
</div>
</div>
</div>
<br />
<?php
if (!isset($selected_date))
{
$selected_date = $tracked_date[sizeof($tracked_date)-1];
$selected_day = $tracked_day[sizeof($tracked_date)-1];
}
if($_GET['do'] == "change_day")
{
$selected_date = pun_trim($_POST['select_day']);
for($k=0;$k<sizeof($tracked_date);$k++) if ($selected_date == $tracked_date[$k]) $selected_day = $tracked_day[$k];
}
?>
<form method="post" action="admin_loader.php?plugin=AP_MIAOU.php&do=change_day">
<div class="block">
<h2>Choix de la date pour l'affichage des parcours des visiteurs</h2>
<div class="box">
<div class="inbox">
<table>
<tr>
<th>Parcours en date du :</th>
<td>
<select name="select_day">
<?php
for($j=0;$j<sizeof($tracked_date);$j++)
{
?>
<option value="
<?php
echo $tracked_date[$j].'"';
if ($tracked_date[$j] == $selected_date) echo 'selected="selected"';
echo '>'.$tracked_date[$j].'</option>';
}
?>
</select>
</td>
<td></td>
<td><input type="submit" value="Afficher" /></td>
</tr>
</table>
</div>
</div>
</div>
</form>
<div class="blockform">
<h2 class="block2"><span><?php echo 'Parcours' ?></span></h2>
<div class="box">
<?php
// Retrieve all information from the MIAOU table
$result = $db->query('SELECT * FROM '.$db->prefix.'miaou ORDER BY id') or error('Unable to retrieve \'Parcours\' in MIAOU table', __FILE__, __LINE__, $db->error());
?>
<!-- Display information above for the selected date -->
<form method="post" action="<?php echo 'admin_loader.php?plugin=AP_MIAOU.php' ?>">
<div class="inform">
<fieldset>
<legend><?php echo 'Liste des parcours enregistrés' ?></legend>
<div class="infldset">
<table>
<thead><tr>
<th scope="col"><?php echo 'Visiteur'; ?></th>
<th scope="col"><?php echo 'Connexion'; ?></th>
<th scope="col"><?php echo 'Provenance'; ?></th>
<th scope="col"><?php echo 'Parcours'; ?></th>
</tr></thead>
<tbody>
<?php
while ($db_parcours = $db->fetch_assoc($result))
{
$time = explode(';', $db_parcours['time']);
if ($selected_day == intval(intval($time[0])/86400))
{
// Set variables for a correct display
$time_beg = format_time(intval($time[0]));
$date_beg = format_time(intval($time[0]),true);
$hour_beg = format_time(intval($time[0]),false,null,null,true);
$time_end = format_time(intval($time[count($time)-1]));
$date_end = format_time(intval($time[count($time)-1]),true);
$hour_end = format_time(intval($time[count($time)-1]),false,null,null,true);
$parcours = explode(';', $db_parcours['parcours']);
?>
<tr>
<th scope="row"><?php echo $db_parcours['user'] ?></th>
<td>
<?php
// Date, hours of the tracked session and possibly information about online users
// N.B. : displaying for french language users only for this version... others should be patient ! ;)
// If it's an online user and the session tracked fits the current session of this user,
if ((in_array ($db_parcours['user'], $users_online)) && ($users_session[$db_parcours['user']] == $db_parcours['session']))
{
echo 'Connecté depuis ';
// N.B. : format the display for french language
switch ($date_beg):
case $lang_common['Today']:
echo $hour_beg;
break;
case $lang_common['Yesterday']:
echo $time_beg;
break;
default:
echo 'le '.$date_beg.' à '.$hour_beg;;
endswitch;
echo '<br>Actuellement sur la page : '.$parcours[count($parcours)-1];
}
// else, it's a past tracked session
// and if this tracked session contents only one page,
else if (sizeof($time)<2)
{
// N.B. : format the display for french language
if ($date_beg != $lang_common['Today'] && $date_beg != $lang_common['Yesterday']) echo 'Le ';
echo $date_beg.' à '.$hour_beg;
}
// else, it's a multiple pages past tracked session.
else
{
// N.B. : format the display for french language
switch ($date_beg):
case $lang_common['Today']:
echo $date_beg.', de '.$hour_beg.' à '.$hour_end;
break;
case $lang_common['Yesterday']:
if ($date_end == $date_beg) echo $date_beg.', de '.$hour_beg.' à '.$hour_end;
else echo 'De '.$time_beg.' à '.$time_end;
break;
default:
switch ($date_end):
case $date_beg:
echo 'Le '.$date_beg.' de '.$hour_beg.' à '.$hour_end;
break;
case $lang_common['Today'] || $lang_common['Yesterday']:
echo 'Du '.$date_beg.' à '.$hour_beg.' à '.$time_end;
break;
default:
echo 'Du '.$date_beg.' à '.$hour_beg.' au '.$date_beg.' à '.$hour_beg;
endswitch;
endswitch;
}
?>
</td>
<td><?php echo $db_parcours['referer'] ?></td>
<td>
<?php
// List all the pages of the tracked session with hours
foreach($parcours as $numero => $page) echo $page.' à '.format_time(intval($time[$numero]),false,null,null,true).'<br>';
?>
</td>
</tr>
<?php
}
}
?>
</tbody>
</table>
</div>
</fieldset>
</div>
<p class="submitend"><input name="delete" type="submit" value="<?php echo 'Rafraîchir' ?>" /></p>
</form>
</div>
</div>
Et voilà : rendez-vous dans votre panneau d'administration, niveau plugin "MIAOU" pour tester le résultat. Evidemment, il faudra attendre que plusieurs personnes se connectent pour voir la liste des "trackings" augmenter petit-à-petit.
Pour finir, un petit screenshot partiel mais représentatif de ce que j'obtiens chez-moi :
(P.S. : pour désinstaller après essai, faire les opérations ci-dessus dans l'ordre inverse, à savoir :
1) effacer le plugin AP_MIAOU.php,
2) enlever l'ajout dans le header.php,
3) effacer le "tracker" miaou.php,
4) relancer intall_miaou.php et cliquer sur "Restore" pour effacer la table "miaou", et enfin effacer le fichier install_miaou.php.)
[EDIT]
Version 1.0 (25-01-2012) : première release
Version 1.0.1 (28-01-2012) : plusieurs failles corrigées dans le tracker, code éclairci et un bug corrigé dans l'affichage de certaines dates particulières dans le plugin.
Version 1.0.2 (31-01-2012) : bug corrigé dans l'enregistrment de certaines url contenant des caractères spéciaux transformés (tracker), affichage par jour avec choix sur le jour (plugin).
Version 1.0.3 (02-02-2012) : les pages inhérentes à FluxBB de base sont mieux explicitées (tracker).
Dernière modification par Wan (03-02-2012 12:24:34)
Hors ligne
L'abbréviation (miaou) est EXCELLENTE
Le reste l'est bien moins…
Sans avoir testé :
- utiliser les sessions sur un forum basé sur les cookies me semble déjà très limite (mais possible ; il faut juste le justifier, ce qui n'est pas fait).
- où sont les tests et vérifications sur la validité des variables ? (les "intval" et autres "trim", plus un test de validité)
- et de la même façon, on voit des 'UPDATE' SANS $db->escape…
Bref, cette "étape" est sans doute intéressante, mais pour en faire une "mod", il FAUT rajouter tous ces tests.
Hors ligne
Merci Mpok pour ces conseils !
Pour ce qui est des sessions, c'est juste un "exercice" pour moi, qui débute... Je t'avoue que je n'ai pas encore regardé si on pouvait utiliser les cookies dans le cadre d'un "tracking" tel que je l'ai imaginé ici... et puis de toutes façons la 2.0 arrivant bientôt, mieux vaut s'exercer sur les sessions, je me trompe ?
Pour la validité des variables, je suis tout-à-fait d'accord (trim et autres comme tu dis), par contre test de validité, qu'entends-tu par là ?
Les "escape", oui bien sûr, là c'est de l'oubli impardonnable.
Bref, je vais rectifier ça (dès que tu m'auras montré un exemple de "test de validité") et proposer l'avancement (profil user et stat sur les topics, gestion des paramètres sur le plugin). Je ne proposerai une éventuelle mod que quand toutes ces failles auront été corrigées !
Dernière modification par Wan (27-01-2012 22:17:18)
Hors ligne
Bonjour,
Je suis en train de vérifier la validité des variables utilisées.
Première constatation, je ne vois pas pourquoi j'aurais à utiliser des "intval" vu que les variables numériques utilisées sont toutes des entiers d'origine puisque dérivantes toutes de "time()" au départ et que je ne fais aucune opération de division dessus (la fonction "format_time" non plus, celle-ci exigeant un timestamp sous forme entière puisque utilisant "gmdate", ce qui est le cas ici).
Je passe donc à la vérification des variables de chaînes de caractères.
Ah, j'oubliais, une justification éventuelle de l'utilisation de sessions : la possibilité de récupérer des info sur les pages visitées par les invités... il me semble que c'est la seule manière... à moins que vous ayez d'autres idées ?
[EDIT] : je viens de trouver une première vulnérabilité, il faut parser le "$_SERVER['REQUEST_URI']" avec un htmlspecialchars() avant de l'afficher sur une page (donc dans mon cas, carrément au départ avant de le stocker dans la BDD), car celui-ci peut contenir un script.
[EDIT 2] : j'ai ajouté les escape manquants et même des pun_trim (mais c'est vraiment pour prendre des précautions car je ne vois pas en quoi les trim seraient nécessaires sur une chaîne contenant un URI...).
J'ai "éclairci" aussi un peu le code du plugin (des switch au lieu d'enchaînements de if else).
Je mets à jour dans le premier message, merci par avance pour vos commentaires et vos tests éventuels.
Dernière modification par Wan (28-01-2012 12:37:38)
Hors ligne
Tu devrais ajouter un test quelque part si on ne souhaite pas tracker certaines pages...
Par exemple, sur une page que tu ne veux pas tracker, tu mets:
define('OUAF', 1);
et la modif dans header, tu ajoutes:
if(!defined('OUAF'))
Et en anglais, information ne se met pas au pluriel
Bouh !
StarShip Renaissance
Hors ligne
Tu devrais ajouter un test quelque part si on ne souhaite pas tracker certaines pages...
Par exemple, sur une page que tu ne veux pas tracker, tu mets:
define('OUAF', 1);
et la modif dans header, tu ajoutes:
if(!defined('OUAF'))Et en anglais, information ne se met pas au pluriel
Merci PascL je vais corriger (l'anglais et moyen chez moi... ) !
Pour ce qui est de ne pas "tracker" certaines pages, c'était prévu, vu qu'à la fin, outre de permettre d'avoir une vue sur les pages que consultent les utilisateurs (invités et membres), le but est d'alimenter des stats sur les utilisateurs et sur les topics. En particulier, il me paraît inutile de "tracker" les pages index et viewforum...
Donc merci pour ce petit "truc" avec "define" plus efficace que ce à quoi j'avais pensé !
[EDIT] : tu préfères les chiens aux chats à ce que je vois PascL !
Dernière modification par Wan (28-01-2012 13:34:21)
Hors ligne
Première constatation, je ne vois pas pourquoi j'aurais à utiliser des "intval" vu que les variables numériques utilisées sont toutes des entiers d'origine puisque dérivantes toutes de "time()" au départ et que je ne fais aucune opération de division dessus (la fonction "format_time" non plus, celle-ci exigeant un timestamp sous forme entière puisque utilisant "gmdate", ce qui est le cas ici).
Cette assertion est valable pour le tracker ; par contre elle ne l'est plus pour le plugin où on ré-exploite les dates et heures après un "explode" qui engendre des chaînes de caractères et non des entiers. Donc, et bien que cela fonctionnait sans, j'ai rajouté les 'intval' nécessaires dans le codage du plugin. Merci encore pour cette remarque Mpok.
Hors ligne
v. 1.0.2 (où l'on continue à sécuriser, fixer les bugs, et améliorer...)
Après les (toujours très) bons conseils de Mpok, j'ai donc sécurisé le code. Du coup, en le sécurisant, j'ai induit un petit bug maintenant résolu.
En effet, en appliquant un "htmlspecialchars" à une url, certains caractères réservés sont transformés en des chaînes de caractères contenant des ";". Or, ces ";" sont justement les séparateurs exploités par mes "explode" ensuite dans le plugin. Pour certaines pages donc, cela engendrait le désordre. J'ai donc rajouté un filtrage de ces ";" indésirables dans le tracker. Le résultats, après de nombreux tests, est o.k.
Exemple, imaginons une url (improbable, mais bon...) :
"http://forums/exemple<br />.php"
Après un "htmlspecialchars" dans le tracker (nécessaire pour éviter un passage à la ligne non voulu lors de l'affichage), l'url devient :
"http://forums/exemple<br />.php"
Je me débarrasse alors des ";" pour éviter de scinder mes url en petits morceaux, l'url enregistrée dans la BDD est alors la chaîne de caractères :
"http://forums/exemple<br />.php"
Et à l'affichage de cette chaîne récupérée de la BDD par le plugin (echo), on obtient bien à l'affichage l'url de départ, sans exécution du code html inclus :
"http://forums/exemple<br />.php"
D'autre part, pour cette version, j'ai amélioré l'affichage des parcours des utilisateurs en intégrant un choix par date (pas de contrepèterie, hein ! ) ... par contre je commence à m’emmêler dans les histoires de date, gmdate+diff etc... j'ai encore cela à résoudre (même si cela fonctionne très bien avec un serveur en France... mais ça limite les choses quand même !). Merci si vous avez des idées, voire d'autres remarques sur le code (mis-à-jour dans le premier message).
Hors ligne
Juste comme ça : ne serait-il pas plus "simple" de ne sauvegarder que l'id du topic/forum visité, ainsi que le fichier (viewtopic.php, viewforum.php, ...) ? Comme ça aucun problème de caractères spéciaux, tu récupère le titre du topic/forum/autre seulement lors de l'affichage.
Nous ne faisons pas le travail à votre place mais nous prenons le temps de vous montrer le chemin. Merci de lire ce que l'on vous dit et de réfléchir avant de re-demander une explication.
Hors ligne
Juste comme ça : ne serait-il pas plus "simple" de ne sauvegarder que l'id du topic/forum visité, ainsi que le fichier (viewtopic.php, viewforum.php, ...) ? Comme ça aucun problème de caractères spéciaux, tu récupère le titre du topic/forum/autre seulement lors de l'affichage.
C'était mon idée de départ... Mais partant de (très) loin j'ai dévié vers cette version... qui a l'avantage de pouvoir récupérer n'importe quelle page utilisant le header... y compris celle éventuelle d'un site intégré à FluxBB (utilisant donc le header FluxBB)... Je ferai le filtre pour "détacher" les topics du reste des pages dans un deuxième temps pour alimenter des stats... enfin c'est ce que je pensais faire, je vais tout de même réfléchir à cette idée idéalement plus simple et sobre.
A noter que le reste des évolutions (alimentation de stats sur les topics et sur les users concernant les pages les plus regardées (invités et membres, c'est l'avantage d'utiliser les sessions...), ainsi que la gestion de la BDD et des stats dans le plugin est en cours...)
Dernière modification par Wan (01-02-2012 00:09:15)
Hors ligne
Petite question de débutant (mais je n'arrive pas à trouver la réponse malgré quelques recherches) :
Dans le fichier lang/French/common.php, le mot anglais "Page" est traduit en français par "Page %s".
A quoi sert le "%s" ?
[EDIT] N.B. : v. 1.0.3 en release ici même ce soir avec amélioration de l'affichage des pages des forums visitées.
A venir : v. 1.1 avec alimentation de stats supplémentaires sur les topics et users puis v. 1.2 avec gestion de la BDD et des stats dans le plugin.
C'est la v. 1.2 avec les commentaires en anglais et les fichiers lang qui sera proposée comme mod sur le .org puis ici.
Dernière modification par Wan (02-02-2012 20:27:54)
Hors ligne
Bonjour,
Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche
Hors ligne
Merci Otomatic !
Donc, si je comprends bien, le "%s" oblige l'argument suivant "Page " à se présenter sous forme d'une chaîne de caractères au cas ou ce serait "par le plus pur des hasards"... un entier ! ... à condition qu'on passe par un "sprintf"...
Pourquoi n'y a-t-il pas besoin de ce "%s" en anglais au fait...
Dernière modification par Wan (03-02-2012 00:02:09)
Hors ligne
Je viens de repérer un petit bug dans le fichier lang/French/search.php :
Le terme "Search" en anglais est traduit deux fois :
une fois comme "Rechercher" (dans la partie "//The search form")
une deuxième fois comme "Recherche" (dans la partie "//Results")...
Rien de bien grave mais bon...
Hors ligne
Bon je vous livre la version 1.0.3 avec encore deux petits bugs que j'aimerais que vous réussissiez à m'aider à résoudre.
Pour cette version, les pages intrinsèques à FluxxBB sont enregistrées sous une forme plus agréable à lire et éventuellement enrichies de renseignements supplémentaires (je vous laisse tester).
Les deux bugs sont :
- à la ligne 33 du tracker miaou.php le résultat du code :
'search.php' => $lang_search['Search'].(isset($keywords)) ? ' "'.pun_htmlspecialchars($keywords).'"' : null,
rend :
"" à 22:56:40
quand il n'y a pas eu de recherche, alors que j'ai testé les valeurs de $lang_search['Search'] (qui vaut "Rechercher") et de isset($keywords) (qui vaut false).
On devrait donc avoir :
Rechercher à 22:56:40
- aux lignes 31 et 32, je n'arrive pas à me "débarrasser" du fameux "%s" à l'affichage de $lang_common['Page']
Merci pour votre soutien en tout cas !
Dernière modification par Wan (03-02-2012 00:56:54)
Hors ligne
Je viens de repérer un petit bug dans le fichier lang/French/search.php :
Le terme "Search" en anglais est traduit deux fois :
une fois comme "Rechercher" (dans la partie "//The search form")
une deuxième fois comme "Recherche" (dans la partie "//Results")...
Rien de bien grave mais bon...
[edit] même chose en anglais, mais pour le coup c'est une redondance : 'Search' => 'search' et 'Search' => 'search'...
Hors ligne
Bonjour,
La chaîne de caractères $lang_common['Page'] = 'Page %s'; est toujours utilisée pour afficher le numéro de page : Page 5 par exemple.
Pour ce faire, elle est toujours utilisée avec l'instruction PHP sprintf() par exemple dans include/fonctions.php par
$page_title[0] .= ' ('.sprintf($lang_common['Page'], forum_number_format($p)).')';
ce qui fait que tu ne peux pas te servir de $lang_common['Page'] pour afficher juste Page sans un numéro et ce qui fait aussi que si tu n'utilises pas sprintf(), tu verras toujours le %s.
Donc, si tu ne veux afficher que "page", il faut soit choisir une autre chaine de caractères, soit en créer une nouvelle.
La seule autre chaine est $lang_common['Pages'] qui affichera Pages :
Tu peux, quand même, utiliser $lang_common['Page'] sans voir le %s, mais c'est un palliatif :
sprintf($lang_common['Page'], '')
Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche
Hors ligne
Bon je vous livre la version 1.0.3 avec encore deux petits bugs que j'aimerais que vous réussissiez à m'aider à résoudre.
Pour cette version, les pages intrinsèques à FluxxBB sont enregistrées sous une forme plus agréable à lire et éventuellement enrichies de renseignements supplémentaires (je vous laisse tester).Les deux bugs sont :
- à la ligne 33 du tracker miaou.php le résultat du code :'search.php' => $lang_search['Search'].(isset($keywords)) ? ' "'.pun_htmlspecialchars($keywords).'"' : null,
rend :
"" à 22:56:40
quand il n'y a pas eu de recherche, alors que j'ai testé les valeurs de $lang_search['Search'] (qui vaut "Rechercher") et de isset($keywords) (qui vaut false).
On devrait donc avoir :Rechercher à 22:56:40
Problème règlé, il manquait des parenthèses autour de la condition en écriture alternative, il fallait donc écrire :
'search.php' => $lang_search['Search'].((isset($keywords)) ? ' "'.pun_htmlspecialchars($keywords).'"' : null),
Hors ligne
Bonjour,
La chaîne de caractères $lang_common['Page'] = 'Page %s'; est toujours utilisée pour afficher le numéro de page : Page 5 par exemple.
Pour ce faire, elle est toujours utilisée avec l'instruction PHP sprintf() par exemple dans include/fonctions.php par$page_title[0] .= ' ('.sprintf($lang_common['Page'], forum_number_format($p)).')';
ce qui fait que tu ne peux pas te servir de $lang_common['Page'] pour afficher juste Page sans un numéro et ce qui fait aussi que si tu n'utilises pas sprintf(), tu verras toujours le %s.
Donc, si tu ne veux afficher que "page", il faut soit choisir une autre chaine de caractères, soit en créer une nouvelle.
La seule autre chaine est $lang_common['Pages'] qui affichera Pages :Tu peux, quand même, utiliser $lang_common['Page'] sans voir le %s, mais c'est un palliatif :
sprintf($lang_common['Page'], '')
Bonjour et merci Automatic. J'ai utilisé ton palliatif (avec soin) et cela fonctionne très bien !
(N.B. : j'ai mis à jour dans le 1er message bien sûr).
Hors ligne
Bonjour,
Merci Wan pour cette astuce/mod Je suis intéressé, mais je me demandais si je pouvais "définitivement" la mettre en place sur mon forum en ligne, ou si il faut mieux que j'attende que tu nous sorte une version "définitive" ?
Merci en tout cas
Hors ligne
Bonjour Anthrax.
Cette future mod est fonctionnelle (elle tourne sur mon forum en ligne). Tu pourrais donc l'installer. Cependant, je vais faire une mise à jour ce week-end (si tout va bien et si je trouve le temps de faire tous les tests nécessaires), qui va entraîner un changement dans la BDD et donc modifier le install.php.
Ainsi, si tu installes maintenant, les données enregistrées (parcours des utilisateurs) risquent d'être effacés par la future installation (à moins que tu sois à l'aise et que tu fasses les modifications nécessaires à la main dans ta BDD).
Bref, je te conseille d'attendre la version 1.1 (la 1.2 sera enrichie mais sans intervention sur la BDD) si tu veux une installation pérenne.
Mais que cela ne t'empêche pas d'installer cette version pour "tester" !
Hors ligne
Ok Wan, merci.
Je vais attendre du coup, pour un jour ou deux, voire trois, c'est pas trop grave
Merci
Hors ligne
Ok Wan, merci.
Je vais attendre du coup, pour un jour ou deux, voire trois, c'est pas trop grave
Merci
Rectification :
Les versions 1.1 et 1.2 seront compatibles avec les versions 1.0, un seul rajout à la table topics sera nécessaire pour les stats (je vais bien m'amuser avec des explode, les implode et les tableaux à deux dimensions, mais après réflexion et quelques tests, c'est la manière la plus "propre").
Donc, vous pouvez installer cette version 1.0.3 suffisamment sécurisée et présentable sans craindre d'effacement avec les versions ultérieures.
Merci d'ailleurs de le faire pour me faire part d'éventuels bugs que je n'aurais pas remarqué malgré mes multiples tests !
Dernière modification par Wan (03-02-2012 23:29:32)
Hors ligne
Bonjour.
Ayant à ranger des infos dans une chaîne qui sera exploitée par un explode, j'aimerais connaître les caractères de séparation à utiliser de préférence sans qu'ils ne se retrouvent potentiellement dans $pun_user['username'].
Merci d'avance pour vos conseils...
Hors ligne
Bonjour,
Si on regarde bien une partie de la fonction check_username, par exemple celle-ci :
else if ((strpos($username, '[') !== false || strpos($username, ']') !== false) && strpos($username, '\'') !== false && strpos($username, '"') !== false)
$errors[] = $lang_prof_reg['Username reserved chars'];
else if (preg_match('%(?:\[/?(?:b|u|s|ins|del|em|i|h|colou?r|quote|code|img|url|email|list|\*|topic|post|forum|user)\]|\[(?:img|url|quote|list)=)%i', $username))
$errors[] = $lang_prof_reg['Username BBCode'];
on peut voir que sont interdits les caractères : [ ] \ " ainsi que tous les BBcodes
Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche
Hors ligne