mstkyvz's picture
Create app.py
34d1b87 verified
import os
from dotenv import load_dotenv
import requests
from bs4 import BeautifulSoup
import whois
from openai import OpenAI
import gradio as gr
from playwright.sync_api import sync_playwright
import time
import json
load_dotenv()
class PhishingToolkit:
"""toolkit sınıfı"""
def __init__(self, api_key=None, model="gpt-4o"):
# API anahtarı ve model bilgisini sakla
self.api_key = api_key or os.getenv('OPENAI_API_KEY')
self.model = model
# OpenAI istemcisini oluştur
self.client = OpenAI(api_key=self.api_key) if self.api_key else None
def fetch_content(self, url):
"""Verilen URL'nin içeriğini döndürür."""
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # HTTP hatalarını kontrol et
soup = BeautifulSoup(response.text, "html.parser")
# Sadece görünür metin içeriğini al
for script in soup(["script", "style"]):
script.decompose()
text = soup.get_text(separator=' ', strip=True)
# İçeriği makul bir uzunlukta tut
return text[:5000] + "..." if len(text) > 5000 else text
except requests.exceptions.RequestException as e:
return f"URL erişim hatası: {e}"
except Exception as e:
return f"İçerik çekme hatası: {e}"
def capture_screenshot(self, url):
"""Verilen URL'nin ekran görüntüsünü alır."""
try:
# Temiz bir dosya adı oluştur
domain = url.split("//")[-1].split("/")[0]
timestamp = int(time.time())
filename = f"{domain.replace('.', '_')}_{timestamp}.png"
screenshot_path = os.path.join("screenshots", filename)
# Klasörün var olduğundan emin ol
os.makedirs("screenshots", exist_ok=True)
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto(url, wait_until="networkidle", timeout=30000)
page.screenshot(path=screenshot_path)
browser.close()
return screenshot_path
except Exception as e:
print(f"Ekran görüntüsü hatası: {e}")
return None
def get_whois_info(self, url):
"""Verilen URL'nin WHOIS bilgilerini alır."""
try:
# URL'den domain adını çıkar
domain = url.split("//")[-1].split("/")[0]
w = whois.whois(domain)
# WHOIS verilerini düzenle
whois_info = {
"Domain Adı": w.domain_name,
"Kayıt Tarihi": w.creation_date,
"Son Kullanma Tarihi": w.expiration_date,
"Kayıt Eden": w.registrar,
"WHOIS Sunucusu": w.whois_server,
"Durum": w.status
}
# None değerleri filtrele ve formatla
formatted_info = {}
for key, value in whois_info.items():
if value is not None:
if isinstance(value, list):
formatted_info[key] = str(value[0]) if value else "Bilgi yok"
else:
formatted_info[key] = str(value)
else:
formatted_info[key] = "Bilgi yok"
# Dictionary'yi okunabilir formata çevir
return json.dumps(formatted_info, indent=2, ensure_ascii=False)
except Exception as e:
return f"WHOIS bilgisi alınamadı: {e}"
def analyze_phishing(self, url, content, whois_info):
"""Verilen içerik ve WHOIS bilgileri ile phishing analizi yapar."""
# API anahtarı kontrolü
if not self.api_key:
return "API anahtarı girilmediği için analiz yapılamıyor. Lütfen OpenAI API anahtarınızı girin."
# İçeriği kısalt
content_summary = content[:3000] + "..." if len(content) > 3000 else content
prompt = f"""
Aşağıdaki site için phishing analizi yap:
URL: {url}
İçerik: {content_summary}
WHOIS Bilgileri: {whois_info}
Aşağıdaki kriterlere göre değerlendir:
1. Domain adının yaşı ve güvenilirliği
2. SSL sertifikası varlığı ("https" kullanımı)
3. URL yapısındaki şüpheli karakterler veya yönlendirmeler
4. İçerikte bulunan şüpheli formlar, giriş alanları
5. İçerikteki dil ve yazım hataları
6. Profesyonel görünüm eksikliği
7. WHOIS bilgilerinin gizliliği veya şüpheli durumu
Analizini şu formatta döndür:
Risk Seviyesi: [Düşük/Orta/Yüksek]
Tespitler: [Kısa ve net maddeler halinde]
Sonuç: [Phishing olup olmadığı hakkında nihai karar]
"""
try:
response = self.client.chat.completions.create(
model=self.model,
messages=[{"role": "user", "content": prompt}],
temperature=0.5,
max_tokens=800
)
return response.choices[0].message.content
except Exception as e:
return f"AI analiz hatası: {e}"
def analyze_url(url, api_key, model):
"""URL'yi analiz edip sonuçları döndürür"""
if not url or url.strip() == "":
return "Lütfen bir URL girin.", None, "URL girin.", "URL girin."
if not url.startswith(('http://', 'https://')):
url = 'https://' + url
try:
# API anahtarı kontrolü
if not api_key or api_key.strip() == "":
api_key = os.getenv('OPENAI_API_KEY')
if not api_key:
return ("API anahtarı eksik. Lütfen ayarlar bölümünden OpenAI API anahtarınızı girin veya .env dosyasına ekleyin.",
None, "API anahtarı eksik.", "API anahtarı eksik.")
# Toolkit oluştur
toolkit = PhishingToolkit(api_key=api_key, model=model)
# Adım 1: İçerik çek
content = toolkit.fetch_content(url)
# Adım 2: WHOIS bilgisi al
whois_info = toolkit.get_whois_info(url)
# Adım 3: Ekran görüntüsü al
screenshot_path = toolkit.capture_screenshot(url)
# Adım 4: Phishing analizi yap
analysis = toolkit.analyze_phishing(url, content, whois_info)
return content, screenshot_path, whois_info, analysis
except Exception as e:
error_message = f"Analiz sırasında hata oluştu: {str(e)}"
return error_message, None, error_message, error_message
# Gradio arayüzü oluştur
def create_interface():
with gr.Blocks(title="Gelişmiş Phishing Tespit Sistemi") as iface:
gr.Markdown("## 🛡️ Gelişmiş Phishing Tespit Sistemi")
gr.Markdown("Bir URL girerek phishing analizi yapın. Sistem web sitesinin içeriğini, ekran görüntüsünü ve alan adı bilgilerini analiz ederek phishing olasılığını değerlendirir.")
# Ayarlar sekmesi
with gr.Accordion("⚙️ AI Ayarları", open=False):
with gr.Row():
api_key = gr.Textbox(
label="OpenAI API Anahtarı",
placeholder="sk-...",
type="password",
value=os.getenv('OPENAI_API_KEY', ""),
info="API anahtarınızı girin (varsa .env dosyasından yüklenir)"
)
model = gr.Dropdown(
label="Model Seçimi",
choices=["gpt-4o", "gpt-3.5-turbo", "gpt-4", "gpt-4-turbo"],
value="gpt-4o",
info="Kullanılacak OpenAI modelini seçin"
)
with gr.Row():
url_input = gr.Textbox(
label="URL (örn: example.com veya https://example.com)",
placeholder="example.com"
)
analyze_button = gr.Button("🔍 Analiz Et", variant="primary")
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("### 🖼️ Site Görünümü")
screenshot_output = gr.Image(label="Ekran Görüntüsü", type="filepath")
gr.Markdown("### 📋 WHOIS Bilgileri")
whois_output = gr.Textbox(label="", lines=10)
with gr.Column(scale=1):
gr.Markdown("### 🔒 Güvenlik Analizi")
analysis_output = gr.Textbox(label="", lines=15)
gr.Markdown("### 📄 Site İçeriği")
content_output = gr.Textbox(
label="",
lines=10,
max_lines=20,
show_copy_button=True
)
# Analiz fonksiyonunu bağla
analyze_button.click(
fn=analyze_url,
inputs=[url_input, api_key, model],
outputs=[content_output, screenshot_output, whois_output, analysis_output]
)
# Örnek URL'ler
gr.Examples(
examples=["google.com", "amazon.com", "facebook.com"],
inputs=url_input
)
gr.Markdown("---")
gr.Markdown("### ℹ️ Nasıl Kullanılır")
gr.Markdown("""
1. '⚙️ AI Ayarları' bölümünden OpenAI API anahtarınızı girin ve istediğiniz modeli seçin
2. Analiz etmek istediğiniz web sitesinin URL'sini girin
3. 'Analiz Et' butonuna tıklayın
4. Sistem web sitesinin ekran görüntüsünü, WHOIS bilgilerini ve içerik analizini gösterecektir
5. Phishing analizi sonucunu değerlendirin
""")
return iface
if __name__ == "__main__":
# Uygulama başlatılmadan önce klasör kontrolü
os.makedirs("screenshots", exist_ok=True)
# Arayüzü oluştur ve başlat
iface = create_interface()
iface.launch()