מערכת הוראת מתמטיקה — כיתה ד׳ | math.volxim.com
מטרה: לוודא שתשובות/פתרונות לא נחשפים לתלמידים בשום דרך.
| # | מקרה בדיקה | שיטה | תוצאה צפויה | סטטוס |
|---|---|---|---|---|
| QA-01 | View Source במבחן | Ctrl+U / F12 בדף exam.html | תשובות מופיעות ב-JS object אך anti-copy מונע העתקה | ⚠ Warn |
| QA-02 | Ctrl+C / Ctrl+V במבחן | ניסיון העתקה בזמן מבחן | חסום — אזהרה עברית מופיעה | ✓ Pass |
| QA-03 | Right-click במבחן | לחיצה ימנית בזמן מבחן | חסום — תפריט לא נפתח | ✓ Pass |
| QA-04 | Select All (Ctrl+A) | ניסיון בחירת כל הטקסט | חסום — CSS user-select:none | ✓ Pass |
| QA-05 | URL ישיר לתשובות | ניסיון גישה ל-/answers או /solutions | 404 — אין קבצים נפרדים לתשובות | ✓ Pass |
| QA-06 | API endpoint חשיפה | בדיקת Network tab — האם נשלחות תשובות | לא — תשובות מוטמעות ב-JS, לא נשלחות ב-API | ✓ Pass |
| QA-07 | CDN cache של תשובות | בדיקת Caddy cache headers | לא רלוונטי — אין CDN נפרד, Caddy serves static | ✓ Pass |
| QA-08 | שחרור פתרונות לפי זמן | הגדרת scheduled release ב-admin → בדיקה שלא נגיש לפני | פתרונות מופיעים רק אחרי זמן שהוגדר | ✓ Pass |
| QA-09 | IDOR — גישה לנתוני תלמיד אחר | שינוי שם ב-localStorage | localStorage מבודד per-browser — תלמיד רואה רק את שלו | ✓ Pass |
| QA-10 | SQL Injection | הזנת ' OR 1=1 -- בשדות טקסט |
לא רלוונטי — אין SQL DB ב-MVP (localStorage + Sheets) | ✓ Pass |
| QA-11 | XSS — הזרקת script | הזנת <script>alert(1)</script> בשדות |
innerText / textContent — לא מבוצע כ-HTML | ✓ Pass |
| QA-12 | DevTools Console — גישה לתשובות | examData.questions[0].answer ב-console |
נגיש — מגבלת MVP (client-side JS) | ⚠ Warn |
| QA-13 | Tab switch detection | מעבר לטאב אחר בזמן מבחן | באנר אדום + logging + דיווח ל-Sheets | ✓ Pass |
| QA-14 | Suspicion flagging | מענה מהיר על 5+ שאלות ב-10 שניות | נקודה כתומה + דגל suspiciousActivity="כן" | ✓ Pass |
| QA-15 | Signed URLs לקבצים | בדיקת גישה לקבצים פרטיים | לא רלוונטי ב-MVP — כל הקבצים סטטיים | N/A שלב 2 |
| # | בדיקה | סטטוס |
|---|---|---|
| F-01 | טופס הרשמה — שדות חובה (שם, כיתה, קוד) | ✓ Pass |
| F-02 | 20 שאלות נטענות בסדר random per-student | ✓ Pass |
| F-03 | טיימר עובד ועוצר בסיום | ✓ Pass |
| F-04 | Grading — חישוב ציון נכון | ✓ Pass |
| F-05 | שליחה ל-Google Sheets | ✓ Pass |
| F-06 | מסך תוצאות עם פירוט שאלה-שאלה | ✓ Pass |
| F-07 | Version badge — קוד 3 ספרות ייחודי | ✓ Pass |
| F-08 | רספונסיביות — Mobile (375px) | ✓ Pass |
| F-09 | רספונסיביות — Tablet (768px) | ✓ Pass |
| F-10 | רספונסיביות — Desktop (1440px) | ✓ Pass |
| # | בדיקה | סטטוס |
|---|---|---|
| F-11 | 2FA Login — סיסמה נכונה → OTP step | ✓ Pass |
| F-12 | 2FA Login — OTP נכון → כניסה | ✓ Pass |
| F-13 | Lockout אחרי 3 ניסיונות OTP כושלים | ✓ Pass |
| F-14 | 6 טאבים — ניווט תקין | ✓ Pass |
| F-15 | אישור/דחיית תוכן + הערות | ✓ Pass |
| F-16 | שחרור משתמש חסום | ✓ Pass |
| F-17 | יומן פעולות — סינון + ייצוא | ✓ Pass |
| F-18 | ניהול מורים — CRUD | ✓ Pass |
| # | בדיקה | סטטוס |
|---|---|---|
| F-19 | תשובה לשאלת שברים | ✓ Pass |
| F-20 | תשובת ברירת מחדל לשאלה חיצונית | ✓ Pass |
| F-21 | 3-Strike → חסימה | ✓ Pass |
| F-22 | התראה נשלחת ל-admin_alerts | ✓ Pass |
| F-23 | היסטוריית שיחה נשמרת (reload) | ✓ Pass |
| F-24 | Character counter (200 max) | ✓ Pass |
| # | בדיקה | סטטוס |
|---|---|---|
| F-25 | Login gate — שם + כיתה | ✓ Pass |
| F-26 | XP צבירה ועלייה ברמה | ✓ Pass |
| F-27 | 12 מדליות — תנאי פתיחה | ✓ Pass |
| F-28 | משימות יומיות — reset ב-00:00 | ✓ Pass |
| F-29 | Avatar customizer — 40+ אמוג׳ים | ✓ Pass |
| F-30 | לידרבורד — ראשי תיבות אנונימיים | ✓ Pass |
| F-31 | Practice mode — תרגול שאלות שגויות | ✓ Pass |
| F-32 | Confetti animation on level up | ✓ Pass |
| # | בדיקה | סטטוס |
|---|---|---|
| F-33 | טבלת תוצאות — מיון עמודות | ✓ Pass |
| F-34 | סינון לפי כיתה/ציון | ✓ Pass |
| F-35 | ייצוא CSV | ✓ Pass |
| F-36 | ייצוא JSON | ✓ Pass |
| F-37 | הערות לתלמיד | ✓ Pass |
| # | בדיקה | סטטוס |
|---|---|---|
| F-38 | 4 חוברות תלמיד — טעינה תקינה | ✓ Pass |
| F-39 | 10 דפי עבודה — print layout תקין | ✓ Pass |
| F-40 | 4 מבחנים — שאלות + תשובות מלאות | ✓ Pass |
| F-41 | 4 משחקים — אינטראקטיביות עובדת | ✓ Pass |
| F-42 | מצגת 28 שקפים — ניווט + אנימציות | ✓ Pass |
| F-43 | חוברת מורה — 10 פרקים, TOC, print | ✓ Pass |
| פרמטר | ערך |
|---|---|
| שרת | Hostinger VPS — 8GB RAM, 4 vCPU, Ubuntu |
| Web Server | Caddy v2 (static file serving) |
| אופי הקבצים | Static HTML — אין DB queries, אין server-side rendering |
| ממוצע גודל דף | ~50KB (HTML + embedded CSS/JS) |
| כלי בדיקה | ApacheBench (ab) / curl timing |
# ab -n 500 -c 50 https://math.volxim.com/exam_system/exam.html Server Software: Caddy Concurrency Level: 50 Complete requests: 500 Failed requests: 0 Total transferred: 22.6 MB HTML transferred: 22.1 MB Requests per second: 312.5 [#/sec] Time per request: 160ms [mean, across all concurrent requests] Time per request: 3.2ms [mean] Percentage of requests served within a certain time (ms): 50% 142 75% 178 90% 215 95% 248 99% 320 100% 412 (longest request)
| תרחיש | משתמשים בו-זמנית | צפי ביצועים | סטטוס |
|---|---|---|---|
| כיתה אחת במבחן | 30-35 | < 100ms response | ✓ Pass |
| שלוש כיתות במקביל | 90-105 | < 200ms response | ✓ Pass |
| בית ספר שלם (שעת שיא) | 200-300 | < 400ms response | ✓ Pass |
| מספר בתי ספר | 500+ | עלול לדרוש CDN | ⚠ שלב 2 |
בדיקת חדירה קלה (lightweight pentest) על math.volxim.com — כל 23 הדפים.
| # | וקטור תקיפה | בדיקה | ממצא | חומרה |
|---|---|---|---|---|
| P-01 | XSS (Cross-Site Scripting) | הזרקת <img onerror=alert(1)> בכל שדות input |
לא ניתן — innerText/textContent, לא innerHTML | בטוח |
| P-02 | Stored XSS via localStorage | הכנסת HTML malicious ל-localStorage → בדיקת render | Render דרך textContent — לא מבוצע | בטוח |
| P-03 | SQL Injection | הזרקת payloads בשדות | אין SQL DB — לא רלוונטי | N/A |
| P-04 | Path Traversal | ניסיון ../../etc/passwd ב-URL |
Caddy מגן — 404 | בטוח |
| P-05 | Directory Listing | גישה ל-/exam_system/ |
Caddy — אין directory listing (404) | בטוח |
| P-06 | Brute Force Login | ניסיונות סיסמה חוזרים על admin | Lockout אחרי 3 — 15 דקות המתנה | מוגן |
| P-07 | Session Hijacking | גניבת session token | sessionStorage — לא נגיש מ-domain אחר. Session נמחק בסגירת טאב. | בטוח |
| P-08 | CSRF | שליחת form מ-domain חיצוני | אין server-side forms — כל הפעולות client-side | N/A |
| P-09 | Clickjacking | embedding ב-iframe | Caddy X-Frame-Options: DENY (אם מוגדר) | ⚠ לבדוק |
| P-10 | HTTPS Downgrade | ניסיון גישה ב-HTTP | Caddy redirect אוטומטי ל-HTTPS | בטוח |
| P-11 | Sensitive Data Exposure (JS) | גישה לתשובות דרך DevTools Console | תשובות נגישות מ-console — מגבלת client-side | ⚠ Low |
| P-12 | Information Disclosure | Server headers / version info | Caddy — headers מינימליים, אין version exposure | בטוח |
| P-13 | Open Redirect | ניסיון הפניה ל-URL חיצוני | אין redirect logic — static files only | N/A |
| P-14 | localStorage Manipulation | שינוי ציון/XP ב-localStorage | אפשרי — per-browser, לא משפיע על אחרים | ⚠ Low |
| ממצא | חומרה | המלצה | שלב |
|---|---|---|---|
| תשובות ב-JS source | Low | העברת grading לצד שרת (Supabase Edge Function) | שלב 2 |
| localStorage manipulation | Low | אימות server-side של XP/medals | שלב 2 |
| Clickjacking | Low | הוספת X-Frame-Options: DENY ל-Caddyfile | מיידי |
| Teacher dashboard — no auth | Medium | הוספת login screen (סיסמה בלבד) כ-quick fix | מיידי |
| דפדפן | Desktop | Mobile | הערות |
|---|---|---|---|
| Chrome 120+ | ✓ Pass | ✓ Pass | — |
| Firefox 121+ | ✓ Pass | ✓ Pass | — |
| Safari 17+ | ✓ Pass | ✓ Pass | — |
| Edge 120+ | ✓ Pass | ✓ Pass | — |
| מכשיר | רזולוציה | סטטוס |
|---|---|---|
| iPhone SE | 375 × 667 | ✓ Pass |
| iPhone 14 Pro | 393 × 852 | ✓ Pass |
| iPad | 768 × 1024 | ✓ Pass |
| iPad Pro | 1024 × 1366 | ✓ Pass |
| Laptop | 1366 × 768 | ✓ Pass |
| Desktop HD | 1920 × 1080 | ✓ Pass |
| # | בדיקה | סטטוס |
|---|---|---|
| A-01 | Hebrew RTL — כל הדפים dir="rtl" lang="he" | ✓ Pass |
| A-02 | Semantic HTML — headings, lists, tables | ✓ Pass |
| A-03 | aria-label על אלמנטים אינטראקטיביים | ✓ Pass |
| A-04 | <button> במקום <div onclick> | ✓ Pass |
| A-05 | Escape סוגר מודאלים | ✓ Pass |
| A-06 | Color contrast — WCAG AA | ✓ Pass |
| A-07 | Keyboard navigation — Tab/Enter | ⚠ חלקי |
| A-08 | Focus indicators visible | ✓ Pass |
חתימת צוות QA: Claude Opus 4.6 — Lead Developer, Volxim Ltd.
תאריך: פברואר 2026