XSS — الجزء 1: الأنواع — الأمن المتقدم
Cross-Site Scripting (XSS)
ما هو XSS؟
حقن كود JavaScript ضار في صفحات الويب.
أنواع XSS
Reflected XSS
يُرسل في URL ويُعكس في الصفحة.
https://site.com/search?q=<script>alert('XSS')</script>Stored XSS
يُخزن في قاعدة البيانات (أخطر).
DOM-based XSS
يحدث في كود JavaScript العميل.
مخاطر XSS
- سرقة Cookies/Sessions
- تعديل محتوى الصفحة
- إعادة توجيه المستخدم
- نشر Malware
الوقاية
- ✅ Escape Output
- ✅ Content Security Policy
- ✅ HttpOnly Cookies
- ✅ Input Validation
import html
import re
from typing import Dict, List
class XSSProtection:
"""
أدوات الحماية من XSS
"""
@staticmethod
def escape_html(text: str) -> str:
"""
تحويل الأحرف الخطرة لـ HTML entities
"""
return html.escape(text)
@staticmethod
def sanitize_input(text: str, allowed_tags: List[str] = None) -> str:
"""
تنظيف HTML مع السماح ببعض العناصر
"""
if allowed_tags is None:
allowed_tags = ['b', 'i', 'u', 'p', 'br']
# إزالة كل العناصر غير المسموحة
pattern = r'<(?!/?({}))([^>]*)>'.format('|'.join(allowed_tags))
cleaned = re.sub(pattern, '', text)
# إزالة الأحداث مثل onclick, onerror
event_pattern = r'\s+on\w+\s*=\s*["\'][^"\']*["\']'
cleaned = re.sub(event_pattern, '', cleaned, flags=re.IGNORECASE)
return cleaned
@staticmethod
def detect_xss_patterns(text: str) -> Dict:
"""
كشف أنماط XSS المشبوهة
"""
patterns = {
'script_tag': r'<script[^>]*>.*?</script>',
'event_handler': r'\s+on\w+\s*=',
'javascript_url': r'javascript\s*:',
'data_url': r'data\s*:',
'vbscript': r'vbscript\s*:',
'expression': r'expression\s*\(',
'iframe': r'<iframe[^>]*>',
'object_embed': r'<(object|embed)[^>]*>',
'svg_event': r'<svg[^>]*on\w+',
'img_onerror': r'<img[^>]*onerror',
}
results = {
'is_suspicious': False,
'detected_patterns': []
}
for name, pattern in patterns.items():
if re.search(pattern, text, re.IGNORECASE | re.DOTALL):
results['is_suspicious'] = True
results['detected_patterns'].append(name)
return results
@staticmethod
def generate_csp_header() -> str:
"""
توليد Content-Security-Policy header
"""
policies = [
"default-src 'self'",
"script-src 'self'",
"style-src 'self' 'unsafe-inline'",
"img-src 'self' data: https:",
"font-src 'self'",
"connect-src 'self'",
"frame-ancestors 'none'",
"form-action 'self'",
]
return "; ".join(policies)
@staticmethod
def encode_for_javascript(text: str) -> str:
"""
تشفير للاستخدام داخل JavaScript
"""
# تحويل لـ Unicode escape sequences
result = ""
for char in text:
if char.isalnum():
result += char
else:
result += "\\u{:04x}".format(ord(char))
return result
# ===== عرض توضيحي =====
xss = XSSProtection()
print("=== HTML Escaping ===")
malicious = '<script>alert("XSS")</script>'
safe = xss.escape_html(malicious)
print(f"Original: {malicious}")
print(f"Escaped: {safe}\n")
print("=== تنظيف HTML ===")
dirty_html = '<p>Hello <b>World</b></p><script>evil()</script><img onerror="alert(1)">'
clean = xss.sanitize_input(dirty_html)
print(f"Original: {dirty_html}")
print(f"Cleaned: {clean}\n")
print("=== كشف أنماط XSS ===")
test_inputs = [
"Hello World",
"<script>alert('xss')</script>",
"<img src=x onerror=alert(1)>",
"<a href='javascript:void(0)'>Click</a>",
"Normal text with <b>bold</b>"
]
for test in test_inputs:
result = xss.detect_xss_patterns(test)
status = "🚨" if result['is_suspicious'] else "✅"
print(f"{status} '{test[:40]}...'")
if result['detected_patterns']:
print(f" Patterns: {', '.join(result['detected_patterns'])}")
print("\n=== CSP Header ===")
print(xss.generate_csp_header())اختبر فهمك