Script php Anti aspirateur

Nouveau WRInaute
Bon, je suis en train de plancher sur un systeme anti-aspirateur sur mon site, mais j'ai comme contrainte d'éviter d'utiliser la bdd mysql, et si possible eviter d'employer trop de ressources.

Donc, je pensais a faire ca en plusieurs points :
- Primo, une petite protection via les user agent dans le htaccess.
- Ensuite, un petit code php dans une page ban.php :
<?
$htaccess="\nDeny from ".$_SERVER["REMOTE_ADDR"];
$fp = fopen(".htaccess","a");
if (flock($fp, LOCK_EX)) {
fputs($fp,$htaccess);
flock($fp, LOCK_UN);
}
fclose($fp);
?>

Je vais faire de l'url rewriting sur le fichier ban.php pour qu'il soit accecible sous n'importe quel nom.
Puis planquer un peu partout sur mon site des lien de 1 pixel qu'un utilisateur a de tres faibles chances de cliquer par lui meme.

Faut que je prépare un truc pour vider le fichier htaccess a intervalle régulier (un cron ?)
Faut aussi que j'adapte le code pour pas blacklister google.

- Enfin, au final, je pense trifouiller du coté des mods d'apache pour limiter l'acces a la bande passante.
Je pense qu'avec ca, je devrait pouvoir éviter la casse.
 
WRInaute discret
Baltyre a dit:
Je vais faire de l'url rewriting sur le fichier ban.php pour qu'il soit accecible sous n'importe quel nom.
Puis planquer un peu partout sur mon site des lien de 1 pixel qu'un utilisateur a de tres faibles chances de cliquer par lui meme.

Bonjour Baltyre,

Où est l'intérêt de planquer des liens de 1 pixel ?

@+
 
Nouveau WRInaute
Un aspirateur va explorer méthodiquement tous les liens mis a sa disposition.
Y a de tres forte chance qu'il prenne aussi le lien de 1 pixel planqué quelque part sur la page.
Bref, si quelqu'un accede a cette page, il a 99% de chances que ce soit un robot. (et cette page entraine un ban automatique)
 
WRInaute passionné
merci baltyre

c exactement ce qu'il me fallait

quand j'ai vu 4 requetes sur le script de renard rouge, j'ai trouvé çà un peu lourd
 
WRInaute discret
Baltyre a dit:
Un aspirateur va explorer méthodiquement tous les liens mis a sa disposition.
Y a de tres forte chance qu'il prenne aussi le lien de 1 pixel planqué quelque part sur la page.
Bref, si quelqu'un accede a cette page, il a 99% de chances que ce soit un robot. (et cette page entraine un ban automatique)

Pardon je n'avais pas compris :arrow:
 
S
suppr36306
Guest
Bonjour,

Je suis le webmaster du site copyme.org et j'ai commencé un projet sur sourceforge : http://sourceforge.net/projects/copyme qui je crois rejoint ton idée. Ce projet est développer en php/mysql

Je cherche des développeurs pour continuer ce projet et avancer sur le thème des anti-aspirateur et de l'anti-leech.

Nous pourrions mettre en commun nos efforts pour développer un script qui pourrait je pense intéressé beaucoup de personne :D

Je cherche un graphiste pour l'interface, des développeurs php pour l'optimisation du code et des ames charitables pour héberger ce beau projet sur des serveurs plus performants que ovh, un administrateur cvs et subversion, des bonnes plumes pour faire la doc et des modérateurs pour faire un forum sur le sujet. Voila.

Alors à vos claviers et vive l'opensource.

Pour voir un exemple de se que cela peut donner : http://www.copyme.org

Pour me contacter sur msn : lecomte0@gmail.com

Cordialement,
 
WRInaute discret
Renardrouge a dit:
Hello les webmasters,

J'ai un petit script php anti aspirateur pour ceux que ca interessent éventuellement:

C'est léger:
- 30 lignes de codes
- 3 requetes Mysql.

Ca fait quoi:
- Ca bloque les adresses IP qui demandent des pages php a un trop grand ryhtme (beaucoup plus qu'un visiteur normal).

- ce n'est en rien basé sur les user agent/robots.txt car tous les aspirateurs permettent de faire n'importe quoi.

Ca ne bloque pas les robots:
- google est passé hier chez moi sans problème, deepindex aussi, scooter aussi.... bon je les connais pas tous mais aucun robot n'a été arrété, car les robots ne font pas des accès bourrins sur les sites (au contraire des aspirateurs qui sont hyperviolents dans le genre)..

Ca marche:
- jusqu'a maintenant il a bloqué: Téléport pro/ Httrack / Memoweb / Webreaper / Offline Explorer. Ca marche logiquement avec les autres aussi.

(je mettrais l'adresse s'il y a de demande, ou 1 mp et je vous envoie l'url).

Vos commentaires sur le sujet (pour ceux que ca interessent bien sur) sont les rudement bienvenus pour l'améliorer encore.
:D

EDIT du 18/7: je mets l'url ca m'évite de répondre en privé au mp qui me le demande toujours de temps à autre: http://www.1001bd.com/stop_aspirateurs
Pour infos: Des liens commencent à aparaitre sur les sites de ressources pour webmaster, il est présent sur 01.net, sur le support d'amen.fr et il devrait être reppris sur le CD dans quelques magazines spécialisés. Si vous le voyez envoyez moi un scan du mag, ca me fera toujours plaisir. :wink:

Ce script fonctionne sans problème. Par contre, je cherche le moyen de vider régulièrement (toutes les 24h) la table des IP bannis avec une petite ligne de cron.

Une question importante qui peut montrer les limites de ce filtre. Des étudiants qui à partir d'une salle informatique d'un lycée ou collège surfent, partagent la même adresse IP. Si plusieurs se connectent sur le même site, le filtre risque très rapidement de bloquer cette salle.
 
WRInaute impliqué
et en .htacess ?

bonjour
pour mon cas j'ai déjà lancé un sos pour mon site :
http://www.unesourisetmoi.info
sur lequel je mets à disposition de tous un tas de créations et de wallpapers
mais ... comment installer ce scipt ??? :?:
(je n'y connais rien !) :?
j'aurais plutôt voulu mettre un .htacess qui arrête les aspi (j'en ai une grande liste si cela t'intéresse) et pas les robots
c'est faisable ??
:wink:
@mitiés
b g
 
WRInaute impliqué
ajax a dit:
Une question importante qui peut montrer les limites de ce filtre. Des étudiants qui à partir d'une salle informatique d'un lycée ou collège surfent, partagent la même adresse IP. Si plusieurs se connectent sur le même site, le filtre risque très rapidement de bloquer cette salle.
Heuh, si les choses sont bien faites, un routeur+proxy ne devrait il pas leur attribuer une adresse IP par poste ?
Je sais pas, je demande :wink:
 
WRInaute impliqué
Re: et en .htacess ?

bg62 a dit:
bonjour
pour mon cas j'ai déjà lancé un sos pour mon site :
http://www.unesourisetmoi.info
sur lequel je mets à disposition de tous un tas de créations et de wallpapers
mais ... comment installer ce scipt ??? :?:
Tu veux que je te rassure ?
avec javascript désactivé ton site est inconsultable !
donc un aspirateur ne pourra pas suivre les liens de tes menus, et ne pourra pas aspirer grand chose ... :D

donc autant le script que ton htaccess sont totalement inutiles pour le moment !

félicitations :roll:
 
WRInaute impliqué
Re: et en .htacess ?

Tu veux que je te rassure ?
avec javascript désactivé ton site est inconsultable !
donc un aspirateur ne pourra pas suivre les liens de tes menus, et ne pourra pas aspirer grand chose ... :D

donc autant le script que ton htaccess sont totalement inutiles pour le moment !

félicitations :roll:[/quote]
:?:
merci pour la réponse ... mais pourrais-tu être plus 'clair' ... j'ai pas tout compris :roll:
@mitiés
bg
 
WRInaute impliqué
Re: et en .htacess ?

Albert1 a dit:
bg62 a dit:
bonjour
pour mon cas j'ai déjà lancé un sos pour mon site :
http://www.unesourisetmoi.info
sur lequel je mets à disposition de tous un tas de créations et de wallpapers
mais ... comment installer ce scipt ??? :?:
Tu veux que je te rassure ?
avec javascript désactivé ton site est inconsultable !
donc un aspirateur ne pourra pas suivre les liens de tes menus, et ne pourra pas aspirer grand chose ... :D

donc autant le script que ton htaccess sont totalement inutiles pour le moment !

félicitations :roll:

:roll:
ben non seulement je n'y comprends rien 'javascript désactivé' (?)
mais je ne suis pas rassuré non plus ...
je viens de lancer httrack rien que pour voire et il me pompe les images sans aucun problème ....
:evil:
@mitiés
b g
 
WRInaute impliqué
Re: et en .htacess ?

bg62 a dit:
je viens de lancer httrack rien que pour voire et il me pompe les images sans aucun problème ....
en effet sous Lynx (Lynx/2.8.5rel.1) on peut visiter ton site ... donc il est probable que Httrack peut en faire de même !

après pour le reste, je pense que tu devrais ouvrir un sujet spécifique à ton cas spécifique :wink:
 
Nouveau WRInaute
Albert1 a dit:
Heuh, si les choses sont bien faites, un routeur+proxy ne devrait il pas leur attribuer une adresse IP par poste ?
Je sais pas, je demande :wink:

Ben, à mon lycée, on avait 1 ip pour tout le lycée, pratiquement, je vérifierais l'année prochaine... CT bien pratique quand on a fait des koneri, par ex. tomber sur un site avec 200 à 500 tunnels http (pour dépasser le routeur). Si qqn veut l'adresse qu'il demande à jahvscriptmaniac_areaubzeuh_gmail-point-com. Non, je ne mets pas mon adresse en clair, non !

Ensuite, pour bloquer les méchants aspi et préserver les gens gentils qui font une aspi intelligente, proposez un lien "télécharger toute la section" par ex. : ça permet de ne pas avoir à se sauvegarder les 50 (500?) pages d'un tut.
Ensuite, j'avoue que si j'avais eu un bon aspi il y a un moment, dans ma periode téra(octets), j'aurais téléchargé la moitié de la toile sur mon disque dur 3Go :D

Alebert : Envoie un mp au créaeur, il pourra sûrement t'aider un coup. Ensuite, les zolies zimazes supercool qui se zooment automatiquement sont gérées par javascript. On peut le désactiver pour ne pas avoir ce genre de trucs flashouillants. Les aspi n'on généralement pas de javascript dans leur sac.
Ne croyez pas que je suis contre javascript, je vais créer un site 100% javascript, mais aussi avec une interface html uniq. et 1 interface js partielle pour IE3 & co., et tout avec toutes les fonctionnalités, pas comme hotmail (beurk) qui désactive tout dès IE5.

Petit truc à part : Methode pour ajouter des mots-clés cachés pour gg quand on a une page d'accueil avec rien dessus sauf un gros lien.
- 1 Insérez une description sensée et concise du site, pour avoir ça dans la description gg
- 2 Faites un petit js qui cahe le div contennant ça et affiche à la place un lien "Description du site" qui développe le div
- 3 Vous êtes content, vous avez des mots-clés & une description
- 4 gg vous embête pas, le texte est bien sur votre page, et pas caché mais masqué (j'ai pas encore testé si c'est vrai...)

P.S. Lundi, je pars pour 3 semaines pour une contrée lointaine sans ordis : X-(
 
WRInaute impliqué
bg62 a dit:
moi tout ça je veux bien, mais cela ne me donne pas la solution au problème ...
@+
bg
boulet-repere.gif
 
WRInaute impliqué
facile à dire !

bg[/quote]
boulet-repere.gif
[/quote]
facile ... mais ça ce n'est pas de l'aide !
un boulet ... oui
repéré ... oui
mais ... bof !!! 8O pour la réaction !
:wink:
@+
bg
 
Nouveau WRInaute
Tu peux sur un vps ou un dedie interdire tout ce qui fait XX requetes.
Les hébergeurs mutu qui le font, sont rare, tres rare.
 
Nouveau WRInaute
Bonjour, j'aurai voulu savoir si le code était encore d'actualité en ce premier septembre 2006 ?

Aussi, est-il possible de l'utiliser en l'incluant via un "include" dans toutes les page web... ça permet ainsi de mettre un simple include dans chaque page et faire un appel au même script à chaque nouvelle page visité...


Des soucis ont-il été remarqué avec l'url rewritting ???

Un tout grand merci d'avance

PS: super site, j'y apprend plus tous les jours !
 
WRInaute impliqué
jedijul a dit:
Bonjour, j'aurai voulu savoir si le code était encore d'actualité en ce premier septembre 2006 ?

Oui :D .

jedijul a dit:
Aussi, est-il possible de l'utiliser en l'incluant via un "include" dans toutes les page web... ça permet ainsi de mettre un simple include dans chaque page et faire un appel au même script à chaque nouvelle page visité...

Aucune idée :roll: .


jedijul a dit:
Des soucis ont-il été remarqué avec l'url rewritting ???

Un tout grand merci d'avance

PS: super site, j'y apprend plus tous les jours !

Aucun problème :D .
 
WRInaute discret
Aspirateurs

Bonjour, j'aurai voulu savoir si le code était encore d'actualité en ce premier septembre 2006 ?

Le code est toujours valable je pense, et les anciens aspirateurs existeront toujours. Une date de dernière mise à jour serait bienvenue.

J'ai vu dans mes stats l'accès à mon site par cet aspirateur h**p://www.freedownloadmanager.org/

Donc, comment rajouter les aspirateurs qui n'apparaissent dans cette liste, comment récupérer leur identifiant ?

Existe t'il des sites qui tiennent des listes à jour des aspirateurs ?

Mais je ne crois pas trop au blocage niveau IP, car chez Orange, elle change tous les jours.

Merci d'avance.
 
WRInaute passionné
lol

lol

tout ça m'a l'air bien compliqué

les variables d'environnements ne s'arrettent pas à user_agent

il devrait y avoir un moyen plus simple qui permettrait de faire la différence entre un robot et un pc client

il y a aussi des fonctions du type getbrowser

rog
 
WRInaute discret
J'ai installé hier le script. Il faut encore que j'étudie a fond mes logs mais j'ai déjà pu voir que FAST Enterprise Crawler me pompait toujours pas mal de bande passante.

Je crois qu'il s'agit d'un robot et non pas d'un aspirateur. Exact ?

Si je ne souhaite pas qu'il "scanne toutes mes pages", il me reste le htaccess. Exact ?

Greg
 
WRInaute discret
Salut,

En haut de mon site s'affiche le message IP interdite pour abus depuis qu'une adresse IP est interdite.

Le problème c'est qu'apriori si c'est affiché pour moi c'est aussi affiché pour tous les internautes. Pouvez vous me confirmer ?

connectez vous sur http://www.itinerances.info/ et dites moi si le message s'affiche.

Dans cette éventualité, quelqu'un peut-il me dire pourquoi il s'affiche et comment le supprimer pour les internautes dont l'ip n'est pas interdite ?

Greg
 
Nouveau WRInaute
Fichier manquant

Bonjour
Le fichier aspilock.zip (celui utilisant des fichiers à la place de MySQLà est manquant sur http://janfy.net/vague/ et c'est aspilock_heap.zip qui se dl à la place.
Quelqu'un pourrait-il donner un lien pour télécharger le bon aspilock.zip ?
Merci d'avance.
@+
 
WRInaute discret
Un nouveau script pour ce protéger efficacement

Bonjour,

Après avoir subit des attaques récemment, j'ai remis à jour un script php qui semble très bien fonctionner pour moi après quelques tests.
Je vous donne donc le lien : http://www.misfu.com/information-sur-le-fichier-375.html

J'aimerai quand même avoir l'avis des experts du forum sur ce script :D
Si certains d'entre vous le souhaitent, je peux afficher ici le contenue de mon fichier listeiprobots.php
 
WRInaute passionné
Ce n'est pas potentiellement dangereux d'écrire sur le htaccess en ligne de cette manière ??

Si le script à une faille, ça craint...

Avis aux spécialiste svp...
 
Nouveau WRInaute
Salut,

j'ai réalisé le début du commencement d'une page d'administration du script, car je trouvais dommage de ne pas avoir de retour graphique de son fonctionnement.

ATTENTION !!! Comme je n'y connais presque rien en php, ce script n'est pas du tout optimisé et peut contenir une ou plusieurs failles.

Code:
<!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="fr" >
   <head>
       <title>Administration du traçage IP</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	<style type="text/css">
        h2, h3, th, td, form
        {
            text-align:center;
        }
        table
        {
            border-collapse:collapse;
            border:2px solid black;
            margin:auto;
			}
        th, td
        {
            border:1px solid black;
        }
		tr
		{
			background: gray;
		}
		td
		{
			background: white;
		}
        </style>
		
    <body>
	<h2>Liste des IP enregistrées :</h2>
	<table><tr>
	<th>IP</th>
	<th>User agent</th>
	<th>Date</th>
	<th>Compteur</th>
	</tr>
	<?php
	
	mysql_connect("localhost", "identifiant", "mot_de_passe");
	mysql_select_db("nom_de_la_base");
	
	
	// on efface l'entrée de la liste noire si demandé
	
	if (isset($_GET['supprimer']))
	{
	$_GET['supprimer'] = mysql_real_escape_string(htmlspecialchars(addslashes($_GET['supprimer'])));
	mysql_query('DELETE FROM ip_bl WHERE id=\'' .$_GET['supprimer']. '\'');
	}
	
	// on ajoute les entrées à bannir s'il y a lieu
	
	if (isset($_POST['ip']) OR isset($_POST['ua']))
	{
	$ip = mysql_real_escape_string(htmlspecialchars(addslashes($_POST['ip'])));
	$ua = mysql_real_escape_string(htmlspecialchars(addslashes($_POST['ua'])));
		if ($_POST['id_entree'] ==0)
		{
		mysql_query("INSERT INTO ip_bl VALUES('', '" .$ua. "', '" .$ip. "', '', '')");
		}
		else
		{
		$_POST['id_entree'] = addslashes($_POST['id_entree']);
		mysql_query("UPDATE ip_bl SET ip='" .$ip. "', ua='" .$ua. "'");
		}
	}
	
	// on liste maintenant les entrées enregistrées dans les tables ip et ip_bl
	
	$reponse = mysql_query ("SELECT * FROM ip ORDER BY date DESC");
	while($donnees = mysql_fetch_array($reponse))
	{
	?>
	<tr>
	<td><?php echo $donnees['ip']; ?></td>
	<td><?php echo $donnees['ua']; ?></td>
	<td><?php echo $donnees['date']; ?></td>
	<td><?php echo $donnees['cpt']; ?></td>
	</tr>
	<?php
	}
	?>
	</table>
	
	<h2>Liste des IP en liste noire :</h2>
	
	<h3><a href="index.php?ajout=oui">Ajouter une ip ou un user-agent en liste noire</a></h3>
	
	<?php
	if (isset($_GET['ajout']))
	{
	?>
	<form method="post">
	<p>IP à bannir : <input type="text" size="15" maxlength="15" name="ip" value="" /></p>
	<p>User agent à bannir : <input type="text" size="30" name="ua" value="" /></p>
	<input type="hidden" name="id_entree" value="<?php echo $id_entree; ?>" /> <!-- 0 si nouveau, != 0 si modif -->
	<p><input type="submit" value="Valider" /></p>
	</form>
	<?php
	}
	?>
	
	<table>
	<tr>
	<th>IP</th>
	<th>User agent</th>
	<th>Date</th>
	<th>Compteur</th>
	</tr>
	<?php
	
	$reponse = mysql_query ("SELECT * FROM ip_bl ORDER BY date DESC");
	while($donnees = mysql_fetch_array($reponse))
	{
	?>
	<tr>
	<td><?php echo $donnees['ip']; ?></td>
	<td><?php echo $donnees['ua']; ?></td>
	<td><?php echo $donnees['date']; ?></td>
	<td><?php echo $donnees['cpt']; ?></td>
	<td><?php echo '<a href="index.php?modifier=' .$donnees['id']. '">'; ?>Modifier</a></td>
	<td><?php echo '<a href="index.php?supprimer=' .$donnees['id']. '">'; ?>Supprimer</a></td>
	</tr>
	<?php
	}
	mysql_close();
	?>
	</body>
	</html>
Ce script permet de voir quelles sont les adresses ip enregistrées, quelles sont les ip bannies. Il permet aussi de bannir et débannir des IP manuellement.

---> Je répète : n'utilisez PAS ce script tel quel, à moins de le protéger dans un dossier par .htaccess, car :
1 - il ne nécessite pas d'authentification (donc n'importe qui peut accéder au script et bannir n'importe quelle ip)
2 - il est vraisemblablement codé avec les pieds et peut comporter une faille de sécurité, notamment du côté de la variable $_GET. En plus, j'ai toujours eu du mal avec les " et les ' et je me perds sans cesse entre les deux...


RESTE A FAIRE : Une liste blanche, un système d'authentification pour ceux qui ne veulent/peuvent pas utiliser de .htaccess, et ajouter un peu de css pour rendre l'interface plus jolie.


Voilà, si quelqu'un avec des connaissances en php supérieures aux miennes, peut-il me filer un petit coup de main ?

Merci :)
 
WRInaute occasionnel
Dès qu'il y'a un while il est préférable de faire une requête supplémentaire en amont pour fixer une limite aux nombres de résultats qui vont sortir. Cela évite les while à l'infinie en cas d'attaque...
 
Nouveau WRInaute
Re: Script php Anti aspirateur

Code:
//ligne 86
$Vua   = $HTTP_SERVER_VARS["HTTP_USER_AGENT"];
//ligne 113
if ($Vcpt == 0) mysql_query("INSERT into ip (id, ua, ip, date, cpt) values ('', '$Vua', '$Vip', '$Vdate', '1')");

passe ton safe_mode à on, c'est gros :D
 
WRInaute discret
Re: Un nouveau script pour ce protéger efficacement

misfu a dit:
Bonjour,

Après avoir subit des attaques récemment, j'ai remis à jour un script php qui semble très bien fonctionner pour moi après quelques tests.
Je vous donne donc le lien : http://www.misfu.com/information-sur-le-fichier-375.html

J'aimerai quand même avoir l'avis des experts du forum sur ce script :D
Si certains d'entre vous le souhaitent, je peux afficher ici le contenue de mon fichier listeiprobots.php

Deny from google, yahoo, live... aussi ?
 
WRInaute occasionnel
Ca existe encore ces histoires d'aspirateurs, en 2017 ? On s'en préoccupait déjà il y a 10 ans, c'est donc toujours le cas, avec les histoires de robot.txt, etc... ?
 
WRInaute accro
Je m'inquiéterais plus des scrapeurs que des aspirateurs. Et en la matière, un réseau de proxies et hop, le blocage par IP tombe...

Il n'existe AUCUN script valable pour bloquer ce genre de chose.
 
WRInaute occasionnel
Hello,

Ne pas en faire une généralité non plus... Perso avec mon moteur, je scrape que la page d'accueil d'un site tous les 10 jours pour la mise à jour des résultats. J'ai pas l'impression d'être nuisible à ce rythme..

bonne bonne
yule
 
WRInaute occasionnel
cedric_g a dit:
Je m'inquiéterais plus des scrapeurs que des aspirateurs. Et en la matière, un réseau de proxies et hop, le blocage par IP tombe...

Il n'existe AUCUN script valable pour bloquer ce genre de chose.
Mais si :roll: La solution passe aussi par bloquer les points de sortie des proxies directement sur le serveur: exemple le réseau TOR (tout ce qui bricole sur un site à partir de ce "réseau" doit être interdit). Bloquer l'adresse IP est la première chose à faire. La deuxième est d'interdire l'accès au serveur de toute la plage.

J'ai créé un script anti-bricoleur en 2013. Ces deux derniers mois, bloqué les adresses suivantes:
138.197.7.55
138.197.111.124
et d'autres pour attaques massives.

Pas un problème: interdiction sur toute la plage de Digital Oncean https://myip.ms/view/ip_addresses/2328166400/138.197.0.0_138.197.0.255

Interdire une adresse IP est inutile Ce pârasite (je parle pas de l'hébergeur) a essayé par une vingtaine d'adresses différentes). On bloque la plage complète de l'hébergeur.
 
WRInaute occasionnel
cedric_g a dit:
Je m'inquiéterais plus des scrapeurs que des aspirateurs. Et en la matière, un réseau de proxies et hop, le blocage par IP tombe...
Vais commencer par toi (malgré tout le respect que je te porte et sur ton site génial) ... Les réseaux de proxy fonctionnent comme de simple copieurs africains. Des adresses IP ... Il y a quand même une différence, des adresses standards utilisées sur des PC standards.
Drew a dit:
Si quelqu'un veut copier/aspirer alors il le fera.
Deux webmasters sur WRI ont programmé ce genre de protections: Moi et Ortoloft. Comme il y a quelques mois avec adblock ... essaye avant de discuter dans le vide.

Personnellement, les aspirateurs sont bloqués, les tentatives SQL, ... automatiquement. D'autres aussi. Ca se base sur l'analyse des pages (chaque page enregistre d'abord la visite avant d'afficher la page). Le reste, c'est de la programmation et retour en 403 pour tout ce qui semble pas normal. Comment crois tu que j'ai repéré les adresses de Digital Ocean: en analysant les logs des visiteurs? J'ai pas trop le temps à m'amuser.
Les systèmes des deux webmasters utilisent l'adresse IP des visiteurs et le nombre de pages visitées dans un labs de temps (c'est un peu plus complexe). Effectivement, un visiteur qui analyse une page tout les 15 jours ne sera pas détecté, avec 30.000 pages, ca lui fait un paquet d'années avant d'aspirer le site (sauf qu'un autre rapport le détectera avant).
C'est pas moi qui vais te donner les techniques utilisées par les bricoleurs (désolé :mrgreen: ).
Il y a des protections payantes et ... des développée maison. Pas assez riche pour la première solution et suffisamment doué (en fait suffisamment de temps pour développer) la deuxième. En plus la mienne est multi-site: bloqué sur un site = bloqué sur tous les sites du serveur protégés.
C'est pas la première fois que je te donne un exemple de protection mais je sais ...
Drew a dit:
Encore un truc pour parano ça...
On est d'accord mais ca marche.
 
WRInaute occasionnel
Juste pour informer sur l'avancée des technologies d'aspirateurs.
  • On voit des aspirateurs de première génération : depuis une IP, avec un user-agent identifiable, je télécharge massivement des pages
  • Cette première génération s'est faite bloquer, les scripts prennent donc un user-agent classique. Cette seconde génération peut donc passer au travers des blocages des user-agent. La protection est alors par analyse de fréquence des hits d'une même ip.
  • Vient alors la troisième génération, qui exploite des ips multiples, ainsi une ip n'attendra pas à elle seule une fréquence suffisamment élevée pour se faire avoir. Le script de protection doit alors regarder sans filtrer sur l'ip la fréquence d'apparition de ce user-agent
  • Vient alors la quatrième génération, toujours-multi-ip, mais aussi multi-user-agent. Elle passe donc au travers de la plupart des filtres. Avec un user-agent non fixe, ce sont d'autres empreintes numériques à analyser (provenance de data centers, etc..).
On pourrait aussi détailler le fait que les aspirations sont multi-country (de moins en moins mono-country). Au final, la techno des aspirateurs évolués s'apparente à un botnet... Il faut donc se prémunir plus globalement des attaques par ce biais et non pas en se focalisant seulement sur les aspirateurs de premières générations.
Regardez vos logs, que votre site soit à faible traffic ou pas, vous aurez un ratio très élevé de robots, c'est à dire des visiteurs qui ne vous servent à rien (pas de revenu entre autres).
Il y a donc 4 catégories de traffic
  • Les visiteurs, ceux-ci ne doivent surtout pas être pénalisés par un détecteur de robot qui fonctionnerait mal.
  • Les gentils robots : google, bing, yandex, sogou etc... globalement les crawlers. On peut aussi y inclure les outils marketing de catégorisation des pages, ça aide pour les pubs ciblées et donc le click ratio
  • Les méchants robots : aspirateurs, détecteurs de données perso, botnets, ceux qui cherchent les failles sécurité etc.
  • Les autres : des robots dont vous n'avez pas la certitude qu'ils soient gentils ou méchants, mais donc l'empreinte numérique montre que ce sont eds robots
Pas simple de pouvoir détecter tout cela, ce n'est pas une logique en 30 lignes de code, et bien entendu ça doit être hyper performant pour ne pas pénaliser la durée de chargement des pages et donc sans impact SEO
Si vous construisez un tel système, alors vous avez la qualification efficace des visiteurs, ce qui vous permet ainsi de traiter côté serveur les stats de visite/fréquentation, et monter également votre propre système pour vous substituer à Google analytics et autres, augmentant à nouveau la perf des pages et facilitant certaines contraintes GDPR/cookies.
L'objectif de ces commentaires n'est pas de vous fournir du code, mais des idées d'amélioration de vos outils. Ca prend du temps, mais l'efficacité augmente. Un outil inefficace n'est pas utile
 
WRInaute accro
Bonjour

Merci d'infirmer ou confirmer le code ci-dessous.

En particulier le calcul de l'ip remote.

Les instructions MySQL sont faites à travers une librairie utilisée sur mon site.

Je ne mémorise pas les ips seulement les hash codes.


PHP:
<?php

require(__DIR__ . "/php/config/config.php");

require(__DIR__ . "/php/config/fonctions.php");

require(__DIR__ . "/php/fonctions/fonctions.php");

class ANTI_ASPI extends FUNCTIONS_FUNCTIONS {

    public $new_conn    = null;

    const MAX_NBRE        = 10;    // Nbre max de connexions même ip.

    const MAX_DELAY        = 60;  // Délai min absence de blocage.

    /**********************************/
    /**  Fonction correcte ou non ?  **/
    /**********************************/
    private function hash_ip() {

        $ip4 = (isset($_SERVER['HTTP_CLIENT_IP']) && filter_var($_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) ? $_SERVER['HTTP_CLIENT_IP'] : ((isset($_SERVER['HTTP_X_FORWARDED_FOR']) && filter_var($_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : ((isset($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) ? $_SERVER['REMOTE_ADDR'] : null));

        $hashed_ip = ($ip4 !== null) ? hash('sha256',$ip4) : null;

        if($hashed_ip === null) {

            $ip6 = (isset($_SERVER['HTTP_CLIENT_IP']) && filter_var($_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) ? $_SERVER['HTTP_CLIENT_IP'] : ((isset($_SERVER['HTTP_X_FORWARDED_FOR']) && filter_var($_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : ((isset($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) ? $_SERVER['REMOTE_ADDR'] : null));

            $binary = ($ip6 !== null) ? inet_pton($ip6) : false;

            $ip6 = ($binary !== false) ? inet_ntop($binary) : null;

            $hashed_ip = ($ip6 !== null) ? hash('sha256',$ip6) : null;
        }

        return $hashed_ip;
    }

    private function allowed_hashed_ip() {

        $this->new_conn = new RUN_BDD();

        if(($hashed_ip = hash_ip()) !== null) {

            $row = $this->new_conn->TABLE('HASH_IP')->WHERE(['ID', '=', $this->SQLChaine($hashed_ip)])->SELECT($this->new_conn->RAW('NBRE, UNIX_TIMESTAMP(FIRST_ACCESS) AS TIMESTAMP'))->GET();

            if(empty($row)) {

                $this->new_conn->TABLE('HASH_IP')->INSERT(['ID' => $this->SQLChaine($hashed_ip)]);

                return true;

            } else {

                if($row['NBRE'] > self::MAX_NBRE) {

                    return false;
                }

                if((time() - (int)$row['TIMESTAMP']) > self::MAX_DELAY) {

                    $this->new_conn->TABLE('HASH_IP')->WHERE(['ID', '=', $this->SQLChaine($hashed_ip)])->DELETE();

                    return true;

                } else {

                    $this->new_conn->TABLE('HASH_IP')->WHERE(['ID', '=', $this->SQLChaine($hashed_ip)])->UPDATE(['NBRE' => 1 + $row['NBRE']]);
                    return true;
                }
            }
        }
    }

    // CREATE TABLE HASH_IP(ID VARCHAR(70) NOT NULL DEFAULT '' PRIMARY KEY, NBRE INTEGER NOT NULL DEFAULT 1, FIRST_ACCESS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE = MEMORY;

    public function __construct() {

        parent::__construct($this);

        if($this->allowed_hashed_ip() === false) {




        }
    }
}

$index = new ANTI_ASPI();

?>
 
WRInaute accro
Bon

Voici l'algorithme pour résoudre le problème du prerender ( Chrome ) et du prefetch :

Code:
                       -----------------
                    |    SERVER    |
                       -----------------
                 | DRAPEAU = 1    |
                       -----------------

                                           ------------------
                                        |     CLIENT     |
                                           ------------------
                ---------------< N JAVASCRIPT ? Y >--------------
            |                             ------------------                         |
            |                                                                          |
            |                                                           --------------------------
            |                              -------------< N PRERENDER POSSIBLE ? Y >--------
            |                             |                           ---------------------------                         |
            |                             |                                                                                  |
            |                             |                                                                                  |
            |                  -----------------                                                             ------------------------
            |             |  script1.php    |                                              |    WAIT MODE VISIBLE   |
            |         | EN JAVASCRIPT    |                                          |       => script1.php           |
            |          |   DRAPEAU = 2  |                                              |        DRAPEAU = 2           |
            |                -----------------                                                    |      EN JAVASCRIPT        |
            |                          |                                                                     ------------------------
            |                          |                                                                                 |
            |                          |                                                                                 |
            |                           -------------------------------------------------------------------------
            |
    -----------------
| script1.php    |
| MODE IMG SRC    |
| DRAPEAU = 2    |
        -----------------

                                        -------------------------
                                       |     SERVER        |
                                       -------------------------
                                 |   FORK script2.php    |
                               |   WAIT DRAPEAU = 2    |
                           | RUN ANTISASPIRATEUR    |
                                         -------------------------
Bonjour

Merci d'infirmer ou confirmer le code ci-dessous.

En particulier le calcul de l'ip remote.

Les instructions MySQL sont faites à travers une librairie utilisée sur mon site.

Je ne mémorise pas les ips seulement les hash codes.


PHP:
<?php

require(__DIR__ . "/php/config/config.php");

require(__DIR__ . "/php/config/fonctions.php");

require(__DIR__ . "/php/fonctions/fonctions.php");

class ANTI_ASPI extends FUNCTIONS_FUNCTIONS {

    public $new_conn    = null;

    const MAX_NBRE        = 10;    // Nbre max de connexions même ip.

    const MAX_DELAY        = 60;  // Délai min absence de blocage.

    /**********************************/
    /**  Fonction correcte ou non ?  **/
    /**********************************/
    private function hash_ip() {

        $ip4 = (isset($_SERVER['HTTP_CLIENT_IP']) && filter_var($_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) ? $_SERVER['HTTP_CLIENT_IP'] : ((isset($_SERVER['HTTP_X_FORWARDED_FOR']) && filter_var($_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : ((isset($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) ? $_SERVER['REMOTE_ADDR'] : null));

        $hashed_ip = ($ip4 !== null) ? hash('sha256',$ip4) : null;

        if($hashed_ip === null) {

            $ip6 = (isset($_SERVER['HTTP_CLIENT_IP']) && filter_var($_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) ? $_SERVER['HTTP_CLIENT_IP'] : ((isset($_SERVER['HTTP_X_FORWARDED_FOR']) && filter_var($_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : ((isset($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) ? $_SERVER['REMOTE_ADDR'] : null));

            $binary = ($ip6 !== null) ? inet_pton($ip6) : false;

            $ip6 = ($binary !== false) ? inet_ntop($binary) : null;

            $hashed_ip = ($ip6 !== null) ? hash('sha256',$ip6) : null;
        }

        return $hashed_ip;
    }

    private function allowed_hashed_ip() {

        $this->new_conn = new RUN_BDD();

        if(($hashed_ip = hash_ip()) !== null) {

            $row = $this->new_conn->TABLE('HASH_IP')->WHERE(['ID', '=', $this->SQLChaine($hashed_ip)])->SELECT($this->new_conn->RAW('NBRE, UNIX_TIMESTAMP(FIRST_ACCESS) AS TIMESTAMP'))->GET();

            if(empty($row)) {

                $this->new_conn->TABLE('HASH_IP')->INSERT(['ID' => $this->SQLChaine($hashed_ip)]);

                return true;

            } else {

                if($row['NBRE'] > self::MAX_NBRE) {

                    return false;
                }

                if((time() - (int)$row['TIMESTAMP']) > self::MAX_DELAY) {

                    $this->new_conn->TABLE('HASH_IP')->WHERE(['ID', '=', $this->SQLChaine($hashed_ip)])->DELETE();

                    return true;

                } else {

                    $this->new_conn->TABLE('HASH_IP')->WHERE(['ID', '=', $this->SQLChaine($hashed_ip)])->UPDATE(['NBRE' => 1 + $row['NBRE']]);
                    return true;
                }
            }
        }
    }

    // CREATE TABLE HASH_IP(ID VARCHAR(70) NOT NULL DEFAULT '' PRIMARY KEY, NBRE INTEGER NOT NULL DEFAULT 1, FIRST_ACCESS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE = MEMORY;

    public function __construct() {

        parent::__construct($this);

        if($this->allowed_hashed_ip() === false) {




        }
    }
}

$index = new ANTI_ASPI();

?>


Et voici l'algorithme pour gérer le prerender et le prefetch :

Code:
                    -----------------
                    |    SERVER    |
                    -----------------
                    | DRAPEAU = 1    |
                    -----------------

                    ------------------
                    |     CLIENT     |
                    ------------------
                ---------------< N JAVASCRIPT ? Y >--------------
            |        ------------------        |
            |                        |
            |                      --------------------------
            |            -------------< N PRERENDER POSSIBLE ? Y >--------
            |            |         ---------------------------    |
            |            |                        |
            |            |                        |
            |        -----------------                 ------------------------
            |        |  script1.php    |                 |    WAIT MODE VISIBLE   |
            |        | EN JAVASCRIPT    |                 |     => script1.php      |
            |        | DRAPEAU = 2    |                 |       DRAPEAU = 2        |
            |        -----------------                 |      EN JAVASCRIPT        |
            |            |                     ------------------------
            |            |                        |
            |            |                        |
            |            -------------------------------------------------
            |
        -----------------
        | script1.php    |
        | MODE IMG SRC    |
        | DRAPEAU = 2    |
        -----------------

                    -------------------------
                    |     SERVER        |
                    -------------------------
                    |   FORK script2.php    |
                    |   WAIT DRAPEAU = 2    |
                    | RUN ANTISASPIRATEUR    |
                    -------------------------
 
Dernière édition:
WRInaute accro
Pardon

Excusez-moi pour le schéma précédent mal formaté.

J'ai mis en place mon anti-aspirateur sur le site.

Tient compte du prerender de Chrome et du prefetch.

Depuis 30 minutes, un visiteur s'est fait choper.

Les hash codes des ips sont enregistrés pas les ips, et pendant 24h.

Les bots sont reconnus par regex de leurs reverses, par la fonction hash_ip().

Sur les pages vous pouvez visualiser la logique de détection des prerender->active, prefetch et sans javascript.

La table MySQL très simple a un Engine MEMORY, avec 500 Mo allocatés.

Si vous voulez je donne les deux scripts php.

Amicalement.
 
Discussions similaires
Haut