תארו לעצמכם: האתר שלכם משתמש בקוקיות סשן, ומשתמש מאומת עוקב אחרי קישור לאתר זדוני. אותו אתר שולח בקשת POST לשינוי סיסמה — וללא אסימוני CSRF, הבקשה עוברת. פגיעות זו היא חלק מOWASP Top 10, ולפי סטטיסטיקות, עד 70% מהפרויקטים הישנים אינם מוגנים כלל. אנו נתקלים בכאב זה לעיתים קרובות בפרויקטים שבהם ההגנה חסרה או מיושמת באופן לא עקבי. לצוות שלנו יש ניסיון של למעלה מ-10 שנים באבטחת אינטרנט, עם ביצוע של למעלה מ-50 ביקורות והטמעות CSRF. המשימה שלנו היא לסגור פגיעות זו לצמיתות במפתח פתוח, עם אחריות ותיעוד.
בעיות שאנו פותרים
- קוקיות סשן מצורפות אוטומטית על ידי הדפדפן — תוקף צריך רק להציג לקורבן טופס בדומיין שלו. עד 70% מהאתרים על מסגרות עבודה מיושנות (למשל, PHP ללא מסגרת עבודה) אינם מוגנים כלל.
- הגדרת SameSite שגויה של קוקיות — מפתחים רבים מגדירים
Noneלנוחות, ופותחים דלת ל-CSRF. אנו מתקנים זאת ובוחרים ביןLaxל-Strictתוך התחשבות בחוויית המשתמש. - בקשות AJAX נשכחות — יישומי SPA פגיעים אם אסימוני CSRF לא מועברים בכותרת. אנו מגדירים העברה אוטומטית עבור Axios, Fetch, jQuery.
איך אנחנו עושים זאת: מקרה בוחן של Laravel Sanctum עבור SPA
נבחן פרויקט טיפוסי: חזית React על Next.js, צד שרת על Laravel עם Sanctum. הלקוח מתלונן על שגיאות 419 בעת שליחת טפסים. הבעיה: Sanctum משתמש בתבנית Double Submit Cookie, אך החזית לא קראה את קוקיית XSRF-TOKEN.
פתרון:
- ב-Laravel
config/sanctum.php, ציינו'stateful'עם דומיינים של לקוחות. - בחזית, הגדירו
axios.defaults.withCredentials = true. - קראו את XSRF-TOKEN מהקוקייה והעבירו אותה בכותרת X-XSRF-TOKEN:
// Axios interceptor
axios.interceptors.request.use(config => {
const token = document.cookie
.split('; ')
.find(row => row.startsWith('XSRF-TOKEN='))
?.split('=')[1];
if (token) {
config.headers['X-XSRF-TOKEN'] = token;
}
return config;
});תוצאה — שגיאות 419 נעלמו, האבטחה מובטחת. כל התהליך ארך יומיים, כולל בדיקות.
תהליך העבודה
- ניתוח — ביקורת על הארכיטקטורה הנוכחית: אימות סשן או אסימון, אילו טפסים ונקודות קצה של API יש להגן.
- עיצוב — בחירת שיטות: אסימוני CSRF, SameSite, Double Submit, או שילוב. קביעת חריגים (webhooks).
- הטמעה — פריסה בצד השרת (middleware, יצירת אסימונים) ובחזית (הגדרות גלובליות של לקוח HTTP).
- בדיקות — יצירת דף זדוני, אימות חסימת בקשות, בדיקות אוטומטיות.
- פריסה — פריסה לסביבת staging, בדיקה, ניטור אחר שגיאות 419/403.
מה כלול בהתקנה במפתח פתוח
- שילוב הגנת CSRF לכל הבקשות המשנות (POST, PUT, DELETE).
- הגדרת קוקיית SameSite עם ערך אופטימלי.
- טיפול בחריגים (Stripe, GitHub webhooks) עם אימות חלופי.
- תמיכה ב-SPA (Sanctum, JWT) ובטפסים קלאסיים.
- תיעוד תפעולי והדרכת צוות.
- חודש של תמיכה לאחר ההשקה.
לוחות זמנים ועלות משוערים
| סוג משימה | זמן | עלות |
|---|---|---|
| התקנה בסיסית על Laravel/Django/Rails | יום אחד | $500 |
| שילוב עם SPA קיים (Sanctum/XSRF) | 1–2 ימים | $800 |
| ביקורת ותיקון פרויקט ישן | 2–5 ימים | $1500+ |
העלות מחושבת באופן אישי לפי המחסן הטכנולוגי וההיקף שלכם. אנו מעריכים את הפרויקט תוך יום אחד — צרו קשר לייעוץ. התקנת CSRF בסיסית מתחילה מ-$500, וחוסכת פוטנציאלית $100k+ בעלויות פריצה.
בחירה בין SameSite=Lax ל-Strict
// Axios interceptor axios.interceptors.request.use(config => { const token = document.cookie .split('; ') .find(row => row.startsWith('XSRF-TOKEN=')) ?.split('=')[1]; if (token) { config.headers['X-XSRF-TOKEN'] = token; } return config; }); אינו שולח קוקיות בבקשות חוצות-אתר כלשהן — זה מאובטח אך שובר ניווט מקישורים חיצוניים (למשל, דוא"ל). SameSite=Strict מאפשר שליחה בניווטי GET, חוסם POST, וזו פשרה.
| ערך | אבטחה | חוויית משתמש |
|---|---|---|
SameSite=Lax |
99% | שובר ניווט |
Strict |
95% | שומר על חוויית המשתמש |
הניסיון שלנו (למעלה מעשר שנות הטמעה) מראה ש-Lax הוא הבחירה עבור 80% מהפרויקטים. גישת שילוב אסימון + SameSite יעילה ב-99.9%, לעומת 95% עבור SameSite בלבד. אם נדרשת אבטחה מקסימלית, אנו משתמשים ב-Lax עם דף נחיתה לקישורים חיצוניים.
הגנה על בקשות AJAX מפני CSRF
טעות אופיינית: האסימון אינו מתחדש לאחר התחברות או פג לפני הסשן. בדקו:
- תגית meta נוצרת ב-Blade (או מקבילה) בעת טעינת הדף.
- עבור SPA, יש לחדש את האסימון דרך קוקיית XSRF-TOKEN (Sanctum) או נקודת קצה נפרדת.
- אם משתמשים ב-
Strictבטפסים, ודאו שהם לא נשמרים במטמון.
דוגמה מפורטת: הגדרה עבור React + Laravel
ברכיב React, הוסיפו hook בשם @csrf לקריאה והגדרת האסימון:
import axios from 'axios';
function App() {
useEffect(() => {
axios.get('/sanctum/csrf-cookie').then(() => {
// токен уже в cookie XSRF-TOKEN
});
}, []);
const handleSubmit = async () => {
await axios.post('/api/form', data);
};
}ודאו שהשרת שולח את הכותרת useEffect.
בדיקת Origin/Referer נוספת
גם עם אסימונים, אנו מוסיפים בדיקת כותרת import axios from 'axios'; function App() { useEffect(() => { axios.get('/sanctum/csrf-cookie').then(() => { // токен уже в cookie XSRF-TOKEN }); }, []); const handleSubmit = async () => { await axios.post('/api/form', data); }; } ברמת ה-middleware. זוהי הגנה לעומק — אם האסימון דולף, תוקף לא יכול לזייף את ה-Origin.
public function handle($request, Closure $next) {
$origin = $request->header('Origin');
if ($request->isMethod('POST') && $origin && !in_array($origin, $allowed)) {
abort(403, 'Forbidden origin');
}
return $next($request);
} למה שילוב שיטות אמין יותר משיטה אחת?
לפי סטטיסטיקות, אתרים עם הגנת SameSite בלבד פגיעים ב-5% מהמקרים (התקפות תת-דומיין). אסימונים מכסים את אותם 5%. על ידי שילוב שתי הגישות, אנו מבטיחים הגנה ברמת OWASP Top 10. בנוסף, שימוש באסימונים אקראיים מאובטחים קריפטוגרפית לכל סשן מבטיח שלא ניתן לנחש את האסימון. מדריך זה משפר את אבטחת האינטרנט על ידי הטמעת הגנת CSRF. מניעת התקפות CSRF חיונית לכל יישום אינטרנט. הגדרת CSRF ב-Laravel מפושטת עם Sanctum. תבנית Double Submit Cookie עובדת עבור API חסרי מצב. תכונת SameSite Lax חוסמת את רוב הבקשות חוצות-האתר. הזמינו ביקורת אבטחה לאתר שלכם — נמצא ונתקן פגיעויות CSRF תוך יום אחד. קבלו ייעוץ לבחירת אסטרטגיית הגנה אופטימלית.
רשימת בדיקה לטעויות הגדרה אופייניות
- שימוש ב-
Set-Cookie: XSRF-TOKEN=...; SameSite=Laxללא HTTPS — הקוקייה לא תישלח. - שכחת חידוש האסימון לאחר שינוי סיסמה או התנתקות.
- החרגה מבדיקה לא רק של GET אלא גם של HEAD (צריך להיות בטוח).
- אי בדיקת כותרת
Originכאשר קיים אסימון CSRF.







