Kodax

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())
اختبر فهمك