בעיה: טעויות אופייניות ביישום שחזור סיסמה
תהליך "שכחתי סיסמה" הסטנדרטי נראה פשוט: המשתמש מזין אימייל, מקבל קישור, מגדיר סיסמה חדשה. אבל בפועל, מפתחים עושים טעויות שמובילות לפרצות אבטחה: חשיפת סטטוס רישום, ניחוש טוקנים, עקיפת הגבלת קצב. אנו מגדירים את התהליך ב-Laravel באמצעות Password Broker המובנה: הטוקן נוצר, מהופך ל-hash עם bcrypt, ונשמר בטבלת password_resets עם TTL של 60 דקות. התשובה לבקשת שחזור זהה עבור אימיילים קיימים ולא קיימים — תוקף לא יכול לדעת אם משתמש רשום. OWASP ממליץ על bcrypt ל-hashing של טוקנים, ואנו פועלים לפי נוהג זה.
איך עובד תהליך השחזור?
המשתמש שולח בקשת POST אל /forgot-password עם האימייל שלו. השרת יוצר טוקן, מהופך אותו ל-hash, ושומר אותו במסד הנתונים. לאחר מכן נשלח אימייל עם קישור כמו https://example.com/reset-password?token=...&email=.... המשתמש לוחץ על הקישור, רואה טופס לסיסמה חדשה. לאחר שליחת POST אל /reset-password, השרת מאמת את הטוקן (משווה את ה-bcrypt hash), מעדכן את הסיסמה, ומסיר את הטוקן. כל סשני המשתמש הפעילים מבוטלים.
אילו פרצות מסתיר היישום הסטנדרטי?
אחסון הטוקן בטקסט פשוט
אם הטוקן מאוחסן בטקסט פשוט, פריצה למסד נתונים מאפשרת לתוקף לאפס מיד את הסיסמה של כל משתמש. אנו משתמשים ב-bcrypt hash — אפילו מסד נתונים שנפרץ לא חושף טוקנים. bcrypt תוכנן במיוחד ל-hashing של סיסמאות: הוא איטי וכולל מלח (salt). MD5 ו-SHA-1/2 מאפשרים מיליוני צירופים בשנייה, בעוד bcrypt מאט את כוח הגס (brute force) פי 1000, מה שהופך התקפה לבלתי מעשית.
חוסר בהגבלת קצב
ללא הגבלת קצב, תוקף יכול להציף את השרת בבקשות איפוס, ולגרום לעומס על שרת הדואר. אנו קובעים מגבלה: לא יותר מ-3 בקשות בשעה לכל אימייל או כתובת IP.
תשובה זהה עבור אימיילים קיימים ולא קיימים
רבים מחזירים שגיאות שונות ("אימייל לא נמצא" לעומת "אימייל נשלח"), מה שמאפשר לתוקף למפות את בסיס האימיילים. הפתרון שלנו תמיד עונה באופן זהה: "אם האימייל רשום, האימייל נשלח."
למה bcrypt במקום MD5/SHA?
bcrypt תוכנן במיוחד ל-hashing של סיסמאות: הוא איטי וכולל מלח. MD5 ו-SHA-1/2 הם hashes מהירים שמאפשרים לתוקף לנסות מיליוני צירופים בשנייה. Bcrypt מאט את כוח הגס פי 1000 או יותר, מה שהופך התקפה לבלתי מעשית. משמעות הדבר היא שהגישה שלנו עם bcrypt בטוחה פי 1000 מאחסון הטוקן בטקסט פשוט.
איך אנו מיישמים שחזור סיסמה במפתח פתוח
אנו משתמשים ב-Laravel Password Broker, המספק שיטות מוכנות ליצירה, אימות ומחיקה של טוקנים. דוגמת בקר:
use Illuminate\Support\Facades\Password;
class ForgotPasswordController extends Controller
{
public function __invoke(Request $request)
{
$request->validate(['email' => 'required|email']);
$status = Password::sendResetLink($request->only('email'));
return $status === Password::RESET_LINK_SENT
? back()->with(['status' => __($status)])
: back()->withErrors(['email' => __($status)]);
}
}לאיפוס סיסמה אנו משתמשים ב-use Illuminate\Support\Facades\Password; class ForgotPasswordController extends Controller { public function __invoke(Request $request) { $request->validate(['email' => 'required|email']); $status = Password::sendResetLink($request->only('email')); return $status === Password::RESET_LINK_SENT ? back()->with(['status' => __($status)]) : back()->withErrors(['email' => __($status)]); } } .
אחסון טוקן: טבלת Password::reset() עם שדות password_resets, email (bcrypt), token. הטוקן חי 60 דקות, ולאחר מכן מוסר באמצעות cron או איסוף אשפה. דוגמת טבלה:
| אימייל | טוקן (bcrypt) | נוצר ב- |
|---|---|---|
| [email protected] | $2y$10$... | — |
| [email protected] | $2y$10$... | — |
הודות ל-bcrypt, גם אם מסד הנתונים דולף, לא ניתן לפענח טוקנים — זה בטוח פי 1000 מטקסט פשוט.
טעויות יישום אופייניות
- אחסון הטוקן בטקסט פשוט
- חוסר בהגבלת קצב
- תשובות שונות עבור אימיילים קיימים/לא קיימים
- ללא ביטול סשנים לאחר שינוי סיסמה
- TTL ארוך מדי לטוקן (יותר משעה)
השוואת גישות לאמינות
| גישה | אבטחה | מורכבות |
|---|---|---|
| טוקן עם bcrypt hash (שלנו) | גבוהה | נמוכה |
| טוקן בטקסט פשוט | נמוכה | נמוכה מאוד |
| טוקן JWT עם TTL קצר | בינונית | בינונית |
הגישה שלנו היא האיזון האופטימלי בין אבטחה לתחזוקה. JWT עם TTL קצר דורש תשתית נוספת ואינו מגן מפני דליפת טוקן אם המפתח הסודי נפרץ. מהנדסים מוסמכים מבטיחים איכות יישום.
תהליך העבודה
- ניתוח מערכת האימות הנוכחית וזיהוי סיכונים.
- עיצוב התהליך: נקודות קצה, אימות, הגבלת קצב.
- יישום בקרים, מיגרציות, תבנית אימייל מותאמת אישית.
- בדיקות: בדיקות יחידה לאיפוס ושחזור, בדיקות אינטגרציה להגבלת קצב.
- פריסה וניטור.
לוח זמנים ומה כלול
בדרך כלל היישום לוקח 1–2 ימי עסקים. כולל:
- בקר ונתיבים מותאמים אישית
- מיגרציה לטבלת password_resets
- תבנית אימייל מותאמת אישית (HTML+טקסט)
- הגבלת קצב (3 בקשות/שעה לכל אימייל)
- ביטול סשנים בעת שינוי סיסמה
- בדיקות ותיעוד
יש לנו ניסיון רב שנים והשלמנו למעלה מ-30 פרויקטי אימות. קבלו ייעוץ — נעריך את הפרויקט שלכם. הזמינו יישום שחזור סיסמה מאובטח במפתח פתוח — צרו קשר.







