Invasion de faux profils avec message IA + attaques DDoS

Pour discuter de phpBB3 - Pas de support dans cette section !
Pour du support veuillez vous rendre dans la section de support

Modérateur : Équipe

Règles du forum
A lire impérativement : Règlement de phpBB-fr.com

Attention, aucun support n'est donné dans cette section.
Répondre
Avatar du membre
aquanicolas
Apprenti-posteur
Apprenti-posteur
Messages : 189
Enregistré le : 26 déc. 2007 à 10:37
Localisation : Orléans, Paris
Contact :

Invasion de faux profils avec message IA + attaques DDoS

Message par aquanicolas »

Bonjour,

Un petit message d'information, pour savoir si vous êtes confronté aux mêmes problèmes et vos éventuelles conseils.

Depuis maintenant 3 mois, malgré toutes les précautions d'usage (inscription avec questions anti-bot, captcha à trier, etc. ) j'ai une invasion d'inscriptions de faux profils plus vrai que nature.
La plupart du temps ce sont des utilisateurs avec une adresse gmail.

A chaque fois, ces faux profils créé un message dans le forum de présentation et pose une question en rapport avec notre thématique. Parfois il arrivent même à répondre avec logique aux questions posés par les membres. Les phrase sont bien construites et il y a même des abréviations populaire.

Toutefois, comme j’utilise ChatGPT de temps en temps, j'arrive encore à distinguer les messages qui ont toujours la même structure de phrase par ce genre d'IA. Lorsque je les détecte, systématiquement j'envoie un message privé pour vérifier si c'est un être humain derrière le profil ... mes MP ne sont jamais lu.

Les faux profil après avoir posté leur premiers messages qui semblent " normaux " retournent dessus au bout de quelques jours pour les modifier et y intégrer des liens vers des sites commerciaux !

Ca oblige une modération intense et quotidienne chronophage :

Avez-vous des conseils pour limiter l'inscription de ces bots intelligent ?

Autre problème : notre forum est très très régulièrement attaqué (de type DDoS). Notre hébergeur coupe le forum pendant les attaquent pour éviter de faire planter le serveur. Les attaques sont également très bien faites car ce sont des milliers requêtes envoyé en même temps toutes à des URLs différentes mais existante sur notre forum et bien entendu avec des IPs différentes. Notre hébergeur me dit que la seul solution viable serai l'utilisation de Cloudflare.
Je ne comprends pas car nous sommes une petite association sans argent, quel intérêt de monopoliser autant de ressources contre nous !

Avez-vous une idée pour éviter ces attaques ?

J'ai déjà bloqué beaucoup de robot via le robots.txt et dans le .htaccess j'ai utilisé le code suivant sans grand succès (bloquer les URL des principaux pays d’où provient les attaques)

Code : Tout sélectionner

<Limit GET POST HEAD>
order allow,deny
allow from all
deny from .br
deny from .lv
deny from .ru
deny from .vn
deny from .in
deny from .bd
</Limit>

SetEnvIf GEOIP_COUNTRY_CODE BR BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE LV BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE VN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE IN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE BD BlockCountry
Deny from env=BlockCountry
Pas évident de continuer à fournir un forum libre et gratuit :shock:
Avatar du membre
sylver35
Extensions
Extensions
Messages : 8453
Enregistré le : 26 févr. 2008 à 14:58
Localisation : West coast BZH
Contact :

Invasion de faux profils avec message IA + attaques DDoS

Message par sylver35 »

Bonjour,

Une bonne partie de ces inscriptions néfastes peuvent être contrées grâce à l'extension Stop Forum Spam
C'est un outil complémentaire à une bonne protection.

Moi, j'ai choisi de bloquer les plages d'ip souvent rencontrées directement dans CPanel avec le Bloqueur d’adresses IP
Ainsi, ils ne passent pas la redirection DNS.
Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !
cyberclic
Posteur néophyte
Posteur néophyte
Messages : 54
Enregistré le : 24 mai 2007 à 20:39

Invasion de faux profils avec message IA + attaques DDoS

Message par cyberclic »

J’ai la même chose sur mon forum. Maintenant je contrôle une à une les nouvelles inscriptions, sur 3 points :
1) L’adresse IP doit être issue d’un FAI français connu et non d’un VPN (test avec IPCost)
2) L’adresse mail’ surtout si c’est une gmail, doit être dans une liste de fuite de données. (test avec I have been pawned). Je considère qu’une adresse mail qui ne se trouve dans aucune fuite de donnée est récente et donc utilisée pour spammer.
3) Je passe le texte de présentation dans l’outil ZeroGPT, pour détecter si ce a été rédigé par une IA. Mais ce n’est pas très fiable.

Avec ça, j’ai pu bloquer 99% des faux profils.
Avatar du membre
aquanicolas
Apprenti-posteur
Apprenti-posteur
Messages : 189
Enregistré le : 26 déc. 2007 à 10:37
Localisation : Orléans, Paris
Contact :

Invasion de faux profils avec message IA + attaques DDoS

Message par aquanicolas »

Merci pour ces conseils, ca va m'aider :)
ANNIES
Posteur habitué
Posteur habitué
Messages : 221
Enregistré le : 09 déc. 2007 à 15:27
Contact :

Invasion de faux profils avec message IA + attaques DDoS

Message par ANNIES »

si ca peut t aider
Solution a la fin du topic
viewtopic.php?p=1693054#p1693054
Guguss
Posteur néophyte
Posteur néophyte
Messages : 34
Enregistré le : 30 août 2014 à 11:45
Contact :

Invasion de faux profils avec message IA + attaques DDoS

Message par Guguss »

Bonjour à tous,

Confronté à la recrudescence des spammeurs de tout poil, notre travail de modération a été très largement allégé depuis l'installation de l'extension CleanTalk AntiSpam, après que nous ayons testé Stop Forum Spam quelques temps.
Ce n'est pas de la pub, d'ailleurs je ne mets aucun lien, juste un constat. C'est sur abonnement, mais le tarif est plutôt "friendly"

Reste que c'est dernier temps, comme d'autres l'ont exprimé ici, on a aussi repéré des messages qui ont tous plus ou moins les mêmes caractéristiques. Leurs auteurs, quelques temps après leur inscription, insère un lien publicitaire dans leur 1er ou 2nd post.
Le plus "inventif" que nous ayons eu : un lien avec une police de caractères en taille 1. Acollé à un simple point . c'était tout simplement invisible, sauf à l'aller jeter un oeil au contenu en l'éditant ou le citant.


L'autre point qui nous chagrine aussi depuis un mois environ, c'est la "saturation" de la bande passante qui provoque des ralentissements de fou, voire des SQL Errors à répétition.
D'après les stats, c'est d'origine chinoise. Je vais essayer le blocage par geoIP (merci pour l'info ;) ) sinon je pourrais aussi passer par le blocage de toutes les plages IP chinoises dans CPanel.
Instinct-photo
Phpbb v.3.3.7 - PHP v.7.4.33 - MySQL(i) 10-6-15-MariaDB - Gzip off
Hébergé chez O2Switch
Thème : RAVAIO avec modifications perso
spitfrog
Posteur néophyte
Posteur néophyte
Messages : 15
Enregistré le : 29 août 2002 à 08:36

Invasion de faux profils avec message IA + attaques DDoS

Message par spitfrog »

Guguss a écrit : 01 nov. 2025 à 15:09 L'autre point qui nous chagrine aussi depuis un mois environ, c'est la "saturation" de la bande passante qui provoque des ralentissements de fou, voire des SQL Errors à répétition.
J'ai eu Claude.ai qui a saturé le forum il y a quelques mois, il est resté quelques jours et a siphonné tout le forum. Ces IA sont sans vergogne.
Avatar du membre
sync
Posteur néophyte
Posteur néophyte
Messages : 20
Enregistré le : 22 févr. 2008 à 12:53

Invasion de faux profils avec message IA + attaques DDoS

Message par sync »

Bonjour à tous

Je vois l’urgence — je te livre immédiatement un script PHP prêt à déployer (avec commentaires en français) qui combine plusieurs protections contre faux profils / messages IA et attaques DDoS légères à moyennes : rate-limiting, honeypot, validation CAPTCHA (reCAPTCHA ou hCaptcha), heuristiques de détection de texte IA, blocage temporaire IP, journalisation prête pour fail2ban, et suggestions pour WAF / CDN pour attaques volumétriques.
J’ai vérifié les meilleures pratiques et fournisseurs conseillés (Cloudflare pour DDoS/CDN, ModSecurity/OWASP CRS pour WAF, Fail2Ban pour bannissement côté serveur, reCAPTCHA/hCaptcha pour CAPTCHA, et options d’API de détection d’IA).

Voici le code final (tout en tabulations, comme tu préfères). Remplace les valeurs YOUR_... par les clés / chemins réels. Ce fichier est pensé pour être inclus dans les endpoints d’inscription/message (ex : register.php, post_message.php).

Code : Tout sélectionner

<?php
// protection_global.php
// Usage : include 'protection_global.php'; puis appeler check_request_protection('register');
// Remplacer les constantes YOUR_* par les valeurs réelles.

// -------------------- CONFIG --------------------
define('RATE_LIMIT_WINDOW', 60);			// fenêtre en secondes
define('RATE_LIMIT_MAX', 10);			// max requêtes par IP par window (ajuster selon besoin)
define('TEMP_BAN_SECONDS', 300);			// durée du bannissement temporaire
define('LOG_FILE', __DIR__ . "/security.log");	// fichier de log (assurez-vous permissions)
define('IP_STORE_DIR', sys_get_temp_dir() . "/ip_store"); // dossier pour compteurs et bans

// CAPTCHA (choisir l'un ou l'autre, ou les deux)
define('RECAPTCHA_SECRET', 'YOUR_RECAPTCHA_SECRET');	// si utilisé
define('HCAPTCHA_SECRET', 'YOUR_HCAPTCHA_SECRET');	// si utilisé

// API detection IA optionnelle (si tu veux appeler un service payant)
define('AI_DETECT_API_URL', 'https://api.example-ai-detector.com/v1/check'); // placeholder
define('AI_DETECT_API_KEY', 'YOUR_AI_DETECT_KEY'); // placeholder

// Liste noire de domaines / patterns (liens courts, domaines suspects)
$BLACKLISTED_DOMAINS = [
	'bit\.ly', 'tinyurl\.com', 't\.co', 'freeporn', 'cheap-loans', 'xn--' // regex parts
];

// User-Agent suspects simples
$SUSPICIOUS_UA = [
	'curl', 'wget', 'python-requests', 'libwww-perl', 'nmap', 'scrapy', 'bot'
];

// -------------------- INIT --------------------
if (!is_dir(IP_STORE_DIR)) {
	mkdir(IP_STORE_DIR, 0755, true);
}

// -------------------- FONCTIONS --------------------

/**
 * Journalise un évènement de sécurité (pratique pour fail2ban)
 */
function sec_log($msg) {
	$time = date('Y-m-d H:i:s');
	error_log("[$time] $msg\n", 3, LOG_FILE);
}

/**
 * Retourne l'IP réelle (support Cloudflare / proxies si présents)
 */
function get_client_ip() {
	// Respecter Cloudflare / proxies usuels
	if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
		return $_SERVER['HTTP_CF_CONNECTING_IP'];
	}
	$keys = ['HTTP_X_FORWARDED_FOR','HTTP_CLIENT_IP','REMOTE_ADDR'];
	foreach ($keys as $k) {
		if (!empty($_SERVER[$k])) {
			// X-Forwarded-For peut contenir une liste
			$parts = explode(',', $_SERVER[$k]);
			return trim($parts[0]);
		}
	}
	return '0.0.0.0';
}

/**
 * Simple stockage file-based pour compteurs / bans
 */
function ip_store_path($ip, $name) {
	$safe = preg_replace('/[^a-z0-9_\-\.]/i', '_', $ip);
	return IP_STORE_DIR . "/{$safe}_{$name}.dat";
}

/**
 * Incrémente et vérifie rate limit. Renvoie true si ok, false si dépassement.
 */
function rate_limit_check($ip) {
	$path = ip_store_path($ip, 'rl');
	$data = ['ts' => time(), 'count' => 0];
	if (file_exists($path)) {
		$json = @file_get_contents($path);
		$data = json_decode($json, true) ?: $data;
		// si fenêtre expirée => reset
		if ($data['ts'] + RATE_LIMIT_WINDOW <= time()) {
			$data = ['ts' => time(), 'count' => 0];
		}
	}
	$data['count']++;
	file_put_contents($path, json_encode($data), LOCK_EX);
	if ($data['count'] > RATE_LIMIT_MAX) {
		// créer ban
		$banpath = ip_store_path($ip, 'ban');
		$ban = ['until' => time() + TEMP_BAN_SECONDS];
		file_put_contents($banpath, json_encode($ban), LOCK_EX);
		sec_log("RATE_LIMIT_BAN ip=$ip count={$data['count']}");
		return false;
	}
	return true;
}

/**
 * Vérifie si IP est bannie
 */
function is_ip_banned($ip) {
	$banpath = ip_store_path($ip, 'ban');
	if (file_exists($banpath)) {
		$ban = json_decode(file_get_contents($banpath), true);
		if ($ban && isset($ban['until'])) {
			if ($ban['until'] > time()) return true;
			// expiration -> supprimer
			@unlink($banpath);
			return false;
		}
	}
	return false;
}

/**
 * Honeypot : champ caché. Si rempli => bot
 */
function check_honeypot() {
	// Attendu dans POST : 'hp_email' caché dans le front-end (display:none)
	if (!empty($_POST['hp_email'])) {
		sec_log("HONEYPOT_FILLED ip=" . get_client_ip());
		return false;
	}
	return true;
}

/**
 * Vérifie captcha (reCAPTCHA v2/v3 ou hCaptcha)
 */
function verify_captcha() {
	// reCAPTCHA
	if (!empty($_POST['g-recaptcha-response']) && RECAPTCHA_SECRET !== 'YOUR_RECAPTCHA_SECRET') {
		$resp = post_verify('https://www.google.com/recaptcha/api/siteverify', [
			'secret' => RECAPTCHA_SECRET,
			'response' => $_POST['g-recaptcha-response'],
			'remoteip' => get_client_ip()
		]);
		if (!empty($resp['success'])) return true;
		sec_log("RECAPTCHA_FAIL ip=" . get_client_ip() . " resp=" . json_encode($resp));
		return false;
	}
	// hCaptcha
	if (!empty($_POST['h-captcha-response']) && HCAPTCHA_SECRET !== 'YOUR_HCAPTCHA_SECRET') {
		$resp = post_verify('https://hcaptcha.com/siteverify', [
			'secret' => HCAPTCHA_SECRET,
			'response' => $_POST['h-captcha-response'],
			'remoteip' => get_client_ip()
		]);
		if (!empty($resp['success'])) return true;
		sec_log("HCAPTCHA_FAIL ip=" . get_client_ip() . " resp=" . json_encode($resp));
		return false;
	}
	// Si aucun captcha configuré, on permet (mais tu dois configurer captcha pour registrations/messages)
	return true;
}

/**
 * utilitaire POST pour verification externe
 */
function post_verify($url, $params) {
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_TIMEOUT, 5);
	$res = curl_exec($ch);
	if ($res === false) {
		curl_close($ch);
		return [];
	}
	curl_close($ch);
	return json_decode($res, true) ?: [];
}

/**
 * Heuristiques simples pour détecter message IA / spam
 * Retourne array [ok => bool, reasons => []]
 */
function analyze_message_text($text) {
	global $BLACKLISTED_DOMAINS;
	$reasons = [];
	$ok = true;
	$len = mb_strlen($text);
	$words = str_word_count(strip_tags($text));
	// 1) trop court ou trop long
	if ($len < 5) { $ok = false; $reasons[] = 'message_trop_court'; }
	if ($len > 5000) { $ok = false; $reasons[] = 'message_trop_long'; }
	// 2) trop de liens
	preg_match_all('#https?://#i', $text, $m);
	if (count($m[0]) > 2) { $ok = false; $reasons[] = 'trop_de_liens'; }
	// 3) domaines blacklistés
	foreach ($BLACKLISTED_DOMAINS as $d) {
		if (preg_match("#{$d}#i", $text)) { $ok = false; $reasons[] = 'domaine_blacklist'; break; }
	}
	// 4) ponctuation/ratio bizarre (heuristique)
	$punct = preg_match_all('/[!?.,:;]{1,}/u', $text, $pm);
	if ($words > 0 && ($punct / max(1,$words)) > 5) { $ok = false; $reasons[] = 'ponctuation_bizarre'; }
	// 5) répétitions simples (bot)
	if (preg_match('/(.)\\1{10,}/u', $text)) { $ok = false; $reasons[] = 'repetition_char'; }
	// 6) similarité à template : si message contient phrases typiques AI (heuristique)
	$ai_markers = ['as an ai','i am an ai','i am an artificial','generated by','openai','chatgpt'];
	foreach ($ai_markers as $m) {
		if (stripos($text, $m) !== false) { $ok = false; $reasons[] = 'mention_ai_marker'; break; }
	}
	// 7) optionnel : appel API detection IA si configurée
	if (AI_DETECT_API_KEY !== 'YOUR_AI_DETECT_KEY') {
		$det = call_ai_detect_api($text);
		if ($det && !empty($det['is_ai']) && $det['score'] > 0.7) {
			$ok = false; $reasons[] = 'api_detect_ai'; 
		}
	}
	return ['ok'=>$ok, 'reasons'=>$reasons];
}

/**
 * Exemple d'appel vers API de détection IA (optionnel). Doit renvoyer ['is_ai'=>bool,'score'=>float]
 */
function call_ai_detect_api($text) {
	$ch = curl_init(AI_DETECT_API_URL);
	$payload = json_encode(['text' => mb_substr($text,0,5000)]);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, [
		'Content-Type: application/json',
		'Authorization: Bearer ' . AI_DETECT_API_KEY
	]);
	curl_setopt($ch, CURLOPT_TIMEOUT, 6);
	$res = curl_exec($ch);
	if ($res === false) { curl_close($ch); return null; }
	curl_close($ch);
	return json_decode($res, true);
}

/**
 * Vérifie user-agent basique et headers suspects
 */
function check_user_agent_and_headers() {
	global $SUSPICIOUS_UA;
	$ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
	foreach ($SUSPICIOUS_UA as $s) {
		if (stripos($ua, $s) !== false) {
			sec_log("SUSPICIOUS_UA ip=" . get_client_ip() . " ua=" . substr($ua,0,200));
			return false;
		}
	}
	// Si pas d'UA -> suspect
	if (empty($ua)) {
		sec_log("NO_UA ip=" . get_client_ip());
		return false;
	}
	return true;
}

/**
 * Blocage immédiat et réponse standardisée
 */
function block_and_exit($reason='blocked') {
	http_response_code(429);
	header('Content-Type: application/json; charset=utf-8');
	echo json_encode(['status'=>'error','reason'=>$reason]);
	exit;
}

/**
 * Point d'entrée principal à appeler depuis endpoint
 * $context : 'register'|'message' etc. (pour politesses différentes)
 */
function check_request_protection($context='generic') {
	$ip = get_client_ip();
	// 1) ban check
	if (is_ip_banned($ip)) {
		sec_log("REQUEST_FROM_BANNED ip=$ip context=$context");
		block_and_exit('ip_banned');
	}
	// 2) rate limit
	if (!rate_limit_check($ip)) {
		block_and_exit('rate_limit_exceeded');
	}
	// 3) headers / ua
	if (!check_user_agent_and_headers()) {
		block_and_exit('suspicious_ua');
	}
	// 4) honeypot
	if (!check_honeypot()) {
		block_and_exit('honeypot_triggered');
	}
	// 5) captcha
	if (!verify_captcha()) {
		block_and_exit('captcha_failed');
	}
	// 6) si message, analyser texte
	if ($context === 'message' && !empty($_POST['message'])) {
		$analysis = analyze_message_text($_POST['message']);
		if (!$analysis['ok']) {
			sec_log("MESSAGE_REJECT ip=$ip reasons=" . implode(',', $analysis['reasons']) . " snippet=" . substr(strip_tags($_POST['message']),0,200));
			block_and_exit('message_rejected');
		}
	}
	// Si tout ok -> continuer
	return true;
}
?>
Je ne sais pas si je peux poster ça, mais au cas où à supprimer s’il le faut
Modifié en dernier par Skouat le 23 nov. 2025 à 22:46, modifié 1 fois.
Avatar du membre
sylver35
Extensions
Extensions
Messages : 8453
Enregistré le : 26 févr. 2008 à 14:58
Localisation : West coast BZH
Contact :

Invasion de faux profils avec message IA + attaques DDoS

Message par sylver35 »

Ce type de script ne peut pas être inclus dans phpBB pour la simple et bonne raison que l'emploi des super globales est strictement interdit par phpBB pour des raisons évidentes de sécurité.
De plus, les restrictions ip sont déjà faites en amont.
Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !
maxime14
Posteur néophyte
Posteur néophyte
Messages : 2
Enregistré le : 22 mai 2026 à 13:52

Invasion de faux profils avec message IA + attaques DDoS

Message par maxime14 »

Je suis aussi confronté à ça sur mon forum.

Pour les faux comptes, les protections classiques ne suffisent plus vraiment. Le plus efficace reste la validation des premiers messages et un bon anti-spam type Stop Forum Spam ou CleanTalk.

Les messages générés par IA sont difficiles à détecter automatiquement, donc la modération reste indispensable au début.

Pour les attaques DDoS, sans passer par une protection type Cloudflare ou équivalent, c’est compliqué à gérer uniquement côté serveur.

Au final, les filtres .htaccess ou GeoIP aident un peu mais ne règlent pas le problème.
Répondre

Retourner vers « Discussions sur phpBB3 »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité