DEV Community

Dominique Megnidro
Dominique Megnidro

Posted on

Implémentation d'un Système de Détection de Fraude avec la Distance de Levenshtein dans un Projet Django

La distance de Levenshtein peut être utilisée dans un système de détection de fraude pour comparer les données saisies par l'utilisateur (comme le nom, l'adresse ou l'email) avec les données existantes afin d'identifier des entrées similaires mais potentiellement frauduleuses.

Voici un guide étape par étape pour intégrer cette fonctionnalité dans votre projet Django.


1. Cas d'Utilisation

Un système de détection de fraude peut comparer :

  • Emails similaires : pour détecter des comptes créés avec des variations légères (e.g., user@example.com vs. userr@example.com).
  • Adresses proches : pour vérifier si des comptes multiples utilisent des adresses presque identiques.
  • Noms similaires : pour repérer des utilisateurs avec des noms légèrement modifiés (e.g., John Doe vs. Jon Doe).

2. Étapes pour l'Implémentation

a. Créer un Middleware ou un Signal pour Analyser les Données

Utilisez les signals de Django pour vérifier les nouvelles données utilisateurs au moment de l'inscription ou de la mise à jour.

b. Installer une Fonction de Calcul de Levenshtein

Intégrez une bibliothèque pour calculer la distance de Levenshtein ou utilisez une fonction Python comme celle-ci :

from django.db.models import Q
from .models import User  # Assume User is your user model

def levenshtein_distance(a, b):
    n, m = len(a), len(b)
    if n > m:
        a, b = b, a
        n, m = m, n

    current_row = range(n + 1)  # Keep current and previous row
    for i in range(1, m + 1):
        previous_row, current_row = current_row, [i] + [0] * n
        for j in range(1, n + 1):
            add, delete, change = previous_row[j] + 1, current_row[j - 1] + 1, previous_row[j - 1]
            if a[j - 1] != b[i - 1]:
                change += 1
            current_row[j] = min(add, delete, change)

    return current_row[n]
Enter fullscreen mode Exit fullscreen mode

c. Ajouter une Fonction de Détection de Fraude

Dans votre signal ou middleware, comparez les données saisies avec celles de la base de données pour trouver des entrées similaires.

from django.db.models import Q
from .models import User  # Assume User is your user model

def detect_similar_entries(email, threshold=2):
    users = User.objects.filter(~Q(email=email))  # Exclure l'utilisateur actuel
    similar_users = []

    for user in users:
        distance = levenshtein_distance(email, user.email)
        if distance <= threshold:
            similar_users.append((user, distance))

    return similar_users
Enter fullscreen mode Exit fullscreen mode

d. Connecter au Signal post_save pour les Utilisateurs

Utilisez le signal post_save pour exécuter cette vérification après l'inscription ou la mise à jour d'un utilisateur :

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import User
from .utils import detect_similar_entries  # Import your function

@receiver(post_save, sender=User)
def check_for_fraud(sender, instance, **kwargs):
    similar_users = detect_similar_entries(instance.email)

    if similar_users:
        print(f"Potential fraud detected for {instance.email}:")
        for user, distance in similar_users:
            print(f" - Similar email: {user.email}, Distance: {distance}")
Enter fullscreen mode Exit fullscreen mode

e. Option : Ajouter un Modèle de Log de Fraude

Pour garder une trace des suspicions de fraude, vous pouvez créer un modèle FraudLog :

from django.db import models
from django.contrib.auth.models import User

class FraudLog(models.Model):
    suspicious_user = models.ForeignKey(User, related_name='suspicious_logs', on_delete=models.CASCADE)
    similar_user = models.ForeignKey(User, related_name='similar_logs', on_delete=models.CASCADE)
    distance = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
Enter fullscreen mode Exit fullscreen mode

Enregistrez les correspondances suspectes dans ce modèle :

from .models import FraudLog

@receiver(post_save, sender=User)
def check_for_fraud(sender, instance, **kwargs):
    similar_users = detect_similar_entries(instance.email)

    for user, distance in similar_users:
        FraudLog.objects.create(suspicious_user=instance, similar_user=user, distance=distance)
Enter fullscreen mode Exit fullscreen mode

3. Améliorations et Optimisations

a. Limiter les Comparaisons

  • Comparez uniquement les utilisateurs récents ou ceux qui appartiennent à la même région, entreprise, etc.

b. Ajuster le Seuil

  • Fixez un seuil différent pour les distances acceptables selon le champ (par exemple, un seuil de 1 pour les emails, de 2 pour les noms).

c. Utilisation d’Algorithmes Avancés

  • Explorez des bibliothèques comme RapidFuzz pour des calculs optimisés.

d. Intégration dans l’Admin Django

  • Ajoutez des alertes dans l'interface d'administration pour les utilisateurs présentant des risques potentiels de fraude.

4. Conclusion

Avec cette approche, vous avez mis en place un système de détection de fraude basé sur la distance de Levenshtein. Il permet de repérer des entrées similaires, réduisant ainsi les risques de création de comptes frauduleux ou de duplication de données. Ce système est extensible et peut être ajusté pour répondre aux besoins spécifiques de votre projet.

Top comments (1)

Collapse
 
christophe_amoussouvi_2eb profile image
Kodjo Amoussou • Edited

Merci Fofo