🔒 מסמך מדיניות אבטחה

מערכת הוראת מתמטיקה — כיתה ד׳ | math.volxim.com

גרסה 1.0 — פברואר 2026 | Volxim Ltd.

📑 תוכן עניינים

  1. סקירה כללית וארכיטקטורה
  2. ניהול תפקידים והרשאות (RBAC)
  3. מחזור חיי תוכן (Content Lifecycle)
  4. אימות והזדהות (Authentication)
  5. הפרדת פתרונות (Solutions Isolation)
  6. אבטחת תעבורה (HTTPS/TLS)
  7. יומן פעולות (Audit Log)
  8. אנטי-העתקה במבחנים
  9. מדיניות צ׳אטבוט — 3 Strikes
  10. גיבויים ושחזור
  11. פרטיות מידע תלמידים
  12. תגובה לאירועי אבטחה
  13. מפת דרכים — שלב 2 (Supabase)
  14. סיכום סטטוסים

🏗️ 1. סקירה כללית וארכיטקטורה

ארכיטקטורת המערכת — MVP

שכבהטכנולוגיהתפקיד
FrontendHTML + Vanilla JS + Tailwindממשקי משתמש (23 דפים)
Web ServerCaddy v2HTTPS, reverse proxy, static files
VPSHostinger 8GB RAMIP: 76.13.2.214, Ubuntu
StoragelocalStorage (client-side)הגדרות, נתונים, sessions
Grading APIGoogle Apps Scriptשליחת תוצאות ל-Google Sheets
DNSPorkbun (volxim.com)math.volxim.com → VPS
ℹ️
הבהרה: ב-MVP, אין backend/DB מרכזי. כל הנתונים מאוחסנים ב-localStorage בדפדפן. זה מספק הפרדה טבעית — כל מורה/תלמיד רואה רק את הנתונים שלו. בשלב 2 (Supabase) תתווסף הפרדה ברמת שרת.

תרשים רכיבים

  Browser (Teacher/Admin/Student)
    │
    ├── HTTPS (TLS 1.3) ──► Caddy (port 80/443)
    │                           │
    │                           ├── /exam_system/admin.html    [Admin Dashboard]
    │                           ├── /exam_system/exam.html     [Student Exam]
    │                           ├── /exam_system/chatbot.html  [Knowledge Bot]
    │                           └── ... (23 pages total)
    │
    └── Google Apps Script ──► Google Sheets (Exam Results)
        

👥 2. ניהול תפקידים והרשאות (RBAC)

👑
Owner
גישה מלאה, ניהול מנהלים, מדיניות אבטחה
🛡️
Admin
ניהול מורים, אישור תכנים, יומן פעולות, התראות
📚
Teacher
צפייה בתוצאות, ניהול כיתה, הערות לתלמידים
🎓
Student
מבחנים, משחקים, פרופיל אישי, גיימיפיקציה
👤
Guest
צפייה בדף הבית וחוברות לימוד בלבד

מטריצת הרשאות

פעולהOwnerAdminTeacherStudentGuest
ניהול מנהלים
ניהול מורים
אישור/דחייה של תוכן
צפייה ביומן פעולות
צפייה בתוצאות מבחנים
ייצוא CSV/JSON
ביצוע מבחנים
צפייה בגיימיפיקציה
צפייה בחוברות לימוד
שחרור פתרונות
חסימת משתמשים

מימוש נוכחי (MVP)

⚠️
MVP — הפרדה ברמת URL:
  • admin.html — גישה דרך 2FA (סיסמה + OTP)
  • teacher_dashboard.html — גישה ישירה (ללא auth)
  • exam.html — הרשמה עם שם + כיתה + קוד
  • student_profile.html — הרשמה עם שם + כיתה

שלב 2: JWT tokens + Supabase RLS יאכפו הרשאות ברמת שרת.

📄 3. מחזור חיי תוכן (Content Lifecycle)

Draft
Pending Approval
Approved
Published
Archived
Pending Approval
Rejected
Draft (חוזר לעריכה)

כללים

מימוש

טאב "אישור תכנים" ב-admin.html — טבלה עם סינון לפי סטטוס/סוג, מודל שינוי סטטוס עם הערות, שליטה בנראות פתרונות, ו-scheduled release.

🔐 4. אימות והזדהות (Authentication)

דשבורד מנהל — 2FA

שלבמנגנוןפרטים
שלב 1סיסמהסיסמת מנהל (ניתנת לשינוי בהגדרות)
שלב 2OTP (Time-based)קוד 6 ספרות, תקף 5 דקות, נוסחה: floor(now/60000)*7 % 1000000
נעילהLockout3 ניסיונות כושלים → נעילה ל-15 דקות
SessionsessionStorageנמחק בסגירת טאב, ללא persistence
🚨
מגבלות MVP: OTP נוצר בצד הלקוח (לא SMS/Email חיצוני). מספיק לסביבה חינוכית סגורה אך לא מתאים לסביבת production פתוחה.
שלב 2: Supabase Auth + JWT + Email OTP / Magic Link.

דשבורד מורה

כרגע — גישה פתוחה. בשלב 2 תתווסף הזדהות.

מבחנים (תלמידים)

הזדהות בטופס הרשמה: שם פרטי + שם משפחה + כיתה + קוד מבחן. הקוד מונע גישה בלתי מורשית.

🔏 5. הפרדת פתרונות (Solutions Isolation)

עקרון

תשובות נכונות ופתרונות אינם נגישים לתלמידים עד שהמנהל משחרר אותם בצורה מפורשת.

מימוש נוכחי

ℹ️
שלב 2 (Supabase): טבלת solutions נפרדת עם RLS policy — תלמיד לא יכול לגשת לשורות solutions עד ש-released_at ≤ NOW(). Signed URLs לקבצי PDF עם תשובות.

🔐 6. אבטחת תעבורה (HTTPS/TLS)

פרמטרערך
תעודהLet's Encrypt (אוטומטית דרך Caddy)
פרוטוקולTLS 1.3
HTTP→HTTPSRedirect אוטומטי (Caddy default)
HSTSמופעל אוטומטית ע״י Caddy
Domainmath.volxim.com
סטטוס: HTTPS פעיל ומאומת. כל 23 הדפים נגישים רק דרך HTTPS.

📝 7. יומן פעולות (Audit Log)

מידע שנשמר

שדהתיאורדוגמה
userשם המשתמש המבצע"מנהל ראשי"
actionסוג הפעולה"אישור תוכן", "חסימת משתמש"
targetאובייקט היעד"מבחן ביניים 1"
timestampחותמת זמן ISO"2026-02-22T10:30:00"
detailsפרטים נוספים"סטטוס שונה מ-pending ל-approved"

אחסון

תפוגה

MVP: לא מוגבל (localStorage). שלב 2: 90 ימים, ארכיון ל-cold storage אחרי שנה.

🛡️ 8. אנטי-העתקה במבחנים

#מנגנוןתיאורסטטוס
1Seeded PRNGכל תלמיד מקבל סדר שאלות ייחודי לפי hash של השם+כיתהפעיל
2Question Shuffleשאלות מעורבלות בתוך כל קטגוריה (שברים, כפל)פעיל
3Answer Shuffleסדר אפשרויות התשובה מעורבל (שאלות אמריקאיות)פעיל
4Version Badgeקוד גרסה 3-ספרות בממשק — מאפשר למורה לזהות גרסאותפעיל
5Anti-Copyחסימת right-click, Ctrl+C/V/A, CSS user-select:noneפעיל
6Tab Switch Detectionזיהוי מעבר בין טאבים + באנר אדום + דיווחפעיל
7Suspicion Flagging5+ תשובות ב-10 שניות → דגל חשוד + נקודה כתומהפעיל

נתונים שנשלחים למורה (Google Sheets)

{
  versionCode: "417",
  seed: 2847156,
  questionOrder: [3,1,5,2,4,...],
  tabSwitches: 2,
  suspiciousActivity: "לא",
  timestamp: "2026-02-22T10:45:30"
}

🤖 9. מדיניות צ׳אטבוט — 3 Strikes

תהליך

  1. Strike 1: שאלה לא רלוונטית → הודעת אזהרה ידידותית
  2. Strike 2: שאלה נוספת לא רלוונטית → אזהרה חמורה יותר
  3. Strike 3: ניסיון שלישי → חסימה אוטומטית + הודעה למנהל

הודעת ברירת מחדל

"אני בוט שנותן מענה רק על תוכן האתר math.volxim.com. אם יש לך שאלה על שברים, כפל מאונך או שימוש במערכת — אשמח לעזור! 😊"

localStorage Keys

מפתחתוכן
chatbot_historyהיסטוריית שיחה מלאה (שחזור בטעינה מחדש)
chatbot_blockedtrue/false — סטטוס חסימה
chatbot_blocked_timeחותמת זמן חסימה
chatbot_abuse_logלוג ניסיונות סטייה מפורט
admin_alertsהתראות שנשלחות לדשבורד מנהל

שחרור חסימה

מנהל → טאב "התראות אבטחה" ב-admin.html → רשימת משתמשים חסומים → כפתור "שחרר".

💾 10. גיבויים ושחזור

מצב נוכחי — MVP

רכיבשיטת גיבויתדירות
קוד מקור (HTML/JS/CSS)Git + גיבויים מקומייםלפני כל שינוי
קבצי VPSrsync מ-localבכל deploy
נתוני localStorageאין גיבוי אוטומטי
Google Sheets (תוצאות)Google auto-save + version historyאוטומטי

קונבנציית גיבוי

backups/admin_pre_v3_20260222_120000.html
backups/exam_pre_v2_20260222_120000.html
backups/dashboard_vXX_description_YYYYMMDD_HHMMSS.html

שלב 2 — גיבוי מוצפן יומי (מתוכנן)

🔒 11. פרטיות מידע תלמידים

מידע שנאסף

סוג מידעאיסוףאחסוןשימוש
שם פרטי + משפחהטופס הרשמהlocalStorage + Google Sheetsזיהוי, תוצאות, לידרבורד (ראשי תיבות)
כיתהטופס הרשמהlocalStorage + Google Sheetsקיבוץ, סינון
תוצאות מבחןאוטומטיGoogle Sheetsהערכה, דוחות למורה
XP ומדליותאוטומטיlocalStorageגיימיפיקציה
Tab switchesאוטומטיlocalStorage + Sheetsאנטי-העתקה
⚠️
חשוב: לא נאסף מידע רגיש (ת.ז., כתובת, טלפון). הלידרבורד מציג רק ראשי תיבות (לדוגמה: "י.כ.") לשמירה על פרטיות.

עקרונות פרטיות

🚨 12. תגובה לאירועי אבטחה

סוגי אירועים וטיפול

אירועזיהויתגובה אוטומטיתתגובת מנהל
3+ ניסיונות OTP כושליםadmin.html loginנעילה 15 דקותבדיקת יומן attempts
3 שאלות חיצוניות בצ׳אטchatbot 3-strikeחסימה + התראהסקירה + שחרור/חסימה
5+ תשובות ב-10 שניותexam suspicionדגל כתום + loggingבדיקת תוצאות
Tab switches במבחןvisibilitychange APIבאנר אדום + loggingבדיקת ספירה
ניסיון העתקה (Ctrl+C)keydown listenerחסימה + אזהרה

תהליך טיפול באירוע

  1. זיהוי: המערכת מזהה אוטומטית ומתעדת
  2. הכלה: פעולה אוטומטית (חסימה/נעילה/דגל)
  3. התראה: שליחה ל-admin_alerts → מופיע בדשבורד מנהל
  4. חקירה: מנהל בודק יומן פעולות + פרטי אירוע
  5. תיקון: שחרור/חסימה ידנית + הערות
  6. למידה: עדכון מדיניות אם נדרש

🗺️ 13. מפת דרכים — שלב 2 (Supabase)

פיצ׳רטכנולוגיהתועלת
JWT AuthenticationSupabase Authהזדהות מאובטחת לכל משתמש
Row-Level Security (RLS)Supabase Policiesתלמיד רואה רק את הנתונים שלו
Signed URLsSupabase Storageקישורים זמניים לקבצים פרטיים
Encrypted Backupspg_dump + AES-256גיבוי מוצפן יומי
Email OTP / Magic LinkSupabase Auth2FA חיצוני (לא client-side)
Audit Log Server-sideDB Trigger + Tableיומן לא ניתן למחיקה + IP logging
RBAC EnforcementSupabase Policiesהרשאות ברמת API, לא רק UI
Rate LimitingCaddy / Middlewareהגנה מפני brute force

📊 14. סיכום סטטוסים