אבטחת מידע
גרסה 2026-10-01.3. הדף מתאר איך Paperbot בנוי. אין כאן הבטחות שיווקיות; כל שורה מתארת משהו שאפשר לבדוק, והפרק האחרון אומר מה עדיין לא נעשה.
הפרדה בין משרדים
לכל שורה במסד הנתונים יש שיוך למשרד. בקריאת נתונים מהלוח ההפרדה נאכפת במסד הנתונים עצמו (Row Level Security), לא רק בקוד. בכתיבה מהלוח ובדף ההעלאה הגישה נעשית במפתח שירות, ושם ההפרדה נאכפת בקוד: כל שאילתה מוגבלת למשרד ולבקשה שהקישור מוכיח, ונתיב הקובץ נבנה מחדש בשרת ואינו מתקבל מהדפדפן.
הקישור לדף ההעלאה
- אישי לכל לקוח ולכל בקשה: קוד של 10 תווים (כ־60 סיביות), נגזר מסוד שרת ומזהה הבקשה. הסוד נשמר רק במנגנון הסודות; בלעדיו אי אפשר לחשב קישור. האורך נקבע כדי שהקישור יהיה קצר בהודעת SMS; ההגנה מפני ניחוש היא הגבלת הקצב שבהמשך, לא האורך לבדו.
- לבדיקת הקישור נשמר תקציר חד־כיווני שלו (SHA-256). הקישור עצמו נשמר עם רישום ההודעה שנשלחה, כחלק מנוסחה, ולכן הוא גלוי למשרד שהבקשה שלו ולמפעיל השירות.
- ההשוואה נעשית בזמן קבוע, כך שאי אפשר לנחש אותו תו־תו.
- מוגבל בקצב פניות לכל קישור ולכל כתובת רשת, מתוך מגבלה שנשמרת במסד הנתונים ולא בזיכרון, כך שהיא שורדת הפעלה מחדש. כתובת הרשת נשמרת כתקציר חד־כיווני שמחושב במפתח סודי שנמצא רק בשרת (HMAC), לא כפי שהיא, ורשומת המגבלה נמחקת בתוך יומיים לכל היותר. בעת עומס או תקלה המגבלה נועלת, לא פותחת.
- פג 90 יום אחרי השליחה. מפסיק לעבוד 30 דקות אחרי שהמסמך האחרון שנדרש הועלה דרכו (החסד נועד לכך שסדרת צילומים לא תיקטע באמצע), או מיד כשהמשרד מבטל את הבקשה. אם המשרד מוסיף מסמך לבקשה שהושלמה, הבקשה נפתחת מחדש והקישור חוזר לפעול. כפתור "הפסקת תזכורות" שבתחתית הדף, וקישור ההפסקה שבכל מייל, ממשיכים לעבוד גם אחרי שהקישור פג.
- כשהמשרד משנה או מוחק את הטלפון או את המייל של לקוח, כל בקשה פתוחה שהקישור שלה נשלח לכתובת הקודמת מקבלת קישור חדש והקישור הקודם מפסיק לעבוד, כי ייתכן שהגיע לאדם אחר.
- הדף מסומן לא לאינדוקס במנועי חיפוש, אינו שולח כתובת מפנה, ואין בו ניווט לבקשות אחרות.
- הדף אינו משתמש בעוגיות ואינו טוען שום רכיב מצד שלישי; מדיניות אבטחת התוכן שלו מתירה חיבור רק לשרת של Paperbot ולאחסון הקבצים. גם מערכת ניטור השגיאות אינה פועלת בדפדפן בדף הזה; שגיאה בשרת נשלחת אליה בלי הקישור.
- Paperbot אינו כותב את הקישור ליומנים שלו. עם זאת כתובת הדף היא הסוד עצמו: היא נשמרת בהיסטוריית הדפדפן, נרשמת ביומני ספק האירוח, ולעיתים נפתחת אוטומטית בידי אפליקציות שמייצרות תצוגה מקדימה לקישור. יש להתייחס לקישור כמו לסיסמה.
- הקישור משמש להעלאה בלבד. מי שמחזיק בו יכול, כל עוד הקישור פועל, לראות את רשימת המסמכים של הבקשה ואת שמות הקבצים שהועלו אליה, ולהעלות קבצים. הוא אינו יכול לפתוח קובץ שהועלה, להוריד אותו, להחליף אותו או למחוק אותו, ואינו רואה בקשות אחרות.
- מי שהעלה קובץ בטעות יכול להסיר אותו בתוך 30 דקות מההעלאה, ורק מהדף הפתוח שממנו הועלה; סגירה או רענון של הדף מסיימים את האפשרות. האישור לכך נשמר בזיכרון הדף בלבד, לא בעוגייה ולא במכשיר, ולכן החזקה בקישור לבדה אינה מאפשרת להסיר דבר. קובץ שהוסר אינו מוצג עוד למשרד, המשרד רואה שהוסר קובץ, והקובץ עצמו אינו נמחק בהסרה אלא במועד המחיקה הרגיל של הבקשה.
הקבצים
מאוחסנים ב־bucket פרטי בפרנקפורט; אין אליהם גישה ציבורית. סוגי הקבצים המותרים (תמונות ו־PDF) נאכפים גם בשרת וגם באחסון עצמו, לא רק בדפדפן. הגודל המרבי הוא 20 MB לקובץ, והוא נבדק בשרת על הקובץ שנשמר בפועל; האחסון עצמו מסרב לכל קובץ מעל 25 MB. הצגה והורדה מהלוח נעשות דרך קישור חתום שפג בתוך 5 דקות, שנוצר לכל צפייה בנפרד אחרי בדיקת השיוך למשרד, ואינו נשמר במטמון (תמונה מוקטנת נשמרת בדפדפן עד 4 דקות).
גיבוי הקבצים: בכל לילה הקבצים והתמונות המוקטנות מועתקים ל־bucket פרטי נפרד באותו פרויקט Supabase בפרנקפורט. כל מחיקה של קובץ (במועד המחיקה הרגיל, במחיקת לקוח או במחיקת משרד) מוחקת גם את העותק, ובדיקה לילית מוחקת כל עותק שהמקור שלו כבר נמחק. שחזור מהגיבוי נעשה רק בידי מפעיל השירות.
הצפנה
בהעברה: TLS על כל התעבורה, כולל דף ההעלאה, עם HSTS. באחסון: הצפנה של מסד הנתונים ושל אחסון הקבצים אצל הספק (Supabase, פרנקפורט).
גישה
- אין עובדים ואין קבלני משנה. גישה לנתוני ייצור יש למפעיל השירות בלבד.
- כניסת משתמשי המשרד במייל וסיסמה (סיסמה שבוחר המשתמש: 8 תווים לפחות; סיסמה זמנית שנשלחת במייל כשהחשבון נפתח על ידי Paperbot: 12 תווים אקראיים, ואפשר להחליפה בכל עת; סיסמאות שמורות מגובבות בלבד, והסיסמה הזמנית שמורה גם מוצפנת אצל מפעיל השירות עד שהמשתמש מחליף אותה, ואז נמחקת), או בקישור חד־פעמי למייל. כניסה ראשונה לחשבון שנפתח על ידי Paperbot מחייבת אישור כתובת המייל. ניסיונות כניסה מוגבלים בקצב לכל כתובת ולכל מייל, ותשובת המערכת זהה בין "אין משתמש כזה" ל"סיסמה שגויה".
- הגדרות האבטחה של המשרד (בלשונית "אבטחה", בידי בעל המשרד):
- קוד כניסה ב־SMS: כניסה ממחשב או מדפדפן שלא הוקלד בו קוד בידי אותו משתמש ב־90 הימים האחרונים (במשרד של 10 משתמשים ומעלה: 30 הימים האחרונים) מחייבת גם קוד בן 6 ספרות שנשלח לנייד של המשתמש עצמו. הקוד תקף 10 דקות, לשימוש אחד, ונחסם אחרי 5 ניסיונות שגויים. הנייד נמסר בהוספת העובד, בידי בעל המשרד בלשונית האבטחה כשהוא מפעיל את הקוד, או בידי המשתמש עצמו בכניסה הראשונה אחרי שהקוד הופעל: אז הקוד נשלח למספר שהוקלד, והמספר נשמר רק כשהקוד חוזר נכון. מרגע שנשמר הוא משתנה רק בידי בעל המשרד (לעובד) או בידי מפעיל השירות, ובעל המשרד רואה את המספר של כל עובד; כל רישום ושינוי נרשמים. קוד שעובד אחד הקליד אינו פותח דבר לעובד אחר, גם באותו מחשב.
- החלפת סיסמה כל חצי שנה, עם תזכורת שבועיים לפני; במועד עצמו הלוח ממתין עד שנבחרת סיסמה חדשה.
- ניתוק אחרי חוסר פעילות: 8 שעות, יום, שבוע, חודש או 3 חודשים (ברירת המחדל).
- במשרד שבו 10 משתמשים ומעלה (יחד עם מפעיל השירות, יותר מ־10 בעלי הרשאה), הקוד והחלפת הסיסמה פעילים תמיד ואי אפשר לכבות אותם, כנדרש ברמת האבטחה הבינונית. במשרד קטן יותר הם לבחירת המשרד.
- כל משתמש שייך למשרד אחד; משתמש שהוסר אינו רואה דבר.
- סודות ומפתחות מוחזקים רק במנגנון הסודות של Vercel ו־Supabase; אינם בקוד, בקבצי הגדרות או במאגר הקוד. בדיקה אוטומטית, שמפעיל השירות מריץ לפני כל פריסה, נכשלת אם רכיב שרץ בדפדפן מייבא שכבה שמחזיקה סוד.
הודעות יוצאות
לכל ההודעות ללקוחות המשרד יש מסלול יציאה אחד בקוד. לפני כל שליחה עוברת ההודעה שער שבודק, בסדר קבוע: עצירת חירום כללית, מצב בדיקה, השהיית משרד, אישור המייל של המשרד ומצב המנוי, רשימת החסימה הקבועה (שאינה נגישה לאף משרד), בקשת הפסקה והצהרת המשרד על איש הקשר, יום עסקים ושעה, הודעה אחת ביום לכל איש קשר, מכסה, ולבסוף מצב הערוץ: זהות שולחת מחוברת, תקרת SMS והשהיית הערוץ. כל סירוב נרשם עם קוד וסיבה. אין דרך אחרת לשלוח הודעה ללקוח, ובדיקה לפני כל פריסה נכשלת אם מישהו מוסיף אחת. הודעות מערכת למשתמשי המשרד עצמם (קוד כניסה, סיסמה, חשבון וחיוב) יוצאות במסלול נפרד.
עצירת חירום
אפשר לעצור את כל השליחה במערכת, את השליחה של משרד מסוים, או סוג פעולה מסוים, בפעולה אחת ובלי פריסת גרסה. המשרד יכול לעצור את עצמו מהלוח.
מחיקה
קבצים נמחקים אוטומטית 30 יום אחרי סגירת הבקשה (או 90, לפי בחירת המשרד). המחיקה כוללת את הקובץ, את התמונה המוקטנת וכל דבר אחר שנשמר תחת אותו מפתח, וגם מסמך שהלקוח החליף. בקשה שלא נסגרה אף פעם אינה נשמרת לנצח: הקבצים שלה נמחקים לכל המאוחר 365 יום אחרי פתיחתה. נרשמת שורת מחיקה לכל קובץ. הרישום שמסמך התקבל נשאר, בלי תוכן. עותק הגיבוי של קובץ נמחק יחד איתו. קובץ שהועלה לאחסון בלי שנרשם (למשל העלאה שנקטעה) נמחק כ־30 דקות אחרי תחילת ההעלאה, ואם הועלה באיחור, בתוך כמה שעות. נתוני החיבור הגולמיים מספקי ההודעות נמחקים אחרי 30 יום, בכל מצב.
תיעוד וניטור
כל שליחה, קבלה, העלאה, החלפה, צפייה (גם בתמונה מוקטנת) והורדה של מסמך מהלוח, מחיקה, הפסקת תזכורות, הפסקה לגמרי והשהיה, וגם הפתיחה הראשונה של כל קישור, נרשמות עם מועד ומבצע ברשומה שהקוד אינו משנה, מלבד מחיקה של טקסט שמקורו בלקוח כשהלקוח או המשרד נמחקים. רישום של צפייה או הורדה שנכשל מתריע למפעיל השירות. הרשומות נשמרות 24 חודשים ואז נמחקות.
יומן כניסות (תקנה 10): כל כניסה וכל ניסיון כניסה של משתמשי המשרד (בסיסמה, בקישור במייל או בקוד SMS), כל יציאה, הוספה והסרה של עובד, שינוי תפקיד ושינוי המספר לקוד הכניסה, וכל כניסה, צפייה ופעולה בדף הניהול של מפעיל השירות, נרשמים עם מי, מתי, באיזו דרך, והאם אושרו או נדחו. גם הגישה של מפעיל השירות למסד הנתונים עצמו נרשמת, במה שאפשר לרשום אוטומטית: כל שאילתה בלוח הבקרה של Supabase (עורך ה־SQL ועורך הטבלאות) ובחיבור ישיר למסד בתפקיד המנהל, לפי סוג הגישה והטבלאות ובלי ערכים, וכל ניסיון חיבור שנדחה. מסד הנתונים רושם אותן בעצמו, הבדיקה הלילית מעתיקה אותן ליומן, וחיבור ישיר שלא דרך לוח הבקרה מתריע למפעיל השירות. כל הרצה של סקריפט תפעול רושמת ביומן שורה משלה. פנייה למסד במפתח השירות מחוץ לאפליקציה ולסקריפטים האלה אינה נרשמת שאילתה אחר שאילתה. כתובת רשת וכתובת מייל שאין לה חשבון אינן נשמרות כפי שהן; נשמר תקציר חד־כיווני שלהן, שמחושב במפתח סודי שנמצא רק בשרת. כל רשומה נושאת תקציר של הרשומה שלפניה, ומסד הנתונים מסרב לשנות או למחוק רשומה; בדיקה לילית מחשבת את השרשרת מחדש, בודקת שההגנות פעילות ומתריעה למפעיל השירות על כל פער. היומן נשמר 24 חודשים לפחות, ומפעיל השירות עובר עליו פעם בחודש ורושם מה נמצא.
גיבוי רשומות האבטחה (תקנות 17 ו־18): בכל לילה נשמר עותק של הרשומות החדשות ביומן הכניסות, של תיעוד הפעולות במסמכים (בלי תוכן שמקורו בלקוחות) ושל רשימת המשתמשים בכל משרד, ב־bucket פרטי נפרד באותו פרויקט Supabase בפרנקפורט. כל עותק נמחק אחרי 24 חודשים. שחזור נעשה רק באישור מפעיל השירות ונרשם.
דף הניהול של מפעיל השירות נפתח בכתובת סודית, בסיסמה, ובקוד שנשלח ב־SMS לטלפון שלו. שגיאות נאספות למערכת ניטור (Sentry) בלי מסמכים ובלי תוכן הודעות, אחרי הסרה של מספרי טלפון, כתובות מייל, כל מספר בן 7 ספרות ומעלה, גוף הבקשות, עוגיות ואסימונים. ניטור חיצוני מתריע אם המנגנון שמריץ את העבודות מפסיק לפעול. התראות מגיעות למפעיל השירות בערוץ שהוא קורא בפועל.
בינה מלאכותית
המסמכים אינם נשלחים לשום מודל, ובשירות הם מוצגים רק למשרד. למפעיל השירות יש גישה טכנית לאחסון, לתפעול ולשחזור בלבד. אין בשירות רכיב בינה מלאכותית. הלקוח מעלה כל מסמך למקום המיועד לו, ולכן אין מה לנחש.
מה עדיין לא נעשה
כדי שהדף יהיה נכון ולא רק מרשים:
- ביקורת אבטחה חיצונית (תקנה 16): למשרד עם 10 משתמשים ומעלה, שהוא ברמה הבינונית, נדרשת ביקורת בידי גורם בעל הכשרה מתאימה שאינו מפעיל השירות, אחת ל־24 חודשים. היא תיערך לכל המאוחר 24 חודשים אחרי שמשרד ראשון יגיע ל־10 משתמשים.
- בדיקת חדירות חיצונית וסקר סיכונים: ייערכו לפני 25 משרדים, ואחת ל־18 חודשים לאחר מכן.
- סריקת וירוסים בקבצים נכנסים: הקבצים מוצגים למשרד בתצוגה מקדימה בדפדפן ואינם מורצים, אך אינם נסרקים.
- תקן ISO 27001 או דוח SOC 2: אין. Paperbot אינו טוען שיש לו.
- ביטוח סייבר: אין נכון לגרסה זו.
- הרצה אוטומטית של הבדיקות בכל פריסה: היום מפעיל השירות מריץ אותן לפני הפריסה; הן עדיין אינן חלק מתהליך הבנייה עצמו.
---
לדיווח על בעיית אבטחה: privacy@paperbot.co.il. מענה בתוך יום עסקים אחד. Paperbot מופעל על ידי ניאו זינו.

