Spaces:
Running
Running
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() |