doctorlinux commited on
Commit
39ff9b9
·
verified ·
1 Parent(s): 614fe83

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +105 -224
  2. requirements.txt +1 -2
app.py CHANGED
@@ -1,244 +1,125 @@
1
  import gradio as gr
2
  import re
3
- import os
4
- from openai import OpenAI
5
 
6
- class PhishingAnalyzerHybrid:
7
- def __init__(self):
8
- self.client = None
9
- self.setup_openai()
10
-
11
- def setup_openai(self):
12
- """Configurar OpenAI"""
13
- api_key = os.getenv('OPENAI_API_KEY')
14
- if api_key and api_key.startswith('sk-') and len(api_key) > 20:
15
- try:
16
- self.client = OpenAI(api_key=api_key)
17
- self.client.models.list(limit=1)
18
- self.status = "active"
19
- except Exception:
20
- self.client = None
21
- self.status = "error"
22
- else:
23
- self.status = "no_key"
24
-
25
- def analyze_traditional(self, email_content):
26
- """ANÁLISIS TRADICIONAL (Versión 1.0)"""
27
- email_lower = email_content.lower()
28
- lineas = email_content.split('\n')
29
-
30
- resultados = "## 🔍 Análisis de Seguridad\n\n"
31
- puntuacion_riesgo = 0
32
- alertas_criticas = []
33
-
34
- # Patrones de alto riesgo (MISMO que v1.0)
35
- patrones_alto_riesgo = [
36
- (r'\b(demanda|demandar|demandado|proceso judicial|juicio|corte|tribunal)\b', "Referencia a procedimiento legal", 3),
37
- (r'\b(abogado|fiscal|juez|notificación|citación|subpoena)\b', "Mención a autoridades legales", 2),
38
- (r'\b(multa|sanción|penalidad|castigo|prisión|arresto)\b', "Amenazas con consecuencias", 3),
39
- (r'drive\.google\.com', "Enlace a servicio de almacenamiento", 3),
40
- (r'dropbox\.com', "Enlace a servicio de almacenamiento", 3),
41
- (r'mediafire\.com', "Enlace a servicio de descargas", 3),
42
- (r'mega\.nz', "Enlace a servicio de almacenamiento", 3),
43
- (r'wetransfer\.com', "Enlace a servicio de transferencia", 3),
44
- (r'onedrive\.live\.com', "Enlace a servicio de almacenamiento", 3),
45
- (r'bit\.ly', "Enlace acortado", 2),
46
- (r'tinyurl\.com', "Enlace acortado", 2),
47
- (r'goo\.gl', "Enlace acortado", 2),
48
- (r'\b(urgente|inmediato|inmediatamente|hoy mismo|ahora mismo)\b', "Lenguaje de urgencia", 2),
49
- (r'\b(plazo|tiempo límite|fecha límite|última oportunidad)\b', "Presión temporal", 2),
50
- ]
51
-
52
- # 1. Análisis de patrones (TRADICIONAL)
53
- resultados += "### 📋 Patrones Detectados\n"
54
-
55
- for patron, descripcion, puntos in patrones_alto_riesgo:
56
- if re.search(patron, email_lower):
57
- puntuacion_riesgo += puntos
58
- alertas_criticas.append(f"🔴 {descripcion}")
59
-
60
- if alertas_criticas:
61
- for alerta in alertas_criticas:
62
- resultados += f"- {alerta}\n"
63
- else:
64
- resultados += "- ✅ No se detectaron patrones sospechosos\n"
65
-
66
- # 2. Análisis de enlaces (TRADICIONAL)
67
- resultados += "\n### 🔗 Enlaces Identificados\n"
68
-
69
- enlaces = re.findall(r'https?://[^\s<>"\']+', email_content)
70
- enlaces_sospechosos = []
71
-
72
- if enlaces:
73
- for enlace in enlaces:
74
- if any(dominio in enlace for dominio in [
75
- 'drive.google.com', 'dropbox.com', 'mediafire.com',
76
- 'mega.nz', 'wetransfer.com', 'onedrive.live.com'
77
- ]):
78
- resultados += f"- 🔴 Enlace a servicio externo\n"
79
- enlaces_sospechosos.append(enlace)
80
- puntuacion_riesgo += 3
81
- elif any(dominio in enlace for dominio in ['bit.ly', 'tinyurl.com', 'goo.gl']):
82
- resultados += f"- 🔴 Enlace acortado\n"
83
- enlaces_sospechosos.append(enlace)
84
- puntuacion_riesgo += 2
85
- else:
86
- resultados += f"- 🔍 Enlace identificado\n"
87
- else:
88
- resultados += "- ℹ️ No se encontraron enlaces\n"
89
-
90
- # 3. Evaluación final (TRADICIONAL)
91
- resultados += "\n### 📊 Evaluación de Seguridad\n"
92
-
93
- if puntuacion_riesgo >= 5 or enlaces_sospechosos:
94
- nivel_riesgo = "🔴 Nivel Alto - Precaución"
95
- recomendacion = """
96
- Se recomienda:
97
- Evitar interactuar con este correo
98
- • No descargar archivos adjuntos
99
- • Verificar la fuente por otros medios
100
- • Reportar como sospechoso si es necesario
101
- """
102
- elif puntuacion_riesgo >= 3:
103
- nivel_riesgo = "🟡 Nivel Medio - Atención"
104
- recomendacion = "Mantener precaución al interactuar con este contenido."
105
- else:
106
- nivel_riesgo = "🟢 Nivel Bajo - Normal"
107
- recomendacion = "Parece ser un correo estándar."
108
-
109
- resultados += f"- **Evaluación:** {nivel_riesgo}\n"
110
- resultados += f"- **Recomendación:** {recomendacion}\n"
111
-
112
- return resultados, puntuacion_riesgo, len(enlaces_sospechosos)
113
-
114
- def analyze_with_ai(self, email_content):
115
- """ANÁLISIS CON IA (NUEVO en v2.0)"""
116
- if not self.client:
117
- return "### 🤖 Análisis IA\n🔒 **IA no disponible** - Configurar OPENAI_API_KEY\n\n*Para activar el análisis IA, agrega tu API key en los secrets.*"
118
-
119
- try:
120
- prompt = f"""
121
- Analiza este correo electrónico para detectar phishing:
122
-
123
- {email_content[:1500]}
124
-
125
- Responde ÚNICAMENTE con:
126
- - 2-3 puntos clave específicos del correo
127
- - Evaluación de legitimidad
128
- - Riesgos identificados
129
-
130
- Máximo 150 palabras. Español técnico.
131
- """
132
-
133
- response = self.client.chat.completions.create(
134
- model="gpt-3.5-turbo",
135
- messages=[
136
- {
137
- "role": "system",
138
- "content": "Eres un experto en ciberseguridad. Sé conciso y técnico. Responde solo sobre el contenido proporcionado."
139
- },
140
- {"role": "user", "content": prompt}
141
- ],
142
- max_tokens=300,
143
- temperature=0.3
144
- )
145
-
146
- ai_analysis = response.choices[0].message.content
147
- return f"### 🤖 Análisis IA\n✅ **IA activa** - GPT-3.5 Turbo\n\n{ai_analysis}"
148
-
149
- except Exception as e:
150
- return f"### 🤖 Análisis IA\n❌ **Error en IA**: {str(e)}\n\n*Reintentar el análisis.*"
151
-
152
- def comprehensive_analysis(self, email_content, usar_ia=False):
153
- """Análisis completo híbrido"""
154
- if not email_content.strip():
155
- return "❌ Por favor, pega un correo electrónico para analizar."
156
-
157
- # Siempre hacer análisis tradicional
158
- resultado_tradicional, puntuacion, enlaces_sospechosos = self.analyze_traditional(email_content)
159
-
160
- resultado_final = "## 🛡️ Phishing AI v2.0\n\n"
161
-
162
- # Estado del sistema
163
- resultado_final += "### 🔧 Estado del Sistema\n"
164
- if self.status == "active":
165
- resultado_final += "✅ **OpenAI:** Disponible\n"
166
- elif self.status == "error":
167
- resultado_final += "❌ **OpenAI:** Error de conexión\n"
168
- else:
169
- resultado_final += "🔒 **OpenAI:** No configurado\n"
170
- resultado_final += f"📊 **Análisis tradicional:** Activado\n\n"
171
-
172
- # Análisis tradicional (SIEMPRE PRESENTE)
173
- resultado_final += resultado_tradicional
174
-
175
- # Análisis con IA (SOLO SI SE SOLICITA)
176
- if usar_ia and self.client:
177
- resultado_final += "\n---\n"
178
- resultado_final += self.analyze_with_ai(email_content)
179
- elif usar_ia:
180
- resultado_final += "\n---\n"
181
- resultado_final += "### 🤖 Análisis IA\n🔒 **IA no disponible** - Configurar API key para activar\n"
182
-
183
- # Resumen híbrido
184
- resultado_final += f"\n---\n"
185
- resultado_final += f"### 📈 Resumen v2.0\n"
186
- resultado_final += f"- **Análisis tradicional:** {puntuacion}/20 puntos\n"
187
- resultado_final += f"- **Enlaces sospechosos:** {enlaces_sospechosos}\n"
188
- if usar_ia and self.client:
189
- resultado_final += f"- **Análisis IA:** ✅ Activado\n"
190
- else:
191
- resultado_final += f"- **Análisis IA:** 🔒 No activado\n"
192
-
193
- return resultado_final
194
-
195
- # Inicializar analizador
196
- analyzer = PhishingAnalyzerHybrid()
197
 
198
- # Interfaz Gradio
199
- with gr.Blocks(theme=gr.themes.Soft(), title="Phishing AI v2.0") as demo:
200
 
201
  gr.Markdown("""
202
- # 🛡️ Phishing AI v2.0
203
- ### **Análisis tradicional + Inteligencia Artificial**
204
-
205
- *Manteniendo la detección de patrones con análisis IA avanzado*
206
  """)
207
 
208
  with gr.Row():
209
  with gr.Column():
210
- input_email = gr.Textbox(
211
- label="📧 Pegar correo completo",
212
- placeholder="From: remitente@ejemplo.com\nTo: destinatario@email.com\nSubject: Asunto del mensaje\n\nContenido completo del correo...",
213
  lines=12
214
  )
215
 
216
- # Checkbox para IA (solo si está disponible)
217
- usar_ia = gr.Checkbox(
218
- label="Activar análisis con IA (OpenAI)",
219
- value=False,
220
- interactive=(analyzer.status == "active")
221
- )
222
-
223
- analyze_btn = gr.Button("🔍 Ejecutar Análisis", variant="primary")
224
 
225
  with gr.Column():
226
- output_result = gr.Markdown(
227
- label="📊 Resultado del Análisis",
228
- value="### 🛡️ Phishing AI v2.0\n\n**Sistema híbrido de detección**\n\n- Análisis tradicional de patrones\n- 🤖 Análisis IA opcional\n\nEsperando correo para analizar..."
229
  )
230
 
231
- # Información del sistema
232
- gr.Markdown("---")
233
- status_msg = "✅ Configurado" if analyzer.status == "active" else "🔒 No configurado"
234
- gr.Markdown(f"**Estado IA:** {status_msg} | **Análisis tradicional:** Siempre activo")
235
-
236
- # Conectar el botón
237
- analyze_btn.click(
238
- analyzer.comprehensive_analysis,
239
- inputs=[input_email, usar_ia],
240
- outputs=output_result
241
- )
242
 
243
  if __name__ == "__main__":
244
  demo.launch()
 
1
  import gradio as gr
2
  import re
 
 
3
 
4
+ def analizar_phishing_avanzado(email_content):
5
+ """Análisis específico para patrones de alto riesgo"""
6
+
7
+ if not email_content.strip():
8
+ return "❌ Por favor, pega un correo electrónico para analizar."
9
+
10
+ email_lower = email_content.lower()
11
+ lineas = email_content.split('\n')
12
+
13
+ resultados = "## 🔍 Análisis de Seguridad\n\n"
14
+ puntuacion_riesgo = 0
15
+ alertas_criticas = []
16
+
17
+ # Patrones de alto riesgo
18
+ patrones_alto_riesgo = [
19
+ (r'\b(demanda|demandar|demandado|proceso judicial|juicio|corte|tribunal)\b', "Referencia a procedimiento legal", 3),
20
+ (r'\b(abogado|fiscal|juez|notificación|citación|subpoena)\b', "Mención a autoridades legales", 2),
21
+ (r'\b(multa|sanción|penalidad|castigo|prisión|arresto)\b', "Amenazas con consecuencias", 3),
22
+ (r'drive\.google\.com', "Enlace a servicio de almacenamiento", 3),
23
+ (r'dropbox\.com', "Enlace a servicio de almacenamiento", 3),
24
+ (r'mediafire\.com', "Enlace a servicio de descargas", 3),
25
+ (r'mega\.nz', "Enlace a servicio de almacenamiento", 3),
26
+ (r'wetransfer\.com', "Enlace a servicio de transferencia", 3),
27
+ (r'onedrive\.live\.com', "Enlace a servicio de almacenamiento", 3),
28
+ (r'bit\.ly', "Enlace acortado", 2),
29
+ (r'tinyurl\.com', "Enlace acortado", 2),
30
+ (r'goo\.gl', "Enlace acortado", 2),
31
+ (r'\b(urgente|inmediato|inmediatamente|hoy mismo|ahora mismo)\b', "Lenguaje de urgencia", 2),
32
+ (r'\b(plazo|tiempo límite|fecha límite|última oportunidad)\b', "Presión temporal", 2),
33
+ ]
34
+
35
+ # 1. Análisis de patrones
36
+ resultados += "### 📋 Patrones Detectados\n"
37
+
38
+ for patron, descripcion, puntos in patrones_alto_riesgo:
39
+ if re.search(patron, email_lower):
40
+ puntuacion_riesgo += puntos
41
+ alertas_criticas.append(f"🔴 {descripcion}")
42
+
43
+ if alertas_criticas:
44
+ for alerta in alertas_criticas:
45
+ resultados += f"- {alerta}\n"
46
+ else:
47
+ resultados += "- No se detectaron patrones sospechosos\n"
48
+
49
+ # 2. Análisis de enlaces
50
+ resultados += "\n### 🔗 Enlaces Identificados\n"
51
+
52
+ enlaces = re.findall(r'https?://[^\s<>"\']+', email_content)
53
+ enlaces_sospechosos = []
54
+
55
+ if enlaces:
56
+ for enlace in enlaces:
57
+ if any(dominio in enlace for dominio in [
58
+ 'drive.google.com', 'dropbox.com', 'mediafire.com',
59
+ 'mega.nz', 'wetransfer.com', 'onedrive.live.com'
60
+ ]):
61
+ resultados += f"- 🔴 Enlace a servicio externo\n"
62
+ enlaces_sospechosos.append(enlace)
63
+ puntuacion_riesgo += 3
64
+ elif any(dominio in enlace for dominio in ['bit.ly', 'tinyurl.com', 'goo.gl']):
65
+ resultados += f"- 🔴 Enlace acortado\n"
66
+ enlaces_sospechosos.append(enlace)
67
+ puntuacion_riesgo += 2
68
+ else:
69
+ resultados += f"- 🔍 Enlace identificado\n"
70
+ else:
71
+ resultados += "- ℹ️ No se encontraron enlaces\n"
72
+
73
+ # 3. Evaluación final
74
+ resultados += "\n### 📊 Evaluación de Seguridad\n"
75
+
76
+ if puntuacion_riesgo >= 5 or enlaces_sospechosos:
77
+ nivel_riesgo = "🔴 Nivel Alto - Precaución"
78
+ recomendacion = """
79
+ Se recomienda:
80
+ Evitar interactuar con este correo
81
+ • No descargar archivos adjuntos
82
+ Verificar la fuente por otros medios
83
+ • Reportar como sospechoso si es necesario
84
+ """
85
+ elif puntuacion_riesgo >= 3:
86
+ nivel_riesgo = "🟡 Nivel Medio - Atención"
87
+ recomendacion = "Mantener precaución al interactuar con este contenido."
88
+ else:
89
+ nivel_riesgo = "🟢 Nivel Bajo - Normal"
90
+ recomendacion = "Parece ser un correo estándar."
91
+
92
+ resultados += f"- **Evaluación:** {nivel_riesgo}\n"
93
+ resultados += f"- **Recomendación:** {recomendacion}\n"
94
+
95
+ return resultados
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
+ # INTERFAZ DISCRETA SIN EJEMPLOS
98
+ with gr.Blocks(theme=gr.themes.Soft(), title="Analizador de Correos") as demo:
99
 
100
  gr.Markdown("""
101
+ # 📧 Analizador de Seguridad
102
+ ### Verificación automática de correos electrónicos
 
 
103
  """)
104
 
105
  with gr.Row():
106
  with gr.Column():
107
+ input_correo = gr.Textbox(
108
+ label="Pegar contenido del correo",
109
+ placeholder="From: remitente@ejemplo.com\nTo: destinatario@email.com\nSubject: Asunto del correo\n\nContenido del mensaje...",
110
  lines=12
111
  )
112
 
113
+ btn_analizar = gr.Button("Analizar Seguridad", variant="primary")
 
 
 
 
 
 
 
114
 
115
  with gr.Column():
116
+ output_resultado = gr.Markdown(
117
+ label="Resultado del Análisis",
118
+ value="El análisis de seguridad aparecerá aquí después de procesar el correo."
119
  )
120
 
121
+ # Conectar el botón (sin ejemplos)
122
+ btn_analizar.click(analizar_phishing_avanzado, inputs=input_correo, outputs=output_resultado)
 
 
 
 
 
 
 
 
 
123
 
124
  if __name__ == "__main__":
125
  demo.launch()
requirements.txt CHANGED
@@ -1,2 +1 @@
1
- gradio>=4.0.0
2
- openai>=1.0.0
 
1
+ gradio>=4.0.0