Création d'un forum : Problèmes de sécurité et autres questions
Hors ligneBrako Le 17/11/2008 à 19:25 Profil de Brako Configuration de Brako

Bonjour

Voilà 20 jours que je me suis lancé dans la création d'un forum,  et j'ai quelques questions sur la sécurité des formulaires.

Par exemple à partir de quel moment une variable de type $_POST est susceptible de devenir néfaste ?

J'ai un formulaire avec deux boutons de type submit, l'un pour prévisualiser l'autre pour valider. Lorsque que je pré visualise la page est rechargée, je remplis mon formulaire avec le variables $_POST et j'affiche l'aperçu sous le formulaire. Ces variables $_POST ont-elles besoin de passer par un htmlentities ?

Ensuite je me suis aperçu que je ne faisais aucune vérification de sécurité sur  les input de type hidden,
or c'est une grosse erreur car j'ai aucune manière de vérifier  que le formulaire a bien été validé du site et non d'un autre site avec de mauvaises intentions. D'une manière générale comment empêcher les formulaire de l'extérieur ?

Ensuite j'aurais besoin de vos avis, j'ai envie de garder en mémoire les topics lus pour chaque utilisateur oui mais comment ?
j'avais pensé à ajouter dans ma table topic (mysql) une colonne pour enregistrer l'id des utilisateurs qui ont lu le topic avec un séparateur entre chaque id et que je pourrais ensuite traité avec un explode(). Mais je trouve ça un peu lourd ...

Qu'en pensez-vous ?
--
Ce qui donne une éventuelle matière à suspecter une quelconque propagande ...
Hors ligneKdecherf Le 19/11/2008 à 02:00 Profil de Kdecherf Configuration de Kdecherf

Bonjour,

Alors une question à la fois :-P

Pour la sécurité, il faut impérativement échapper toute variable susceptible d'être passée sur des bases de données (MySQL par exemple pour éviter les injections SQL). Ensuite tout dépend de l'execution de ton script mais globalement l'injection XSS ne devrait pas être possible.

Question de formulaire intérieur - extérieur, le moyen le plus évident à mes yeux serait une variable SESSION et son hash dans le formulaire en hidden. Ainsi tu vérifies les deux champs :-) (je dis bien SESSION ! C'est pour la bonne cause).

Concernant l'histoire des topics lus, en effet c'est très et trop lourd surtout quand tu arrives à + de 100 utilisateurs ... c'est très lourd à executer. L'idée est donc de faire une table avec 2 colonnes : l'id de l'utilisateur et l'id du topic lu. On appelle ça une table d'indexation ;-) Ainsi tu auras un enregistrement par utilisateur par topic. Sur ce genre de tables, les enregistrements en masse n'est pas trop génant contrairement à ton idée où chaque topic dispose d'une surcharge d'informations qui ne peut même pas être traitée directement en MySQL.

Voilà, bonne nuit ;-)
Hors ligneBrako Le 19/11/2008 à 11:10 Profil de Brako Configuration de Brako

Bonjour,

Haaaa je comprends mieux mais quand on parle de sécurité est-ce seulement vis à vie du sql ?
Un echo d'une variable post dans un textarea sans vérification est-ce dangereux ?

Pour les injection j'ai trouvé la parade mysql_real_escape_string(),  à la place du htmlentities() et addslashes(), mais je pensais faire bien en enregistrant mon bbcode formaté en HTML en base de données. Maintenant c'est cuit. ^^

J'y a réfléchi à cette histoire de formulaire, cela pourrait être une bonne solution, mais je suis pas totalement satisfait. Imaginons qu'un petit malin affiche la source de la page, récupère la valeur du hash et ça tombe à l'eau ^^

Okay pour la table d'indexation, je suppose que c'est avec une table comme celle-ci que l'on crée un moteur de recherche interne au site.
--
Ce qui donne une éventuelle matière à suspecter une quelconque propagande ...
Hors ligneKdecherf Le 19/11/2008 à 15:32 Profil de Kdecherf Configuration de Kdecherf

Non pour le hash. Car il ne peut pas sniffer le système de Session de ton site.

Pour le BBCode, mets le BBCode et fais la conversion à l'affichage ;-)
Hors ligneBrako Le 19/11/2008 à 16:52 Profil de Brako Configuration de Brako

Quand tu dis "hash" tu parles bien du hachage avec md5() ?

car imaginons une variable $_SESSION['secu'] qui contient le fameux hash.

si je fait :

<input type="hidden" name="secu" value="<?php echo $_SESSION['secu']; ?>"/>


donc le code source de la page affichera :

<input type="hidden" name="secu" value="0f5a54b33c662c30b0b066f5199f441c"/>


Donc la valeur du hash est accessible, je me trompe ?
--
Ce qui donne une éventuelle matière à suspecter une quelconque propagande ...
Hors ligneAnthony Le 19/11/2008 à 21:17 Profil de Anthony Configuration de Anthony

Fou du volant
Salut :)

Pour ce qui est de la sécu Kdecherf t'as répondu, je te conseille au niveau de l'optimisation de regarder l'article du site, j'en parle puisque j'ai été confronté au même problème :

Optimiser MySQL

N'hésite pas ;)

a +
--

Hors ligneKdecherf Le 19/11/2008 à 22:30 Profil de Kdecherf Configuration de Kdecherf

Voici un petit exemple pour le formulaire


<?php

// Page formulaire

$key generateur(); // On génère une clé aléatoire
$_SESSION['key'] = hashage(); // On hashe la clé comme on veut (mélange de crypt, salt, md5, sha1 ...)

// ...
<input type="hidden" name="skey" value="$key" />


// Page de réception
if ( $_SESSION['key'] == hashage($_POST['skey']))
// On vérifie que le hash session est égal au hash du mot passé par le formulaire avec le même algorithme
?>


Voici un exemple très très rapide.
Hors ligneBrako Le 19/11/2008 à 23:41 Profil de Brako Configuration de Brako

Merci Anthony pour cette documentation. Ça me rassure j'ai, pour certains points, pris de bonnes habitudes :)

Par contre je suis loin de l'optimisation.... Je suppose qu'une requête sql dans une boucle while est à proscrire ^^

et puis j'ai déjà essayé de réduire le nombre de mes requêtes en faisant des jointures de ce type :


<?php
$SQL 
"select M.ID_msg, M.msg, M.ID_topic, M.ID_user, M.ID_forum, M.Qcrea_msg, U.name_user, U.DT_user, F.titre_forum, T.titre_topic  
     FROM  brc_message M
     LEFT JOIN brc_users U ON (U.ID_user = M.ID_user)
     LEFT JOIN brc_topic T ON (M.ID_topic = T.ID_topic)
     LEFT JOIN brc_forum F ON (F.ID_forum = M.ID_forum) WHERE M.ID_topic='" 
$topicid "'  ORDER BY M.ID_msg ASC";
?>


L'histoire des Index je connaissais pas donc je vais potasser un petit peu :) et le type de mes colonnes est à revoir (varchar, text, ...).

Pour ce qui est du formulaire j'ai essayé l'exemple, et j'ai tout de même réussi à contourner ce système, mais il faut le vouloir ^^.

Si j'ai d'autres question j'ouvre un autre topic ?
--
Ce qui donne une éventuelle matière à suspecter une quelconque propagande ...
Hors ligneKdecherf Le 20/11/2008 à 19:37 Profil de Kdecherf Configuration de Kdecherf

Oui la façon de contourner ce système est de se connecter d'abord au site puis récupérer la variable de session, ce qui est rarement dans les capacités des robots.
Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels