Update app.py
Browse files
app.py
CHANGED
|
@@ -4,7 +4,7 @@ import re
|
|
| 4 |
def extract_email(text):
|
| 5 |
"""Вытаскивает email"""
|
| 6 |
match = re.search(r'[\w\.-]+@[\w\.-]+', text)
|
| 7 |
-
return match.group(0) if match else None
|
| 8 |
|
| 9 |
def analyze_email(headers, body):
|
| 10 |
score = 0
|
|
@@ -16,9 +16,8 @@ def analyze_email(headers, body):
|
|
| 16 |
|
| 17 |
if re.search(r"DKIM.*FAIL", headers, re.IGNORECASE):
|
| 18 |
score += 10
|
| 19 |
-
findings.append("<li>DKIM FAIL: Подпись
|
| 20 |
-
|
| 21 |
-
# Проверка Return-Path (Спуфинг)
|
| 22 |
from_match = re.search(r"^From:(.*)", headers, re.MULTILINE | re.IGNORECASE)
|
| 23 |
return_match = re.search(r"^Return-Path:(.*)", headers, re.MULTILINE | re.IGNORECASE)
|
| 24 |
|
|
@@ -30,9 +29,9 @@ def analyze_email(headers, body):
|
|
| 30 |
score += 5
|
| 31 |
findings.append(f"<li>Отправитель ({from_email}) не совпадает с Return-Path ({return_email}) (+5)</li>")
|
| 32 |
|
| 33 |
-
keywords_urgency = ["заблокирован", "срочно", "удаление", "ограничен", "suspension", "urgent", "immediate"]
|
| 34 |
-
keywords_action = ["подтвердите", "verify", "update", "login", "вход", "пароль", "password"]
|
| 35 |
-
keywords_greed = ["бонус", "распродажа", "бесплатно", "раздача", "выигрыш", "скидка", "prize", "gift", "win"]
|
| 36 |
|
| 37 |
body_lower = body.lower()
|
| 38 |
|
|
@@ -58,29 +57,28 @@ def analyze_email(headers, body):
|
|
| 58 |
findings.append(f"<li>IP в ссылке: ({ip_links[0]}) (+5)</li>")
|
| 59 |
|
| 60 |
suspicious_tlds = [".xyz", ".top", ".info", ".club"]
|
| 61 |
-
for tld in suspicious_tlds:
|
| 62 |
if tld in body_lower:
|
| 63 |
-
# Проверяем, чтобы это не было частью слова, а именно TLD
|
| 64 |
if re.search(rf"\w{tld}/\w", body_lower) or re.search(rf"\w{tld}\b", body_lower):
|
| 65 |
score += 2
|
| 66 |
-
findings.append(f"<li>Подозрительный
|
| 67 |
|
| 68 |
if score == 0:
|
| 69 |
-
verdict_text = "Уровень угрозы:
|
| 70 |
findings_html = "Угроз не найдено."
|
| 71 |
elif score < 5:
|
| 72 |
-
verdict_text = f"Уровень
|
| 73 |
findings_html = f"<ul>{''.join(findings)}</ul>"
|
| 74 |
else:
|
| 75 |
-
verdict_text = f"Уровень
|
| 76 |
findings_html = f"<ul>{''.join(findings)}</ul>"
|
| 77 |
|
| 78 |
return str(score), verdict_text, findings_html
|
| 79 |
|
| 80 |
-
headers_input = gr.Textbox(label="1. Служебные заголовки
|
| 81 |
-
body_input = gr.Textbox(label="2. Текст письма
|
| 82 |
|
| 83 |
-
score_output = gr.Textbox(label="Итоговый счет угрозы
|
| 84 |
verdict_output = gr.Textbox(label="Финальный вердикт", type="text", max_lines=3)
|
| 85 |
findings_output = gr.HTML(label="Детализация обнаруженных угроз")
|
| 86 |
|
|
|
|
| 4 |
def extract_email(text):
|
| 5 |
"""Вытаскивает email"""
|
| 6 |
match = re.search(r'[\w\.-]+@[\w\.-]+', text)
|
| 7 |
+
return match.group(0) if match else None # функция вытаскивания емейла засчет [\w\.-] - буквы цифры, точка и дефис
|
| 8 |
|
| 9 |
def analyze_email(headers, body):
|
| 10 |
score = 0
|
|
|
|
| 16 |
|
| 17 |
if re.search(r"DKIM.*FAIL", headers, re.IGNORECASE):
|
| 18 |
score += 10
|
| 19 |
+
findings.append("<li>DKIM FAIL: Подпись DKIM фальшивая (+10)</li>")
|
| 20 |
+
|
|
|
|
| 21 |
from_match = re.search(r"^From:(.*)", headers, re.MULTILINE | re.IGNORECASE)
|
| 22 |
return_match = re.search(r"^Return-Path:(.*)", headers, re.MULTILINE | re.IGNORECASE)
|
| 23 |
|
|
|
|
| 29 |
score += 5
|
| 30 |
findings.append(f"<li>Отправитель ({from_email}) не совпадает с Return-Path ({return_email}) (+5)</li>")
|
| 31 |
|
| 32 |
+
keywords_urgency = ["заблокирован", "срочно", "удаление", "ограничен", "suspension", "urgent", "immediate", "остановлен", "удален", "удалён", "удалена", "остановлена", "ограничена", "заморожена", "заморожен", "suspended"]
|
| 33 |
+
keywords_action = ["подтвердите", "verify", "update", "login", "вход", "пароль", "password", "аутентификация", "authentication", "войдите", "требуется", "подтверждение", "confirm", "confirmation"]
|
| 34 |
+
keywords_greed = ["freespin", "фриспин", "casino", "казино", "lottery", "1xbet", "лотерея", "бонус", "распродажа", "бесплатно", "раздача", "подарок", "гифт", "giveaway", "выигрыш", "скидка", "prize", "gift", "win", "победитель", "winner", "поздравляем", "congratulations"]
|
| 35 |
|
| 36 |
body_lower = body.lower()
|
| 37 |
|
|
|
|
| 57 |
findings.append(f"<li>IP в ссылке: ({ip_links[0]}) (+5)</li>")
|
| 58 |
|
| 59 |
suspicious_tlds = [".xyz", ".top", ".info", ".club"]
|
| 60 |
+
for tld in suspicious_tlds: #tld это топ левел домейн если че (top level domain - домен высшего лвла)
|
| 61 |
if tld in body_lower:
|
|
|
|
| 62 |
if re.search(rf"\w{tld}/\w", body_lower) or re.search(rf"\w{tld}\b", body_lower):
|
| 63 |
score += 2
|
| 64 |
+
findings.append(f"<li>Подозрительный домен '{tld}' (+2)</li>")
|
| 65 |
|
| 66 |
if score == 0:
|
| 67 |
+
verdict_text = "Уровень угрозы: низкий. Явных признаков фишинга не обнаружено."
|
| 68 |
findings_html = "Угроз не найдено."
|
| 69 |
elif score < 5:
|
| 70 |
+
verdict_text = f"Уровень угрозы средний. Счет: {score}."
|
| 71 |
findings_html = f"<ul>{''.join(findings)}</ul>"
|
| 72 |
else:
|
| 73 |
+
verdict_text = f"Уровень угрозы высокий. Счет: {score}."
|
| 74 |
findings_html = f"<ul>{''.join(findings)}</ul>"
|
| 75 |
|
| 76 |
return str(score), verdict_text, findings_html
|
| 77 |
|
| 78 |
+
headers_input = gr.Textbox(label="1. Служебные заголовки", lines=10, placeholder="Received: from...\nSPF: PASS...\nReturn-Path: ...")
|
| 79 |
+
body_input = gr.Textbox(label="2. Текст письма", lines=10, placeholder="Ваш аккаунт заблокирован! Срочно нажмите...")
|
| 80 |
|
| 81 |
+
score_output = gr.Textbox(label="Итоговый счет угрозы", type="text", max_lines=1)
|
| 82 |
verdict_output = gr.Textbox(label="Финальный вердикт", type="text", max_lines=3)
|
| 83 |
findings_output = gr.HTML(label="Детализация обнаруженных угроз")
|
| 84 |
|