ארכיטקטורת אבטחה

    איך עובדים הקישורים הסודיים של LinkPilot

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

    מפתח = החלק שאחרי # · לא נשלח אף פעם · AES-GCM-256

    קישורים סודיים פרטיים מעצם התכנון. LinkPilot מפריד בין שיתוף מידע סודי לבין סטטיסטיקות של קישורי שיווק. התוכן הסודי אף פעם לא משמש לסטטיסטיקות או לבניית פרופילים.

    מצאתם חולשה או קישור שמשמש לרעה? דווחו כאן. הדיווחים מגיעים ישירות לצוות.

    1. סקירה כללית

    LinkPilot מפעיל באותה פלטפורמה שני מסלולי קישורים נפרדים: קישורים חכמים, שהם קישורים מקוצרים ממותגים עם סטטיסטיקות קליקים, וקישורים סודיים, למסירה חד-פעמית של מידע רגיש, עם תפוגה והגנה בביטוי סיסמה. המסלולים מופרדים ברמת הנתונים, ברמת הקוד וברמת המוצר, כך שתוכן סודי לא יכול לזלוג ללוחות בקרה של סטטיסטיקות, לייצוא נתונים או לתכונות AI.

    העמוד הזה עוסק רק במסלול הקישורים הסודיים: איך נוצר סוד, איך הוא מוצג, מה קורה אחרי שצפו בו ואילו מטא-נתונים נרשמים בדרך.

    2. איך עובדים קישורים סודיים

    1. השולח יוצר סוד, ואם הוא רוצה, מגדיר ביטוי סיסמה, משך תוקף ומספר צפיות שאחריו התוכן נמחק.
    2. הדפדפן של השולח מצפין את התוכן לפני שמשהו נשלח. מה שמגיע אלינו הוא טקסט מוצפן, שנכתב לטבלה ייעודית secret_links, מבודדת מטבלאות סטטיסטיקות הקליקים.
    3. LinkPilot מחזיר כתובת מקוצרת (למשל shrd.link/s/<slug>#k=<key>) לשליחה לנמען. החלק שאחרי הסימן # הוא מפתח הפענוח. הוא נוצר בדפדפן של השולח ואף פעם לא נשלח אלינו. אין לנו דרך לשחזר את הכתובת הזו מאוחר יותר.
    4. כשהנמען פותח את הקישור, האפליקציה קוראת לפונקציית הקצה secret-reveal. בקשת GET מחזירה רק מטא-נתונים (הסטטוס, והאם נדרש ביטוי סיסמה). רק בקשת POST עם ביטוי הסיסמה מחזירה את הטקסט המוצפן. אחר כך הדפדפן של הנמען מפענח אותו בעזרת המפתח מהחלק של הקישור שאחרי הסימן #. פונקציית ההצגה עצמה אף פעם לא מפענחת דבר, וגם לא הייתה יכולה לעשות זאת.
    5. הצגה מוצלחת נרשמת כפעולה אטומית, ולפי הגדרת מספר הצפיות היא יכולה לסמן את הסוד מיד כ-burned.

    3. מודל ההצפנה

    כאן אנחנו רוצים לדייק, כי המילים "מוצפן" ו"אפס ידיעה" (zero-knowledge) משמשות לעיתים קרובות בצורה רופפת.

    • בזמן ההעברה: כל התעבורה בין הנמען, שרתי הקצה שלנו ומסד הנתונים המנוהל שלנו מוצפנת ב-TLS לכל אורך הדרך.
    • בדפדפן, לפני השליחה: מאז 29 בספטמבר 2026 התוכן מוצפן בצד הלקוח ב-AES-GCM-256 עם מפתח של 256 ביט שנוצר בדפדפן שלכם. אנחנו שומרים את הטקסט המוצפן ותו לא. המפתח עובר בחלק של קישור השיתוף שאחרי הסימן #, ודפדפנים לא שולחים את החלק הזה לשום שרת: לא אלינו וגם לא ל-Cloudflare, שמגיש את דף ההצגה.
    • באחסון: הטקסט המוצפן נשמר בעמודה שמופרדת לוגית מנתוני הסטטיסטיקות, במופע Postgres מנוהל שגם הדיסק שלו מוצפן.
    • ביטויי סיסמה: כשמגדירים ביטוי סיסמה, הוא מומר לצורת Unicode תקנית (NFKC), כך שאותו ביטוי שהוקלד במקלדת אחרת או בשיטת קלט אחרת נותן את אותו מפתח. אחר כך הוא עובר חיזוק ב-PBKDF2-SHA256 (210,000 איטרציות) ומשולב עם מפתח הקישור באמצעות HKDF-SHA256, כך שלא הקישור לבדו ולא ביטוי הסיסמה לבדו מפענחים את הסוד. בנפרד נשלח hash מסוג SHA-256 של ביטוי הסיסמה, כדי שהשרת יוכל לסרב להחזיר את הטקסט המוצפן בכלל למי שלא יודע אותו. ביטוי הסיסמה כטקסט גלוי אף פעם לא נכתב למסד הנתונים או ליומנים שלנו.
    • ממה זה מגן וממה לא: ההצפנה מוציאה אותנו, את מסד הנתונים שלנו ואת שרתי הקצה שלנו ממעגל האמון. היא לא מגינה על סוד שהקישור המלא שלו הועבר הלאה, צולם במסך או נרשם ביומן של מערכת כלשהי אצל הנמען, כי הקישור הזה נושא את המפתח.
    • שני החריגים, בלי ייפוי: סודות שנוצרו לפני 29 בספטמבר 2026 נשמרים כטקסט גלוי. אנחנו לא כותבים אותם מחדש בשקט, הם ממשיכים לעבוד בדיוק כמו קודם, והם נעלמים כשתוקפם פג. קבצים מצורפים מוצפנים גם הם בדפדפן, עם מפתח שנגזר מהמפתח של הסוד עצמו, כך שקישור אחד פותח את שניהם ואין אצלנו מפתח לאף אחד מהם. מה שאנחנו עדיין רואים הוא שם הקובץ, הגודל והסוג שלו: אלה עמודות של מטא-נתונים, לא תוכן. קבצים מצורפים שהועלו לפני 29 בספטמבר 2026 נשמרים כקבצים לא מוצפנים.

    המשמעות המעשית ראויה לאמירה מפורשת: מאחר שהמפתח אף פעם לא אצלנו, אנחנו לא יכולים לשחזר בשבילכם סוד. אם קישור השיתוף אבד, התוכן אבד איתו.

    בדקו בעצמכם. לא צריך לסמוך עלינו בעיניים עצומות בעניין ההצפנה בדפדפן. אותו קוד הצפנה נמצא במאגר linkpilot-cli שלנו, שהוא קוד פתוח (ברישיון MIT) ומכיל את ה-CLI, את ה-SDK ל-TypeScript ואת שרת ה-MCP. המאגר כולל את וקטורי הבדיקה שמולם נבדקת אפליקציית הרשת, כך שאפשר לקרוא את גזירת המפתח, להריץ את הווקטורים ולוודא שמה שיוצא מהלקוח הוא טקסט מוצפן ושהמפתח נכנס רק לחלק של הקישור שאחרי הסימן #. אם מצאתם פער בין הקוד לבין העמוד הזה, דווחו לנו.

    4. מה קורה אחרי שצופים בסוד

    • הצפייה נרשמת כפעולה אטומית דרך פונקציה במסד הנתונים, ולכן ניסיונות הצגה מקבילים לא יכולים לחשוף את הסוד פעמיים.
    • כשמגיעים למכסת הצפיות, הסטטוס של הסוד משתנה ל-burned והתוכן השמור נדרס בערך [REDACTED].
    • ניסיונות הצגה נוספים מקבלים תשובה ברורה, "כבר נצפה והושמד", עם HTTP 410.
    • יומן הביקורת מתעד כל צפייה, מחיקה וביטול קישור עם כתובת IP מגובבת (hash), וזה עוזר בטיפול באירועי אבטחה ובהחלפת פרטי התחברות.

    5. תפוגה וביטול קישורים

    • לכל סוד אפשר להגדיר תפוגה לפי זמן (1 שעה, 24 שעות או 7 ימים בכל תוכנית, או תאריך ושעה לבחירתכם בתוכנית Pro) וגם מכסת צפיות, אם רוצים.
    • סוד שתוקפו פג מסומן כ-expired בגישה הבאה אליו, והתוכן נמחק באותה פעולת כתיבה.
    • הבעלים יכולים לבטל קישור ידנית בכל רגע מלוח הבקרה. קישור שבוטל מסרב מיד להציג את הסוד ומחזיר HTTP 410.
    • אחרי שסוד נמחק, פג תוקף או בוטל, אי אפשר לשחזר את התוכן דרך המוצר. אין בכוונה פעולת "ביטול הביטול" או "שחזור".

    6. הגנה בביטוי סיסמה

    • ביטוי סיסמה הוא אופציונלי, אבל מומלץ לכל סוד שאתם לא רוצים שצופה מזדמן ינצל.
    • הדפדפן מחשב hash מסוג SHA-256 של ביטוי הסיסמה, שולח אותו ב-TLS, והשרת משווה בין ערכי ה-hash. הערך המקורי אף פעם לא מגיע למסד הנתונים שלנו.
    • אנחנו מגבילים את ניסיונות ביטוי הסיסמה ל-5 בדקה לכל כתובת IP ולכל סוד. ההגבלה נאכפת גם במגביל בזיכרון וגם בחלון נע שנשמר במסד הנתונים.
    • כל ניסיון כושל נכתב ליומן הביקורת עם כתובת IP מגובבת, כדי שבעלי סביבת העבודה יראו פעילות חשודה.
    • אנחנו ממליצים לשלוח את ביטוי הסיסמה בערוץ אחר מהקישור עצמו, למשל את הקישור באימייל ואת ביטוי הסיסמה בהודעה פרטית ב-Slack או ב-SMS.

    7. הגנה מסורקי קישורים ומבוטים של תצוגה מקדימה

    סורקי אבטחה של אימייל ובוטים של אפליקציות צ'אט שמייצרים תצוגה מקדימה לקישורים (Slack, LinkedIn, iMessage, Outlook) פותחים כתובות באופן שגרתי ברגע שהן מופיעות. בקישור שנמחק לאחר קריאה, תכנון נאיבי היה גורם לכך שהתצוגה המקדימה הראשונה תשמיד את הסוד לפני שהנמען רואה אותו.

    LinkPilot מונע את זה בשלוש דרכים:

    • נקודות קצה נפרדות למטא-נתונים ולהצגה. בקשת GET לנקודת הקצה של ההצגה מחזירה רק את הסטטוס ואת התשובה לשאלה אם נדרש ביטוי סיסמה. צפייה נרשמת רק בבקשת הצגה מפורשת מסוג POST, וזו הפעולה שאדם מבצע אחרי לחיצה על כפתור ההצגה.
    • שער ביטוי הסיסמה. כשמוגדר ביטוי סיסמה, התוכן לא מוחזר לאף אחד, בוט או אדם, בלי ה-hash הנכון.
    • Cache-Control: no-store בכל תשובה של הצגה, כדי ששרתי ביניים לא ישמרו תוכן סודי במטמון.

    8. אילו מטא-נתונים נרשמים

    על כל ניסיון הצגה אנחנו רושמים רק את מה שצריך כדי לתת לבעלי סביבת העבודה תיעוד ביקורת אמין:

    • חותמת הזמן של הניסיון.
    • כתובת IP מגובבת: SHA-256 של כתובת ה-IP של הלקוח יחד עם salt שמתחלף מדי יום, מקוצר ל-32 תווים. כתובת ה-IP המקורית אף פעם לא נשמרת.
    • מיקום גאוגרפי כללי (מדינה ועיר) משרת הקצה, כשהספק שמעליו מספק אותו.
    • מחרוזת User-Agent שהלקוח מדווח.
    • סוג האירוע: created, viewed, failed_passphrase, burned, expired, revoked.

    אנחנו לא רושמים: את התוכן הסודי, את ביטוי הסיסמה המקורי, את כתובת ה-IP המקורית, עוגיות אצל הנמען (אין כאלה) או פיקסלי מעקב של צד שלישי.

    9. ההבדל בין קישורים סודיים לקישורים עם סטטיסטיקות

    היבטקישורים חכמים (סטטיסטיקות)קישורים סודיים
    מטרהקישורים מקוצרים ממותגים עם מעקב קליקיםמסירה מאובטחת וחד-פעמית עם תפוגה
    אחסוןקישורים ואירועי קליקטקסט מוצפן בטבלה מבודדת secret_links, נמחק בהשמדה
    נתונים על כל קליקIP מגובב, מקור הפנייה, UA, מיקום, UTMIP מגובב, UA, מיקום, סוג אירוע. בלי התוכן
    שימוש לסטטיסטיקות או ל-AIכן (מצטבר, מגובב)אף פעם, מוחרג לחלוטין
    משך חייםנשמר עד שאתם מוחקיםנמחק, פג תוקף או מבוטל, ואז אי אפשר לשחזר את התוכן
    תצוגות מקדימות של בוטיםנספרות כבוט ומסוננות מהסטטיסטיקותGET מחזיר רק מטא-נתונים, ובוטים לא יכולים להציג את הסוד

    לשני המסלולים יש אותו מותג, אותו לוח בקרה ואותן הגדרות צוות, אבל זרימות הנתונים שלהם לא נפגשות.

    10. קבצים מצורפים

    • הקבצים מוצפנים בדפדפן עם מפתח שנגזר מהמפתח של הסוד עצמו, כך שקישור אחד פותח גם את הטקסט וגם את הקובץ.
    • הם מוגשים דרך כתובות חתומות קצרות-מועד, מאחורי אותן הגדרות של ביטוי סיסמה, תפוגה ומחיקה שחלות על הטקסט.
    • שם הקובץ, הגודל והסוג שלו גלויים לנו כמטא-נתונים. התוכן שלו לא.
    • קבצים מצורפים שהועלו לפני 29 בספטמבר 2026 נשמרים כקבצים לא מוצפנים עד שתוקפם פג. הם אף פעם לא נכתבים מחדש.

    11. שמירת נתונים

    • התוכן של סוד נדרס כשהוא נמחק, פג תוקף או מבוטל. אין שחזור, בכוונה, ואנחנו לא יכולים לשחזר אותו בשבילכם.
    • נתוני החשבון נשמרים כל עוד סביבת העבודה פעילה, ועוד 30 ימים אחרי המחיקה, כדי שאפשר יהיה לבטל מחיקה בטעות.
    • אחרי 90 ימים, סטטיסטיקות הקליקים של קישורים מקוצרים מצטברות לספירות אנונימיות.
    • אירועי יומן הביקורת שומרים רק את הערכים המגובבים עם salt שמתוארים בסעיף 8. אין כתובת מקורית שאפשר לשמור.

    12. סודות אנונימיים וסודות בסביבת עבודה

    מחולל הקישורים הסודיים החינמי יוצר סודות בלי חשבון. המחיקה לאחר קריאה תמיד פעילה, התפוגה היא 1 שעה, 24 שעות או 7 ימים, Turnstile מגן על הטופס משימוש לרעה אוטומטי, ואותה הצפנה בדפדפן חלה גם כאן.

    סוד בסביבת עבודה מוסיף את יומן הביקורת, ביטול קישור מלוח הבקרה, קבצים מצורפים, ובתוכנית Pro גם ביטויי סיסמה ותאריך ושעת תפוגה לבחירתכם. מודל ההצפנה זהה בשני המקרים.

    13. המגבלות, בלי ייפוי

    • קישור שהועבר הלאה הוא סוד שהועבר הלאה. שום דבר בתכנון לא יכול למנוע מנמען להעביר את הקישור למישהו אחר לפני שפתח אותו. תפוגה קצרה וביטוי סיסמה שנשלח בערוץ שני הם מה שמצמצם את הסיכון.
    • קישור שאבד הוא סוד שאבד. המפתח אף פעם לא אצלנו, כך שאין מה לשחזר.
    • החריג של לפני 29 בספטמבר. סודות שנוצרו לפני התאריך הזה נשמרו כטקסט גלוי עד שתוקפם פג.
    • לא קוד פתוח, ואין אירוח עצמי. לקוח ההצפנה מתפרסם עם וקטורי בדיקה במאגר ה-CLI שברישיון MIT, אבל השירות עצמו הוא מוצר בענן. אם אירוח עצמי הוא דרישה, ראו את החלופות בקוד פתוח.
    • צפייה היא לא אדם. היומן מתעד מתי ובערך מאיפה נפתח סוד, אף פעם לא מי פתח אותו. אם הגורם הלא נכון פתח אותו, החליפו את פרטי ההתחברות.

    14. דיווח על חולשה

    אפשר לדווח על ממצאי אבטחה ועל קישורים שמשמשים לרעה בכתובת /report, והדיווחים מגיעים ישירות לצוות. בקשות בנושא פרטיות ומידע אישי נשלחות לכתובת privacy@uselinkpilot.com ונענות תוך 30 ימים. עמוד ה-GDPR מפרט אילו נתונים אנחנו מעבדים ועל איזה בסיס.

    15. שאלות נפוצות

    האם הסוד מוצפן מקצה לקצה?

    כן, לסודות שנוצרו מ-29 בספטמבר 2026 והלאה. התוכן מוצפן בדפדפן שלכם ב-AES-GCM-256 לפני שהוא נשלח, והמפתח נמצא בחלק של קישור השיתוף שאחרי הסימן #. זה החלק בכתובת שדפדפנים אף פעם לא שולחים. אנחנו מקבלים רק טקסט מוצפן ואף פעם לא את המפתח, ולכן אנחנו לא יכולים לקרוא את הסוד. קבצים מצורפים מוצפנים באותה דרך, עם מפתח שנגזר מאותו קישור. שתי הסתייגויות שאנחנו רוצים לומר במפורש: סודות שנוצרו לפני התאריך הזה עדיין נשמרים כטקסט גלוי וממשיכים לעבוד בלי שינוי עד שתוקפם פג, ושם הקובץ, הגודל והסוג שלו עדיין נשמרים בלי הצפנה, אף שהתוכן שלו מוצפן.

    האם אנשי הצוות של LinkPilot יכולים לקרוא את הסודות שלי?

    לא כשמדובר בסוד שהוצפן בדפדפן שלכם: מפתח הפענוח אף פעם לא נשלח אלינו, ולכן גם מי שמפעיל את המערכת עם גישה מלאה למסד הנתונים רואה רק טקסט מוצפן. אותו דבר נכון לכל מי שפורץ למסד הנתונים או לשרתי הקצה שלנו. שלוש מגבלות, בכנות: סוד שנוצר לפני 29 בספטמבר 2026 נשמר כטקסט גלוי, ומי שמפעיל את המערכת יכול לקרוא אותו כל עוד הוא פעיל. אנחנו עדיין רואים את שם הקובץ, הגודל והסוג שלו, אף שאנחנו לא יכולים לקרוא את התוכן. וכל מי שמשיג את קישור השיתוף המלא, כולל החלק שאחרי הסימן #, יכול לפתוח את הסוד, ולכן תפוגה קצרה ומחיקה לאחר קריאה עדיין חשובות.

    האם תצוגה מקדימה של קישור ב-Slack או באימייל מוחקת את הסוד?

    לא. בוטים של תצוגה מקדימה שולחים בקשות GET, שמחזירות רק מטא-נתונים (הסטטוס, והאם נדרש ביטוי סיסמה). צפייה נרשמת רק בבקשת הצגה מפורשת מסוג POST, וזו הפעולה שהנמען האנושי מבצע כשהוא לוחץ על כפתור ההצגה.

    איזה מידע אתם רושמים על צפייה?

    על כל צפייה אנחנו רושמים: חותמת זמן, כתובת IP מגובבת (SHA-256 עם salt שמתחלף מדי יום, מקוצר ל-32 תווים), מדינה ועיר משרת הקצה אם הן זמינות, ואת מחרוזת ה-User-Agent. אנחנו לא רושמים את התוכן הסודי, את ביטוי הסיסמה המקורי או את כתובת ה-IP המקורית.

    האם סודות משמשים אי פעם לאימון מודלים או לסטטיסטיקות?

    לא. התוכן הסודי מוחרג מסטטיסטיקות, מבניית פרופילים ומכל תכונת AI. מסלול הקישורים הסודיים נפרד ממסלול הסטטיסטיקות של הקישורים החכמים.

    אפשר לראות מי פתח סוד?

    לא מי. בתוכנית Pro, היומן מציג מתי התרחשה כל הצגה, את המדינה והעיר ששרת הקצה מדווח, את מחרוזת ה-User-Agent של הדפדפן ו-hash של כתובת הרשת עם salt שמתחלף מדי יום. זה מספיק כדי לאשר שהסוד נמסר או לזהות פתיחה ממקום לא צפוי, והמערכת בנויה כך שאי אפשר להפוך את המידע הזה לזהות.

    אפשר להריץ את LinkPilot באירוח עצמי?

    לא. LinkPilot הוא שירות בענן. לקוח ההצפנה מתפרסם במאגר ה-CLI שברישיון MIT עם וקטורי בדיקה כדי שאפשר יהיה לבקר אותו, אבל השירות עצמו אינו קוד פתוח. אם אירוח עצמי הוא דרישה, האפשרויות המקובלות הן OneTimeSecret, Password Pusher, PrivateBin ו-Yopass.

    מה קורה אם מישהו מנסה לנחש את ביטוי הסיסמה בכוח גס (brute force)?

    ניסיונות ביטוי הסיסמה מוגבלים ל-5 בדקה לכל כתובת IP ולכל סוד, בשתי שכבות (בזיכרון ובמסד הנתונים). ניסיונות כושלים נכתבים ליומן הביקורת עם כתובת IP מגובבת.

    עוד בנושא

    נסו קישור סודי בעצמכם

    תוכנית Free בלי הגבלת זמן. לא צריך כרטיס אשראי.