Outils pour utilisateurs

Outils du site


project_honeypot

Project HoneyPot

Project HoneyPot est un projet collaboratif pour aider à repérer et bloquer les spammeurs (voir ces deux articles: lien1 lien2). Notez que vous n'avez pas l'obligation de participer au repérage des spammeurs. Vous pouvez juste profiter de la protection de Project Honeypot.

La petite bibliothèque php suivante vous permettra de bloquer les spammeurs de votre site en utilisant Project Honeypot tout en prévenant les internautes d'une éventuelle infection de leur PC. Cela ne bloquera pas leur navigation: Ils auront la possibilité de continuer à naviguer sur le site en prouvant qu'ils sont bien des humains.

Installation

  • Inscrivez-vous à Project Honeypot : C'est obligatoire pour obtenir une clé d'API. La bibliothèque ci-dessous ne fonctionnera pas sans la clé. Cette inscription est gratuite.
  • La clé est dans votre dashboard: Une fois connecté sur le site du projet, cliquez sur "Home" > "Dashboard" et regardez "Your http:BL API key:". Recopiez cette clé dans le source ci-dessous à la place des XXXXXXXXXXXX.
  • Placez le fichier ci-dessous sur votre site.

Cliquez pour voir le source

Cliquez pour voir le source

httpbl.php
<?php
/*
Project Honeypot protection library.
Version 1.4 SSE.
 
Purpose: This library protects a website against comment and email spammers,
         while warning the user he may be infected.
Real users can continue to surf by confirming they are humain. Robots are blocked.
It uses the Project HoneyPot http:BL API to detect spamming IP addresses.
 
- You http:BL API key must be inserted below
  (You must register on the projecthoneypot.org website.)
- To protect a page, simply do: require_once 'httpbl.php';
 
This library is derived from:
http://planetozh.com/blog/my-projects/honey-pot-httpbl-simple-php-script/ 
*/
date_default_timezone_set("Europe/Paris");
define('HTTPBL_API_KEY','XXXXXXXXXXXX');
ob_start();
if(!session_id()) session_start();
if (isset($_COOKIE['notabot']))
{ 
    httpbl_logme(); 
    if ($_SESSION['httpbl']['activity']<8 && strpos($_SERVER['HTTP_USER_AGENT'],'Windows'))
        httpbl_infected();  // Only display infection banner if last spam was less than 8 days ago.
} 
else 
{ 
    httpbl_check(); 
}
 
function httpbl_lang()
{
    // We try to auto-detect language (english by default)
    foreach(explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']) as $language)
        { if ($language=='fr') { return 'fr'; } }
    return 'en';
}
 
function httpbl_infected() // Display infection message.
{
    echo <<<HTML
<style type="text/css">
<!--
#httpbl_warning { text-align:center; border:1px solid black; background-color:#39678E; color:white;}
#httpbl_warning td {  color:white; font:13px sans-serif; padding:0 0 0 7px;}
#httpbl_warning td#sign {  color:yellow;font-family:serif; font-size:42pt; font-weight:bold;padding:0 10 0 14; }
#httpbl_warning td#note {  color:#ddd; font-size:11px;}
#httpbl_warning a {  color:#AAE0AA; text-decoration:none; }
#httpbl_warning a:hover {  color:#FFFFBE;  }
-->
</style>  
HTML;
    $ip=$_SERVER['REMOTE_ADDR'];
    $days = $_SESSION['httpbl']['activity'];
    if (httpbl_lang()=='fr')
    {
        $daysmsg=($days>1?" il y a $days jours":'');
        echo <<<HTML
<div id="httpbl_warning">       
<table align="center"><tr>
<td id="sign" rowspan="2">!</td>
<td><b>Votre adresse IP a &eacute;t&eacute; d&eacute;tect&eacute;e comme &eacute;mettant du <a href="http://www.projecthoneypot.org/ip_$ip">spam</a>$daysmsg. Il est possible que votre ordinateur soit infect&eacute;.<br>
Merci de vous en assurer en utilisant un de ces antivirus gratuits: <a href="https://www.microsoft.com/security/scanner/fr-fr/">Microsoft Safety Scanner</a>, 
<a href="http://housecall.trendmicro.com/fr/">HouseCall TrendMicro</a> ou <a href="http://www.malwarebytes.org/mbam-download.php">Malwarebytes AntiMalware</a>.</b></td>
<td id="note" style="width:20%;">Ce message s'affiche car ce site web participe &agrave; <a href="http://www.projecthoneypot.org/">Project Honeypot</a> pour la lutte contre le spam.</td>
</tr>
<tr><td id="note">Ce message continuera &agrave; s'afficher plusieurs jours apr&egrave;s une &eacute;ventuelle d&eacute;sinfection de votre ordinateur.</td></tr>
</table>
</div>
HTML;
    }
    else
    {
        $daysmsg=($days>1?" $days days ago":'');
        echo <<<HTML
<div id="httpbl_warning">       
<table align="center"><tr>
<td><b>Your IP address has been detected as <a href="http://www.projecthoneypot.org/ip_$ip">spammer</a>$daysmsg. Your computer may be infected.<br>
Please use one of these free antiviruses: <a href="https://www.microsoft.com/security/scanner/">Microsoft Safety Scanner</a>, 
<a href="http://housecall.trendmicro.com/">HouseCall TrendMicro</a> or <a href="http://www.malwarebytes.org/mbam-download.php">Malwarebytes AntiMalware</a>.</b></td>
<td id="note" style="width:20%;">You see this message because this website takes part in <a href="http://www.projecthoneypot.org/">Project Honeypot</a> to fight spam.</td>
</tr>
<tr><td id="note">This message will continue to show up several days after the disinfection of your computer.</td></tr>
</table>
</div>
HTML;
    }
}
 
function httpbl_check() {    
    $ip = $_SERVER['REMOTE_ADDR'];
 
    // build the lookup DNS query
    // Example : for '127.9.1.2' you should query 'abcdefghijkl.2.1.9.127.dnsbl.httpbl.org'
    $lookup = HTTPBL_API_KEY . '.' . implode('.', array_reverse(explode ('.', $ip ))) . '.dnsbl.httpbl.org';
 
    // check query response
    $result = explode( '.', gethostbyname($lookup));
 
    if ($result[0] == 127) 
    {
        // Query successful !
        $a = array('activity'=>$result[1], 'threat'=>$result[2], 'type'=>$result[3]);
        $typemeaning='';
        if ($a['type'] & 0) $typemeaning .= 'Search Engine, ';
        if ($a['type'] & 1) $typemeaning .= 'Suspicious, ';
        if ($a['type'] & 2) $typemeaning .= 'Harvester, ';
        if ($a['type'] & 4) $typemeaning .= 'Comment Spammer, ';
        $a['typemeaning'] = trim($typemeaning,', ');
 
        // Now determine some blocking policy
        $a['block']=0;
        if (
            ($a['type'] >= 4 && $a['threat'] > 0) // Comment spammer with any threat level
            ||
            ($a['type'] < 4 && $a['threat'] > 20) // Other types, with threat level greater than 20
           ) 
        {
            $a['block'] = 1;
        }
 
        $_SESSION['httpbl']=$a;
 
        if ($a['block']!=0) {
            httpbl_logme();
            httpbl_blockme();
            exit();
        }
    }
}
 
function httpbl_logme() {
    $log = fopen($_SERVER["DOCUMENT_ROOT"].'/httpbl.txt','a');
    $stamp = date('Y-m-d :: H-i-s');
    $page = $_SERVER['REQUEST_URI'];
    $ua = $_SERVER["HTTP_USER_AGENT"];
    if (!isset($_COOKIE['notabot'])) {
        fputs($log,"$stamp :: BLOCKED ".$_SERVER['REMOTE_ADDR']." :: ".$_SESSION['httpbl']['type']." :: ".$_SESSION['httpbl']['threat']." :: ".$_SESSION['httpbl']['activity']." :: $page :: $ua\n");
    } else {
        fputs($log,"$stamp :: UNBLCKD ".$_SERVER['REMOTE_ADDR']." :: $page :: $ua\n");
    }
    fclose($log);
}
 
 
function httpbl_blockme() {
    header('HTTP/1.0 403 Forbidden');
    echo '<html><body>';
    httpbl_infected();
    echo <<<HTML
    <script type="text/javascript">
    function setcookie( name, value, expires, path, domain, secure ) {
        // set time, it's in milliseconds
        var today = new Date();
        today.setTime( today.getTime() );
 
        if ( expires ) {
            expires = expires * 1000 * 60 * 60 * 24;
        }
        var expires_date = new Date( today.getTime() + (expires) );
 
        document.cookie = name + "=" +escape( value ) +
        ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) + 
        ( ( path ) ? ";path=" + path : "" ) + 
        ( ( domain ) ? ";domain=" + domain : "" ) +
        ( ( secure ) ? ";secure" : "" );
    }    
    function letmein() {
        setcookie('notabot','true',1,'/', '', '');
        location.reload(true);
    }
    </script>
    <br>
HTML;
 
    if (httpbl_lang()=='fr')
    { echo '<div style="font:14px sans-serif;">Pour continuer la navigation, merci de cliquer sur <a href="javascript:letmein()">ce lien</a>. D&eacute;sol&eacute; du d&eacute;rangement.</div>'; }
    else
    { echo '<div style="font:14px sans-serif;">Please click <a href="javascript:letmein()">this link</a> to continue. Sorry for the inconvenience.</div>'; }    
    echo '</body></html>';
}
?>

Utilisation

Pour protéger une application php des spammeurs, ajoutez simplement dans votre code php:

require_once 'httpbl.php';

C'est tout !

Pour certaines application php, il faut parfois l'inclure après les includes de l'application elle-même, et avant l'exécution du code. Par exemple pour DokuWiki, il faut le mettre dans doku.php, juste après la ligne:

require_once(DOKU_INC.'inc/init.php');

Il peut également être judicieux, si l'application a de nombreuses pages, de mettre l'appel dans un des includes commun à toutes ces pages.

Page de blocage

Si une adresse IP est détectée comme suspect ou spammeur, l'internaute verra cet écran:

Le message s'affiche automatiquement en français ou en anglais selon la langue du navigateur.

Il suffit à l'internaute de cliquer sur le lien pour poursuivre normalement la navigation sur votre site. (Ce lien ne peut pas être suivi par les robots car il utilise Javascript.).

Si le spam date de moins de 8 jours et que l'internaute est sous Windows, il verra le bandeau en haut de chaque page de votre site.

Logs

À la racine de votre site, vous pouvez consulter le fichier httpbl.txt qui enregistre tous les blocages et déblocage. Exemple:

2011-08-02 :: 11-08-32 :: BLOCKED 12.34.56.78 :: 5 :: 21 :: 4 :: /mapage.php :: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
2011-08-02 :: 11-09-11 :: UNBLCKD 12.34.56.78 :: /mapage.php :: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
  • La première ligne (BLOCKED) indique que l'adresse IP 12.34.56.78 a été bloquée par le système en tentant d'accéder à /mapage.php, car cette IP est marquée comme spammeur de commentaires (5) et a envoyé du spam il y a 4 jours. L'internaute n'a pas pu accéder à la page: Il ne voit que la page de blocage (ci-dessus).
  • La seconde ligne (UNBLCKD) montre que l'internaute a cliqué sur le lien "Merci de cliquer sur ce lien", et que c'est donc bien un humain (et pas un robot). La page s'est rechargée normalement.
  • Vous verrez ensuite une ligne UNBLCKD pour chaque page visitée par l'internaute.

Versions

  • Version 1.2 SSE:
    • Utilisation d'une session pour stocker des données.
    • Modification des noms pour éviter les conflits de namespaces (fonctions, CSS…). Tout est maintenant préfixé par "httpbl_".
    • La bannière ne s'affiche dans les pages que si le dernier spam date de moins de 8 jours. (La page de blocage reste affichée dans tous les cas.)
    • Couleurs plus supportables.
  • Version 1.3 SSE:
    • On ne démarre la session que si session_id() n'existe pas (Cela règle des conflits avec certaines applications php).
  • Version 1.4 SSE:
    • La bannière en haut de chaque page n'est affichée que si l'internaute est sous Windows. (Par contre la page de blocage reste affichée dans tous les cas.)

Discussion

Sébastien SAUVAGE, 2011/08/01 13:24, 2011/08/01 13:54

C'est bricolé de manière un peu cra-cra, pardonnez-moi.

Si vous voulez afficher le message uniquement à la première visite (et non dans chaque page), retirez l'appel à infected() en début de programme.

Notez que pour prouver que l'internaute est humain, il clique sur un lien en javascript qui met un cookie (Les robots n'exécutent pas le javascript). Le cookie expire au bout de 24 heures: L'internaute verra alors la page de déblocage une fois par jour.

Marin, 2011/08/01 14:08

Super idée ! Je vais le coller partout ou je peux, et demander à des sites de le mettre quand il sera éventuellement plus évolué.

Par contre, un truc ; comme tu l'as dis, c'est hideux et ça pique les yeux, mais c'est un gros problème : si je me mets dans la peau du noob que j'étais quand j'ai découvert l'informatique, je ne lirais même pas ça, je me dirais directement que pour avoir une présentation pareille, ce bandeau ne peut être qu'une publicité. Éventuellement, si je le lirais, je me dirais juste que ça doit être une pub pour un rogue…

Tu devrais faire un truc bien intégré, moins flashy (style des articles), éventuellement en mettant une explication supplémentaire (au moins que le visiteur balance du spam).

Marin, 2011/08/01 14:45

Essai : http://pastehtml.com/view/b2eqgbvb3.html .

Sébastien SAUVAGE, 2011/08/01 16:14

Effectivement, c'est nettement plus joli, mais le but est que ça ne prenne pas trop de pixels en hauteur afin d'être inséré en haut de page, avant le contenu.

Marin, 2011/08/01 14:51

Et les liens vers des pages en anglais, c'est pas top pour un débutant.

Sébastien SAUVAGE, 2011/08/01 16:15

TrendMicro et Microsoft redirigent automatiquement vers leur page en français. :-)

Marin, 2011/08/01 16:31

Chez moi, Microsoft oui, mais pas TrendMicro (sûrement à cause du nouvel User-Agent de Firefox 4), je pense qu'il faudrait faire un lien directement vers la page en français, http://housecall.trendmicro.com/fr/ . Par contre, l'énorme faute de conjugaison au début de l'intro (« Vous pensez que votre PC es infecté »), ça me ferait directement fuir… Je pense qu'il serait plus pertinent de mettre le lien de MS en premier, ou alors un lien de téléchargement vers un site comme 01net.

En ce qui concerne la hauteur du bandeau en pixels, c'est très facilement réductible avec un peu de CSS.

Sébastien SAUVAGE, 2011/08/01 17:05

Normalement la redirection selon la langue vient d'un autre entête HTTP (ACCEPT_LANGUAGE) qui ne dépend pas du navigateur. Mais c'est curieux, en effet. Il vaudra mieux mettre le lien direct vers /fr oui. Et aussi mettre celui de Microsoft en premier.

Par contre, l'énorme faute de conjugaison au début de l'intro (« Vous pensez que votre PC es infecté »), ça me ferait directement fuir…

En effet, c'est assez moche :-) Ceci dit, HouseCall a un assez bon taux de détection.

Marin, 2011/08/01 17:41

Avant Firefox 4, la langue se trouvant dans l'entête ET dans l'user-agent. Avec Firefox 4, ils l'ont virée de l'user-agent : http://hacks.mozilla.org/2010/09/final-user-agent-string-for-firefox-4/

Marin, 2011/08/01 17:41

*trouvait

Sébastien SAUVAGE, 2011/08/01 16:17

Je pense aussi qu'il faudra que je modifie le script pour que l'alerte disparaisse si le rapport de spam date de plus de 30 jours. (Par contre, il faudra garder la contrôle humain/machine, car j'ai vu des spammeur réutiliser la même IP 87 jours après.)

Sébastien SAUVAGE, 2011/08/01 20:43, 2011/08/01 20:51

Mouais… je ne sais pas vraiment au final comment présenter le texte (idéalement sur deux ou trois lignes).

“Votre adresse IP a été détectée comme émettant du spam. Il est possible que votre ordinateur soit infecté.
Merci de vous en assurer en utilisant un de ces antivirus gratuits: Microsoft Safety Scanner, HouseCall TrendMicro ou Malwarebytes AntiMalware.
Ce message s'affiche car ce site web participe au Project Honeypot pour la lutte contre le spam.”

Mieux ?

Eric Bouquerel, 2011/08/02 07:25

Et pourquoi ne pas mettre une jolie modale bloquante à la façon de WOT ou de l'antiphishing de Mozilla ? (ou des horribles pubs de Clubic,01 et compagnie qui t'énervent grave :)) ça a le mérite de retenir l'attention de l'utilisateur.

Ou bien, si on craint que la modale soit trop associée à la pub dans l'esprit de l'utilisateur, un gros div de warning qui descende à la moitié de la page et qu'on doive fermer avant de naviguer confortablement (à la manière des warnings 'vous naviguez avec IE6 vous devriez changer' qu'on trouve dans les modèles de RocketTheme.com). Ça ne devrait pas être sorcier à rajouter avec un petit coup de jQuery :)

En fait en y réfléchissant cette dernière option me semble la meilleure : ce serait suffisamment bien intégré pour ne pas avoir l'air d'une pub, tu peux le styler à ton gré pour l'adapter à ton modèle de pages,

Tu es sûr de retenir l'attention, et, si c'est contraignant ce n'est pas bloquant, l'internaute peut toujours naviguer, mais il se prend 500 pixels d'avertissement dans les dents avant d'arriver au contenu ou bien il clique pour le faire remonter.

Sébastien SAUVAGE, 2011/08/02 07:50, 2011/08/02 08:16

Je suis en train de faire une revamp du code et un affichage moins moche. J'ai modifié le code pour que la popup reste en haut de chaque page uniquement si le spam à partir de l'IP date de moins de 8 jours. Par contre la confirmation “je suis bien un humain” en cliquant sur le lien restera active. Je publierai ça dans la journée.

@Eric: Je hais les popups modale, je l'imposerai pas aux internautes. De toute manière, à la première arrivée sur le site, il voir le warning et ne peut pas naviguer sur le site s'il ne clique par sur le lien “Je confirme que je suis bien un humain”. Il ne peut donc pas rater le message.

Eric Bouquerel, 2011/08/02 10:43

J'ai mal dû m'exprimer, plutôt qu'une modale, je pensais finalement plus à un mécanisme comme ça : http://2038.net/test_slider_honeypot.html après qu'il ait confirmé qu'il est un humain.

On peut même imaginer de coller un cookie à la fermeture du div avec une durée de vie calculée en fonction de sa dernière détection comme spammer+ njours, comme ça on ne lui réaffiche pas, sauf s'il n'a rien fait après les njours.

La hauteur du div étant ensuite proportionnelle a l'envie que chacun a de lui faire bien noter qu'il a un problème. (C'est même le mécanisme que celui j'utilise sur certains sites pour prévenir l'utilisateur qu'il navigue avec IE6 et que le site va être quasi inutilisable pour lui du fait de son piètre support CSS et de ses nombreux bugs qu'on a décidé de ne plus supporter).

Sébastien SAUVAGE, 2011/08/02 11:00

Je vois ce que tu proposes.

Bon maintenant je ne tiens pas plus que ça à imposer le chargement de JQuery dans toutes mes pages. J'aime que ça reste light :-)

Eric Bouquerel, 2011/08/02 13:37

Héhé, je comprends ça. D'un autre côté la plupart des sites que je développe chargent déjà du JQuery et autres joyeusetés (bosser en web agency ça a forcément des contraintes :)) du coup ça ne me gêne pas plus que ça, et je préfère vraiment le styler en dehors du code PHP (en fait, pour bien faire, je mettrai même le contenu du message en dehors du PHP que le webmaster puisse le personnaliser plus facilement). Enfin c'était ma contribe à deux balles :)

Sébastien SAUVAGE, 2011/08/02 13:38

No problem. (En milieu professionnel, je fais aussi du jQuery+Smarty, c'est assez sympa :)

Sébastien SAUVAGE, 2011/08/02 09:20

Voilà, j'ai publié quelques modifications (version 1.2 SSE)

Sébastien SAUVAGE, 2011/08/02 20:53

Bon j'ai une merdouille: Avec l'utilisation de la session, ça fait sauter la session dans DokuWiki.

Est-ce qu'il y a quelque chose que j'ai raté ? Je devrais peut-être vérifier qu'une session n'existe pas déjà avant de balancer @session_start(); ?

Sébastien SAUVAGE, 2011/08/02 23:45

Problème réglé avec la version 1.3.

Sébastien SAUVAGE, 2011/08/03 07:10, 2011/08/03 07:11

Je m'attendais à quelques “dommages collatéaux”, les voici. C'est dans le cas où plusieurs machines partagent la même adresse IP externe, ce qui est typiquement le cas:

  • des proxy
  • des réseaux d'entreprise
  • des points de sortie TOR
  • des points d'accès 3G.

Je n'ai malheureusement pas moyen de distinguer les différentes machine et déterminer laquelle spamme. Les utilisateurs ne seront donc pas exonérés de l'écran de blocage. (J'ai le cas d'un utilisateur de Linux en 3G qui se prend l'écran de blocage car des PC sous Windows infectés ont utilisé le même point d'accès.)

Par contre, la bannière affichée en haut de chaque page n'a finalement de sens que pour les utilisateurs Windows. Je vais modifier la librairie pour qu'elle ne s'affiche que pour Windows (je raterai sans doute quelques infection MacOSX, mais ça devrait rester marginal.)

Si j'ai un peu de temps, je ferai aussi peut-être un écran de blocage qui marche même sans javascript.

Sébastien SAUVAGE, 2011/08/03 20:25

Bon c'est modifié: Avec la version 1.4, la bannière ne s'affichera en haut de chaque page que si l'internaute est sous Windows.

Eric Bouquerel, 2011/08/08 16:49

Pour ceux que ça intéresse, j'ai repris le code de Sébastien et ai fabriqué un plugin pour Joomla.

C'est en cours de soumission sur le JED et sur le site de Project Honeypot, mais en attendant la homepage du plugin est là : http://wp.bol-d-air.net/2011/08/08/plugin-project-honeypot-http-bl-pour-joomla/

(à noter que je me suis basé sur la version 1.3 du code de Seb, je suis sans pitié, désolé pour les utilisateurs de Linux, mais y'a pas de raison que les macs soient épargnés :) )

Et sinon Seb, je n'ai pas vraiment cherché dans leur API, mais PH n'utilise pas du tout les HTTP_VIA et autres X-FORWARDED-FOR ? si c'était le cas ça pourrait aider au moins sur les proxies et les réseaux d'entreprises. (remarque j'imagine que non ils doivent pas s'en servir.. mais ç'aurait été bien :) )

boule_dml, 2011/10/23 01:05

Microsoft Safety Scanner est mort, peut-être le remplacer par celui d'Emsisoft Anti-malware ?

Philippe, 2011/11/03 09:37

Merci (une nouvelle fois) de tes partages Seb. Il y a un truc qui doit m’échapper. J’ai ma clé qui est dans le script à la racine du site. Okey.

But what’s next côté projecthoneypot.org à faire pour qu’il sache qu’on utilise ce script et qu’il relève les bots spammeurs (qui me polluent encore d’ailleurs)?

Il faut en principe l’activer mais comment ? (là dans mon dashboard, le status est @ - Not Active)

Sébastien SAUVAGE, 2011/11/03 12:55, 2011/11/03 12:56

Rien à faire côté ProjectHoneypot: Avec ta clé, tu les interroge pour chaque IP pour savoir si elle est “claire” ou pas (c'est ce que fait le script). Ma lib ne permet que de repérer et bloquer les spammeurs, pas de les signaler. (pour les signaler, il faut installer des pages-piège ou des adresses MX spéciales.)

Il faut juste s'assurer que ta clé PH est bonne.

Regarde dans le fichier de log si tu vois les internautes arriver.

Philippe, 2011/11/03 13:54

Merci pour ta réponse.

Bien sûr les internautes arrivent (ils sont bien là dans mon log). Ce que je n’arrive pas à comprendre c’est comment le script détecte et bloque les spammeurs.

Ma question est celle d’un noob qui cherche à comprendre plutôt que faire des copier/coller de trucs qui lui échappe. Là le processus m’échappe totalement.

Un lecteur ou un spammeur débarque. Par mon require le script se déclenche et après ? C’est là que je pige pas ce qui se passe.

Philippe, 2011/11/03 13:56

Oops ! Désolé : je n’avais pas fait “Répondre”. 1 000 excuses.

Ah ! aussi. Une correction peut-être : ton lien en haut http://www.projecthoneypot.org/ n’est pas bon.

jerrywham, 2012/07/02 21:08

Je viens de le mettre sur mon site qui tourne grâce à Pluxml. Afin d'éviter de modifier les fichiers natifs et ainsi toujours bénéficier des mises à jour, j'ai fait un petit plugin afin d'utiliser honeypot. je vous le partage ici. Voici le code à mettre dans le fichier Honeypot.php :

  <?php
  /**
   * Classe honeypot
   *
   * @version 1.0
   * @date	02/07/2012
   * @author	CMmm
   **/
   class honeypot extends plxPlugin {

/**
 * Constructeur de la classe
 *
 * @return	null
 * @author	CMmm
 **/	
public function __construct($default_lang) {
	# Appel du constructeur de la classe plxPlugin (obligatoire)
	parent::__construct($default_lang);
	
	# Ajouts des hooks
	$this->addHook('IndexEnd', 'IndexEnd');
}

/**
 * Méthode qui insère le projet Honeypot, antispam
 */
public function IndexEnd()
{
	require_once 'httpbl.php';
}
  }
  ?>

Ce fichier est à placer dans les plugins avec le fichier infos.xml suivant :

  <?xml version="1.0" encoding="UTF-8"?>
  <document>
<title><![CDATA[Honeypot]]></title>
<author><![CDATA[CMmm]]></author>
<version>1.0</version>
<date>02/07/2012</date>
<site>http://www.ecyseo.net/</site>
<description><![CDATA[Permet d'intégrer le projet honey pot]]></description>
<requirements></requirements>
  </document>

Il faut également mettre le fichier httpbl.php à la racine du site.

jerrywham, 2012/07/02 23:23

Il ne manque pas un ob_end_flush(); (ou dans le genre) à la fin du fichier ?

yoshikiwi, 2013/03/26 09:20

Bonjour, je ne comprend rien a ce code et il semble avoir une erreur ligne 56 quelqu'un sait comment je doit la corriger? merci d'avance pour votre réponse.

voici le code que j'ai copier

  <?php
  /*
  Project Honeypot protection library.
  Version 1.4 SSE.
   
  Purpose: This library protects a website against comment and email spammers,
    while warning the user he may be infected.
  Real users can continue to surf by confirming they are humain. Robots are blocked.
  It uses the Project HoneyPot http:BL API to detect spamming IP addresses.
   
  - You http:BL API key must be inserted below
    (You must register on the projecthoneypot.org website.)
  - To protect a page, simply do: require_once 'httpbl.php';
   
  This library is derived from:
  <a href="
  http://planetozh.com/blog/my-projects/honey-pot-httpbl-simple-php-script/">
  http://planetozh.com/blog/my-projects/honey-pot-httpbl-simple-ph...</a>
  */
  define('HTTPBL_API_KEY','La clé API ici');
  ob_start();
  if(!session_id()) session_start();
  if (isset($_COOKIE['notabot']))
  {
  httpbl_logme();
  if ($_SESSION['httpbl']['activity']<8 && strpos($_SERVER['HTTP_USER_AGENT'],'Windows'))
  httpbl_infected(); // Only display infection banner if last spam was less than 8 days ago.
  }
  else
  {
  httpbl_check();
  }
   
  function httpbl_lang()
  {
  // We try to auto-detect language (english by default)
  foreach(explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']) as $language)
  { if ($language=='fr') { return 'fr'; } }
  return 'en';
  }
   
  function httpbl_infected() // Display infection message.
  {
  echo <<<HTML
  <style type="text/css">
  <!--
  #httpbl_warning { text-align:center; border:1px solid black; background-color:#39678E; color:white;}
  #httpbl_warning td { color:white; font:13px sans-serif; padding:0 0 0 7px;}
  #httpbl_warning td#sign { color:yellow;font-family:serif; font-size:42pt; font-weight:bold;padding:0 10 0 14; }
  #httpbl_warning td#note { color:#ddd; font-size:11px;}
  #httpbl_warning a { color:#AAE0AA; text-decoration:none; }
  #httpbl_warning a:hover { color:#FFFFBE; }
  -->
  </style>
  HTML;
  $ip=$_SERVER['REMOTE_ADDR'];
  $days = $_SESSION['httpbl']['activity'];
  if (httpbl_lang()=='fr')
  {
  $daysmsg=($days>1?" il y a $days jours":'');
  echo <<<HTML
  <div id="httpbl_warning">
  <table align="center"><tr>
  <td id="sign" rowspan="2">!</td>
  <td><b>Votre adresse IP a été détectée comme émettant du <a href="http://www.projecthoneypot.org/ip_$ip">spam</a>$daysmsg. Il est possible que votre ordinateur soit infecté.<br>
  Merci de vous en assurer en utilisant un de ces antivirus gratuits: <a href="https://www.microsoft.com/security/scanner/fr-fr/">Microsoft Safety Scanner</a>,
  <a href="http://housecall.trendmicro.com/fr/">HouseCall TrendMicro</a> ou <a href="http://www.malwarebytes.org/mbam-download.php">Malwarebytes AntiMalware</a>.</b></td>
  <td id="note" style="width:20%;">Ce message s'affiche car ce site web participe à <a href="http://www.projecthoneypot.org/">Project Honeypot</a> pour la lutte contre le spam.</td>
  </tr>
  <tr><td id="note">Ce message continuera à s'afficher plusieurs jours après une éventuelle désinfection de votre ordinateur.</td></tr>
  </table>
  </div>
  HTML;
  }
  else
  {
  $daysmsg=($days>1?" $days days ago":'');
  echo <<<HTML
  <div id="httpbl_warning">
  <table align="center"><tr>
  <td><b>Your IP address has been detected as <a href="http://www.projecthoneypot.org/ip_$ip">spammer</a>$daysmsg. Your computer may be infected.<br>
  Please use one of these free antiviruses: <a href="https://www.microsoft.com/security/scanner/">Microsoft Safety Scanner</a>,
  <a href="http://housecall.trendmicro.com/">HouseCall TrendMicro</a> or <a href="http://www.malwarebytes.org/mbam-download.php">Malwarebytes AntiMalware</a>.</b></td>
  <td id="note" style="width:20%;">You see this message because this website takes part in <a href="http://www.projecthoneypot.org/">Project Honeypot</a> to fight spam.</td>
  </tr>
  <tr><td id="note">This message will continue to show up several days after the disinfection of your computer.</td></tr>
  </table>
  </div>
  HTML;
  }
  }
   
  function httpbl_check() {
  $ip = $_SERVER['REMOTE_ADDR'];
   
  // build the lookup DNS query
  // Example : for '127.9.1.2' you should query 'abcdefghijkl.2.1.9.127.dnsbl.httpbl.org'
  $lookup = HTTPBL_API_KEY . '.' . implode('.', array_reverse(explode ('.', $ip ))) . '.dnsbl.httpbl.org';
   
  // check query response
  $result = explode( '.', gethostbyname($lookup));
   
  if ($result[0] == 127)
  {
  // Query successful !
  $a = array('activity'=>$result[1], 'threat'=>$result[2], 'type'=>$result[3]);
  $typemeaning='';
  if ($a['type'] & 0) $typemeaning .= 'Search Engine, ';
  if ($a['type'] & 1) $typemeaning .= 'Suspicious, ';
  if ($a['type'] & 2) $typemeaning .= 'Harvester, ';
  if ($a['type'] & 4) $typemeaning .= 'Comment Spammer, ';
  $a['typemeaning'] = trim($typemeaning,', ');
   
  // Now determine some blocking policy
  $a['block']=0;
  if (
  ($a['type'] >= 4 && $a['threat'] > 0) // Comment spammer with any threat level
  ||
  ($a['type'] < 4 && $a['threat'] > 20) // Other types, with threat level greater than 20
  )
  {
  $a['block'] = 1;
  }
   
  $_SESSION['httpbl']=$a;
   
  if ($a['block']!=0) {
  httpbl_logme();
  httpbl_blockme();
  exit();
  }
  }
  }
   
  function httpbl_logme() {
  $log = fopen($_SERVER["DOCUMENT_ROOT"].'/httpbl.txt','a');
  $stamp = date('Y-m-d :: H-i-s');
  $page = $_SERVER['REQUEST_URI'];
  $ua = $_SERVER["HTTP_USER_AGENT"];
  if (!isset($_COOKIE['notabot'])) {
  fputs($log,"$stamp :: BLOCKED ".$_SERVER['REMOTE_ADDR']." :: ".$_SESSION['httpbl']['type']." :: ".$_SESSION['httpbl']['threat']." :: ".$_SESSION['httpbl']['activity']." :: $page :: $ua\n");
  } else {
  fputs($log,"$stamp :: UNBLCKD ".$_SERVER['REMOTE_ADDR']." :: $page :: $ua\n");
  }
  fclose($log);
  }
   
   
  function httpbl_blockme() {
  header('HTTP/1.0 403 Forbidden');
  echo '<html><body>';
  httpbl_infected();
  echo <<<HTML
    <script type="text/javascript">
    function setcookie( name, value, expires, path, domain, secure ) {
    // set time, it's in milliseconds
    var today = new Date();
    today.setTime( today.getTime() );
   
    if ( expires ) {
    expires = expires * 1000 * 60 * 60 * 24;
    }
    var expires_date = new Date( today.getTime() + (expires) );
   
    document.cookie = name + "=" +escape( value ) +
    ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
    ( ( path ) ? ";path=" + path : "" ) +
    ( ( domain ) ? ";domain=" + domain : "" ) +
    ( ( secure ) ? ";secure" : "" );
    }
    function letmein() {
    setcookie('notabot','true',1,'/', '', '');
    location.reload(true);
    }
    </script>
    <br>
  HTML;
   
  if (httpbl_lang()=='fr')
  { echo '<div style="font:14px sans-serif;">Pour continuer la navigation, merci de cliquer sur <a href="javascript:letmein()">ce lien</a>. Désolé du dérangement.</div>'; }
  else
  { echo '<div style="font:14px sans-serif;">Please click <a href="javascript:letmein()">this link</a> to continue. Sorry for the inconvenience.</div>'; }
  echo '</body></html>';
  }
  ?>
Alex, 2013/08/07 16:49

Kikou Seb,

merci pour m'avoir fait découvrir le projet Honeypot et avoir partagé le script qui va bien :).

J'obtiens plein de Warning dans mon log d'Apache :

PHP Warning:  date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function.

Je pense avoir fixé le problème en rajoutant un :

date_default_timezone_set("Europe/Paris");

avant l'utilisation de date().

Aussi j'ai eu quelques problème avec le HTTP_ACCEPT_LANGUAGE dans httpbl_lang(). Mais ne connaissant pas grand chose en PHP, j'ai juste commenté deux lignes pour laisser le “return 'en';”.

Sébastien SAUVAGE, 2013/11/26 22:31

oui effectivement ces messages s'affichent à partir de php 5.3 si on a pas fixé une timezone.

Sébastien SAUVAGE, 2019/05/02 20:33, 2019/05/02 20:34

Hello.

La discussion est désormais fermée sur cette page.

project_honeypot.txt · Dernière modification : 2019/05/02 20:34 de sebsauvage