NTThong0710 commited on
Commit
5530401
·
1 Parent(s): 3aa4130

Update check_url part2

Browse files
Files changed (1) hide show
  1. app/safety_check.py +86 -26
app/safety_check.py CHANGED
@@ -7,6 +7,9 @@ from transformers import (
7
  from PIL import Image
8
  import torch
9
 
 
 
 
10
  # Load model phát hiện URL độc hại
11
  classifier = pipeline("zero-shot-classification")
12
 
@@ -105,38 +108,95 @@ def check_violence_image(image: Image.Image) -> str:
105
 
106
  # ===Hàm check url===
107
  def check_url(url: str):
108
- # Kiểm tra định dạng URL cơ bản
109
- if not url.startswith(('http://', 'https://')):
110
- return "⚠️ Lỗi: URL phải bắt đầu bằng http:// hoặc https://"
111
-
112
  try:
113
- # Thêm các đặc trưng phát hiện URL đáng ngờ
114
- suspicious_keywords = ['exe', 'download', 'free', 'gift', 'card']
115
- is_suspicious = any(keyword in url.lower() for keyword in suspicious_keywords)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
- # Áp dụng zero-shot classification
118
- result = classifier(url, candidate_labels=["malicious", "safe"])
 
 
119
 
120
- # Lấy kết quả (đã sửa cách truy cập)
121
- label = result["labels"][0] # Nhãn có điểm cao nhất
122
- score = result["scores"][0] * 100
123
 
124
- # Kết hợp cảnh báo nếu có từ khóa đáng ngờ
125
- warning = ""
126
- if is_suspicious:
127
- warning = "\n⚠️ Cảnh báo: URL chứa từ khóa đáng ngờ!"
128
 
129
- explanation = f"Mô hình phân loại: {label} (độ tin cậy {score:.2f}%){warning}"
 
 
 
 
 
 
 
 
 
 
 
130
 
131
- if label.lower() == "malicious" or (score < 60 and is_suspicious):
132
- return f"""🚨 URL KHÔNG an toàn:
133
- - Kết quả: {label}
134
- - {explanation}
135
- - Phân tích: URL có đặc điểm đáng ngờ"""
136
  else:
137
- return f"""✅ URL an toàn:
138
- - Kết quả: {label}
139
- - {explanation}"""
140
 
141
  except Exception as e:
142
- return f"⚠️ Lỗi khi kiểm tra URL: {str(e)}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  from PIL import Image
8
  import torch
9
 
10
+ import re
11
+ from urllib.parse import urlparse, unquote
12
+
13
  # Load model phát hiện URL độc hại
14
  classifier = pipeline("zero-shot-classification")
15
 
 
108
 
109
  # ===Hàm check url===
110
  def check_url(url: str):
 
 
 
 
111
  try:
112
+ # Chuẩn hóa URL (decode các tự đặc biệt)
113
+ decoded_url = unquote(url)
114
+ parsed = urlparse(decoded_url)
115
+
116
+ # Danh sách cảnh báo
117
+ warnings = []
118
+
119
+ # 1. Phát hiện IP thay vì domain (http://203.0.113.45/...)
120
+ if re.match(r'^https?://\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', decoded_url):
121
+ warnings.append("🚨 Nguy hiểm: Truy cập trực tiếp bằng IP (thường dùng cho tấn công)")
122
+
123
+ # 2. Phát hiện file thực thi (gift-card.exe)
124
+ if re.search(r'\.(exe|msi|bat|js|jar|apk|dmg)(\?|$)', parsed.path.lower()):
125
+ warnings.append("🚨 Nguy hiểm: URL chứa file thực thi có thể độc hại")
126
+
127
+ # 3. Phát hiện redirect độc hại (redirect?target=...)
128
+ if 'redirect' in parsed.path.lower() or 'url=' in parsed.query.lower():
129
+ warnings.append("⚠️ Cảnh báo: URL chứa chức năng redirect (có thể lừa đảo)")
130
+
131
+ # 4. Phát hiện ký tự đặc biệt (/login%20%2F%00%3F%2F%2E%2E)
132
+ if re.search(r'%[0-9a-f]{2}|[\x00-\x1f\x7f]', url):
133
+ warnings.append("🚨 Nguy hiểm: URL chứa ký tự mã hóa đáng ngờ (có thể tấn công)")
134
+
135
+ # 5. Phát hiện domain giả mạo (example.com@malicious-site.com)
136
+ if '@' in parsed.netloc:
137
+ warnings.append("🚨 Lừa đảo: URL chứa kỹ thuật giả mạo domain (user@fake-domain)")
138
 
139
+ # 6. Phát hiện domain giả danh (secure.example-login.com)
140
+ deceptive_domains = ['login', 'secure', 'account', 'verify', 'update']
141
+ if any(keyword in parsed.netloc.lower() for keyword in deceptive_domains):
142
+ warnings.append("⚠️ Cảnh báo: Domain có dấu hiệu giả mạo dịch vụ đăng nhập")
143
 
144
+ # 7. Kiểm tra giao thức không hóa
145
+ if parsed.scheme == 'http':
146
+ warnings.append("⚠️ Cảnh báo: Kết nối không mã hóa (HTTP)")
147
 
148
+ # Kết hợp với AI classifier
149
+ ai_result = classifier(url, candidate_labels=["malicious", "safe"])
150
+ ai_label = ai_result["labels"][0]
151
+ ai_score = ai_result["scores"][0] * 100
152
 
153
+ # Tạo báo cáo
154
+ report = {
155
+ "url": url,
156
+ "decoded_url": decoded_url,
157
+ "domain": parsed.netloc,
158
+ "path": parsed.path,
159
+ "warnings": warnings,
160
+ "ai_analysis": {
161
+ "label": ai_label,
162
+ "confidence": ai_score
163
+ }
164
+ }
165
 
166
+ # Quyết định cuối cùng
167
+ if warnings or ai_label == "malicious":
168
+ return format_report(report, is_safe=False)
 
 
169
  else:
170
+ return format_report(report, is_safe=True)
 
 
171
 
172
  except Exception as e:
173
+ return f"⚠️ Lỗi khi phân tích URL: {str(e)}"
174
+
175
+ def format_report(report: dict, is_safe: bool):
176
+ """Định dạng báo cáo dễ đọc"""
177
+ warning_text = "\n".join(f"- {w}" for w in report["warnings"]) if report["warnings"] else "- Không phát hiện cảnh báo"
178
+
179
+ if not is_safe:
180
+ return f"""🚨 URL KHÔNG AN TOÀN
181
+ 🔍 Phân tích chi tiết:
182
+ • URL gốc: {report['url']}
183
+ • Domain: {report['domain']}
184
+ • Đường dẫn: {report['path']}
185
+
186
+ 📢 CẢNH BÁO:
187
+ {warning_text}
188
+
189
+ 🤖 Phân tích AI:
190
+ - Kết quả: {report['ai_analysis']['label']}
191
+ - Độ tin cậy: {report['ai_analysis']['confidence']:.2f}%
192
+
193
+ 🛡️ Khuyến nghị: KHÔNG TRUY CẬP!"""
194
+ else:
195
+ return f"""✅ URL AN TOÀN
196
+ 🔍 Phân tích chi tiết:
197
+ • URL gốc: {report['url']}
198
+ • Domain: {report['domain']}
199
+
200
+ 🤖 Phân tích AI:
201
+ - Kết quả: {report['ai_analysis']['label']}
202
+ - Độ tin cậy: {report['ai_analysis']['confidence']:.2f}%"""