Dax Posté 29 Août 2008 Posté 29 Août 2008 Bonjour à tous, Mes membres étant victimes de spammers, j'essaye d'empécher les visiteurs de mon site d'utiliser la fonction "Contacter le membre" plus d'une fois toutes les dix minutes en utilisant leur IP et l'heure de leur dernier message envoyé. J'arrive à enregistré ces données dans la BDD, mais je n'arrive pas à créer le code qui permet de vérifier dans la BDD si les dix minutes se sont bien écoulées pour l'IP de la personne qui souhaite utiliser la fonction "Contacter le membre". Est-ce que l'un d'entre vous saurait m'expliquer comment faire ? Voici la partie de code que j'ai ajouté à mon fichier contact.php pour stocker les infos de la personne qui contact un membre $time_interval = 600; $time_last_contacted = time(); $contact_time = $time_last_contacted + $time_interval; $lipaddress = getRemoteIP(); mysql_query("INSERT INTO phpclass_stop_spam (id, lContactEmail, lipaddress, time_interval, contact_time, time_last_contacted) VALUES ('', '$lContactEmail', '$lipaddress', '$time_interval', '$contact_time', '$time_last_contacted')")or die(mysql_error()); Voici le fichier contact.php avec le code précédent déjà intégré <?session_start();include_once("admin/inc.php");$tplContact=new TplLoad;$tplContact->assign("phpself",$_SERVER['PHP_SELF']);if ($set_contact_login_need) check_valid_user("");// Refereer information$legal = 0;$lServerRef = explode("/",getenv("HTTP_REFERER"));$lUserid=getParam("user_id","");$tplContact->assign("ad_owner",getParam("ad_owner",""));$tplContact->assign("id",getParam("id",""));$tplContact->assign("user_id",getParam("user_id",""));if ($set_img_validation==1) $tplContact->assign("image_validation",1);if (getParam("submit","")){ $errorStr=""; $tplContact->assign("contact_name",getParam("contact_name","")); $tplContact->assign("contact_email",getParam("contact_email","")); $tplContact->assign("contact_message",strip_tags(getParam("contact_message",""))); if (empty($lUserid)) $errorStr.="<li>".LA_ERROR_MSG5."</li>"; if (!validEmail(getParam("contact_email",""))) $errorStr.="<li>".LA_ERROR_MSG21."</li>"; if (getParam("contact_email","")=="") $errorStr.="<li>".LA_ERROR_MSG8."</li>"; if (getParam("contact_name","")=="") $errorStr.="<li>".LA_ERROR_MSG5."</li>"; if (!empty($set_ref) && !eregi("$set_ref",".$lServerRef[2].")) $errorStr.="<li>".LA_REF_FAILED."</li>"; if (getParam("contact_message","")=="") $errorStr.="<li>".LA_ERROR_MSG88."</li>"; if ($_SESSION["validate_sign_session"] <> $_REQUEST["validate_sign"] && $set_img_validation) $errorStr.="<li>".LA_IMG_VER_FAILED."</li>"; if (empty($errorStr)) { $sql = "select ad_owner,user_name,user_email from $ads_tbl,$usr_tbl where ad_owner=user_id AND user_id = $lUserid limit 1"; $sql_resultads = q($sql); $row=mysql_fetch_array($sql_resultads); $lRecieveEmail = $row["user_email"]; $lRecieveName = $row["user_name"]; $lContactMessage=strip_tags(getParam("contact_message","")); $lContactName=strip_tags(getParam("contact_name","")); $lContactEmail=strip_tags(getParam("contact_email","")); $sql="select ad_title,ad_id from $ads_tbl where ad_id='".getParam("id","")."'"; $res_title=q($sql); $row_title=mysql_fetch_array($res_title); $lAdTitle=$row_title["ad_title"]; $lAdID=$row_title["ad_id"]; $lEmailBody=formatString(LA_EMAIL_BODY,array(getParam("ad_owner",""), "$lContactName","$lContactMessage","$lContactEmail",getRemoteIp(), "$lAdTitle","$lAdID","$name_of_site","$url")); $lEmailTitle=formatString(LA_EMAIL,array(getParam("ad_owner",""), "$lContactName","$lContactMessage","$lContactEmail",getRemoteIp(), "$lAdTitle","$lAdID","$name_of_site","$url")); // mod to stop spam $time_interval = 600; $time_last_contacted = time(); $contact_time = $time_last_contacted + $time_interval; $lipaddress = getRemoteIP(); mysql_query("INSERT INTO phpclass_stop_spam (id, lContactEmail, lipaddress, time_interval, contact_time, time_last_contacted) VALUES ('', '$lContactEmail', '$lipaddress', '$time_interval', '$contact_time', '$time_last_contacted')")or die(mysql_error()); //--- end stop spam --- $tplContact->assign("message_sent",formatString(LA_SENT_MESSAGE,array("$lRecieveName"))); sendEmail($lRecieveEmail,$lContactEmail,$lEmailTitle,$lEmailBody); $tplContact->assign("contact_ok",1); $sql_2 = "update $usr_tbl set user_contacted = user_contacted + 1 where user_id = $lUserid"; $sql_resultupd = q ($sql_2); addToHistory(2,$lUserid,"",""); } else { $tplContact->assign("contact_fail",$errorStr); } } else { $sql_eier = "select user_name from $usr_tbl where user_id = $lUserid"; $result = q ($sql_eier); $row_contact = mysql_fetch_array($result); $tplContact->assign("ad_owner",$row_contact["user_name"]); $tplContact->assign("contact_name",$_SESSION["user_name"]); $tplContact->assign("contact_email", $_SESSION["user_email"]);}$tplContact->display("contact.tpl");?> Et voici les fichiers du script dont j'essaye de m'inspirer et qui permet de lancer un script seulement si le délai minimum est passé. <?phpinclude_once("functions.php");include_once($installed_config_file);db_connect();$time_and_window = time() + TIME_WINDOW;$query="select * from scheduler WHERE fire_time <= $time_and_window";$result = mysql_query($query);$scripts_to_run = array();if (mysql_num_rows($result)) // check has got some{ $i = 0; while ($i < mysql_num_rows($result)) { $id=mysql_result($result,$i, 'id'); $scriptpath=mysql_result($result,$i, 'scriptpath'); $time_interval=mysql_result($result,$i, 'time_interval'); $fire_time=mysql_result($result,$i, 'fire_time'); $time_last_fired=mysql_result($result,$i, 'time_last_fired'); $fire_time_new = $fire_time + $time_interval; $scripts_to_run[$i]="$scriptpath"; $query="UPDATE scheduler SET fire_time='$fire_time_new', time_last_fired='$fire_time' WHERE id='$id'"; mysql_query($query); $i++; }}db_close();// run the scheduled scriptsfor ($i = 0; $i < count($scripts_to_run); $i++) include($scripts_to_run[$i]);?> son fichier function.php <?php$installed_config_file = "config.inc.php";function time_unit($time_interval){ global $app_name; $unit = array(0, 'type'); //check if its hours if ($time_interval <= (23 * 3600)) { $unit[0]=$time_interval/3600; $unit[1]="<font color=\"#ff0000\">hours</font>"; } else { // check if its days if ($time_interval <= (6 * 86400)) { $unit[0]=$time_interval/86400; $unit[1]="<font color=\"#FF8000\">days</font>"; } else { $unit[0]=$time_interval/604800; $unit[1]="<font color=\"#C00000\">weeks</font>"; } } $thedomain = $_SERVER['HTTP_HOST']; return $unit;}function db_connect(){ global $db_link; @$db_link = mysql_connect(DBHOST, DBUSER, DBPASS); if ($db_link) _AT_mysql_select_db(DBNAME); return $db_link;}function db_close(){ global $db_link; if ($db_link) $result = mysql_close($db_link); return $result;}function js_msg($msg){ echo "<script language=\"JavaScript\"><!--\n alert(\"$msg\");\n// --></script>";}?> Avant que le visiteur puisse avoir accès à la fonction "Contacter le membre" j'aimerai pouvoir vérifier dans la BDD si il y a droit, et si ce n'est pas le cas lui afficher un message d'information lui disant qu'il doit patienter dix minutes avant de pouvoir contacter de nouveau quelqu'un. Merci d'avance à ceux qui voudront bien m'éclairer.
buzzistic Posté 29 Août 2008 Posté 29 Août 2008 Pourquoi tu n'essayerais pas avec une session ? tu stockes la date de premier envoi, puis tu compares sur toutes les pages avec le now() : je te conseille de passer par Timestamp qui te retourne un chiffre plus facile à manipuler : il s'affiche en secondes, tu n'as plus quà retirer -600 pour dix minutes à ton timestamp stocké en session. Après, des conditions avec des if/elseif en assignant une variable $off = 1 ou off = 0 Une piste
Dax Posté 29 Août 2008 Auteur Posté 29 Août 2008 Salut Tribords et merci pour ton indication. En fait je suis pas aussi bon que tu le crois, je suis juste un bidouilleur
buzzistic Posté 29 Août 2008 Posté 29 Août 2008 Un peu rapidemennt : <?php session_start();$timer = time();if (empty($_SESSION['maintenant'])){$_SESSION['maintenant'] = $timer;}else {};if ($_SESSION['maintenant'] > ($timer+600)){$off = 0}else{$off = 1};?>
Dax Posté 29 Août 2008 Auteur Posté 29 Août 2008 J'ai essayé ta solution en remplacant avec ton code la deuxième ligne de contact.php mais çà provoquait des erreurs session_start(); j'ai donc un peu modifié et remplacé par celles-ci <?session_start();$timer = time();if (empty($_SESSION['maintenant'])){ $_SESSION['maintenant'] = $timer;}elseif ($_SESSION['maintenant'] > ($timer + 600)){ $off = 0;}else{ $off = 1;}include_once("admin/inc.php"); Dans la template j'ai mis pour tester ces quelques lignes {if $off==0} afficher "contacter le membre" {/if} {if $off==1} cacher "contacter le membre" {/if} mais la fonction "contacter le membre" est toujours affichée même si le temps n'est pas écoulé... puis tu compares sur toutes les pages avec le now() comment je fais pour comparer ? c'est un code à afficher dans la template ?
buzzistic Posté 29 Août 2008 Posté 29 Août 2008 En fait il faudrait créer la session uniquement quand on poste le formulaire, au moment du POST. Enfin le principe y est. Désolé je n'ai pas beaucoup de tempes pour me pencher là dessus
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant