[GO] Ich habe versucht herauszufinden, ob ReDoS mit Python möglich ist

Was ist ReDoS?

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

Was ist das beängstigend

Überprüfung

Versuchen Sie es mit 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

Ausführungsergebnis

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

Es nimmt exponentiell zu. Koe

Probieren Sie es mit Djangos EmailValidator aus

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

Ausführungsergebnis

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, es sieht okay aus.

Ich werde auch meinen eigenen Validator ausprobieren

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

Ausführungsergebnis

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

Zusammenfassung

Sie müssen vorsichtig mit sicherer Programmierung sein Wenn Sie sich nicht sicher sind, können Sie den offiziellen Validator von Django verwenden. Es sind nur 1400 Sekunden (23 Minuten 20 Sekunden) mit 80 Zeichen.

Recommended Posts

Ich habe versucht herauszufinden, ob ReDoS mit Python möglich ist
Python-Anfänger versuchten es herauszufinden
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe untersucht, wie der Arbeitsablauf mit Excel x Python optimiert werden kann
Ich habe untersucht, wie der Arbeitsablauf mit Excel x Python ④ optimiert werden kann
Ich habe versucht herauszufinden, wie der Arbeitsablauf mit Excel x Python optimiert werden kann
Ich habe untersucht, wie der Arbeitsablauf mit Excel x Python optimiert werden kann
Ich habe untersucht, wie der Arbeitsablauf mit Excel x Python optimiert werden kann
Ich habe versucht, so viel wie möglich über GIL herauszufinden, das Sie wissen sollten, wenn Sie parallel mit Python arbeiten
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Mayungos Python Learning Episode 2: Ich habe versucht, Zeichen mit Variablen zu löschen
Ich habe versucht herauszufinden, was ich tun kann, weil das Schneiden bequem ist
Ich habe versucht herauszufinden, wie ich den Arbeitsablauf mit Excel × Python, meiner Artikelzusammenfassung ★, optimieren kann
Ich habe versucht, die Zusammenführungssortierung in Python mit möglichst wenigen Zeilen zu implementieren
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht zu erklären, wozu der Python-Generator so einfach wie möglich ist.
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich versuchte herauszufinden, was passieren würde, wenn ich NaN oder INF in int konvertieren würde
Ich möchte initialisieren, wenn der Wert leer ist (Python)
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, Python zu berühren (Installation)
Ich habe versucht, WebScraping mit Python.
Ich möchte mit Python debuggen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
[1 Stunde Herausforderung] Ich habe versucht, eine Wahrsagerseite zu erstellen, die für Python zu geeignet ist
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
[Pandas] Ich habe versucht, Verkaufsdaten mit Python zu analysieren. [Für Anfänger]
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe versucht, alle Bemerkungen von Slack mit Wordcloud (Python) zusammenzufassen.
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen