J'ai essayé de savoir si ReDoS est possible avec Python

Qu'est-ce que ReDoS

https://blog.ohgaki.net/redos-must-review-mail-address-validation

Qu'est-ce que c'est effrayant

Vérification

Essayez avec ipython

import re
from datetime import datetime


n = 5
while n < 12:
    s = "username@host{}.".format(".abcde" * n)
    start = datetime.now()
    print(re.match(r"\A([\w+\-].?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z", s, flags=re.IGNORECASE))
    print('{}: {}'.format(len(s), (datetime.now() - start).total_seconds()))
    n += 1

Résultat d'exécution

None
44: 0.085964
None
50: 0.41799
None
56: 2.106463
None
62: 10.319476
None
68: 57.825968
None
74: 269.451777
None
80: 1400.865988

Il augmente de façon exponentielle. Koe

Essayez-le avec EmailValidator de Django

from datetime import datetime
from django.core.exceptions import ValidationError
from django.core.validators import EmailValidator


validator = EmailValidator()
n = 5
while n < 12:
    s = "username@host{}.".format(".abcde" * n)
    start = datetime.now()
    try:
        validator(s)
        print(True)
    except ValidationError:
        print(False)

    print('{}: {}'.format(len(s), (datetime.now() - start).total_seconds()))
    n += 1

Résultat d'exécution

False
44: 0.015296
False
50: 0.000116
False
56: 9.3e-05
False
62: 0.000127
False
68: 0.00016
False
74: 0.000122
False
80: 0.000125

Oh, ça a l'air bien.

J'essaierai également mon propre validateur

import re
from datetime import datetime
from django.core.exceptions import ValidationError
from django.core.validators import EmailValidator


class JapaneseEmailValidator(EmailValidator):
    user_regex = re.compile(
        r"(^[-.!#$%&'*+/=?^_`{}|~0-9A-Z]+$"  # dot-atom
        r"|^\"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*\"$)",  # quoted-string
        re.IGNORECASE
    )


validator = JapaneseEmailValidator()
n = 5
while n < 12:
    s = "username@host{}.".format(".abcde" * n)
    start = datetime.now()
    try:
        validator(s)
        print(True)
    except ValidationError:
        print(False)

    print('{}: {}'.format(len(s), (datetime.now() - start).total_seconds()))
    n += 1

Résultat d'exécution

False
44: 0.00613
False
50: 9.8e-05
False
56: 8.6e-05
False
62: 9.9e-05
False
68: 0.000127
False
74: 0.000145
False
80: 0.000105

Résumé

Vous devez faire attention à la programmation sécurisée Si vous n'êtes pas sûr, vous pouvez utiliser le validateur officiel de Django. C'est seulement 1400sec (23min 20sec) avec 80 caractères.

Recommended Posts

J'ai essayé de savoir si ReDoS est possible avec Python
les débutants en python ont essayé de le découvrir
J'ai essayé de trouver l'entropie de l'image avec python
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ②
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ④
J'ai essayé de savoir comment rationaliser le flux de travail avec Excel x Python ⑤
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ①
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ③
J'ai essayé d'en savoir le plus possible sur GIL que vous devriez savoir si vous faites un traitement parallèle avec Python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé d'automatiser la fabrication des sushis avec python
Mayungo's Python Learning Episode 2: J'ai essayé de mettre des caractères avec des variables
J'ai essayé de savoir ce que je pouvais faire car le tranchage est pratique
J'ai essayé de savoir comment rationaliser le flux de travail avec Excel × Python, mon résumé d'article ★
J'ai essayé d'implémenter le tri par fusion en Python avec le moins de lignes possible
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'expliquer à quoi sert le générateur Python aussi facilement que possible.
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé de trouver la classe alternative avec tensorflow
J'ai essayé de résoudre la théorie des nombres entiers d'AOJ avec Python
J'ai essayé de savoir ce qui se passerait si je convertissais NaN ou INF en int
Je veux initialiser si la valeur est vide (python)
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé de toucher Python (installation)
J'ai essayé webScraping avec python.
Je veux déboguer avec Python
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
[1 hour challenge] J'ai essayé de créer un site de bonne aventure qui soit trop adapté à Python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de créer une liste de nombres premiers avec python
[Pandas] J'ai essayé d'analyser les données de ventes avec Python [Pour les débutants]
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de résumer les remarques de tout le monde sur le slack avec wordcloud (Python)
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib