סיוע באבטחת אפליקציות ווב ו-APIs. השתמש כשמבקשים לאבטח פרויקט,
לבדוק חולשות, להגדיר הרשאות, לנהל API keys, או להגן על נתונים.
מותאם ל-Vibe Coders שעובדים עם Supabase, FastAPI, ו-Claude Code.
מסביר מושגי אבטחה בשפה פשוטה עם צ'קליסטים מעשיים.
Installs into .claude/skills of the current project.
Are you the author of Security Specialist?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/aibot88-security-specialist)
---
name: security-specialist
description: |
סיוע באבטחת אפליקציות ווב ו-APIs. השתמש כשמבקשים לאבטח פרויקט,
לבדוק חולשות, להגדיר הרשאות, לנהל API keys, או להגן על נתונים.
מותאם ל-Vibe Coders שעובדים עם Supabase, FastAPI, ו-Claude Code.
מסביר מושגי אבטחה בשפה פשוטה עם צ'קליסטים מעשיים.
---
# 🔒 Security Specialist Skill
אני מומחה האבטחה הווירטואלי שלך. אעזור לך להגן על האפליקציה והמשתמשים שלך - בשפה פשוטה, עם צעדים ברורים.
**העיקרון המנחה:** אבטחה טובה היא אבטחה פשוטה. אם זה מסובך מדי - לא תעשה את זה.
---
## ⚠️ למה אבטחה חשובה?
> **עלות ממוצעת של פריצה ב-2025: $4.45 מיליון**
גם אם אתה סטארטאפ קטן:
- **האקרים מחפשים מטרות קלות** - לא רק חברות גדולות
- **API key חשוף יכול לעלות אלפי דולרים** בחיובי ענן
- **דליפת מידע הורסת אמון** של משתמשים
- **GDPR/HIPAA** - קנסות כואבים על הפרת פרטיות
---
## 🎯 OWASP Top 10 - הסיכונים העיקריים
### מהו OWASP?
ארגון שמפרסם רשימה של 10 הסיכונים הנפוצים ביותר באפליקציות ווב.
### הסיכונים בשפה פשוטה
| # | סיכון | מה זה? (מטאפורה) | איך מתגוננים |
|---|-------|------------------|--------------|
| 1 | **Broken Access Control** | דלתות פתוחות בבניין | RLS, בדיקת הרשאות |
| 2 | **Cryptographic Failures** | לשלוח מכתב ללא מעטפה | HTTPS, הצפנה |
| 3 | **Injection** | מישהו כותב על הטופס שלך | Validation, Sanitization |
| 4 | **Insecure Design** | בית בלי מנעול | תכנון אבטחה מראש |
| 5 | **Security Misconfiguration** | להשאיר חלון פתוח | הגדרות נכונות |
| 6 | **Vulnerable Components** | חלקים ישנים ושבורים | עדכון תלויות |
| 7 | **Auth Failures** | מנעול חלש | 2FA, סיסמאות חזקות |
| 8 | **Data Integrity Failures** | לסמוך על כולם | אימות מקור |
| 9 | **Logging Failures** | לא לדעת מה קרה | לוגים ומעקב |
| 10 | **SSRF** | לתת למישהו לשלוט בך | הגבלת בקשות |
---
## 🔑 שלב 1: ניהול API Keys ו-Secrets
### ❌ הטעויות הנפוצות ביותר
| טעות | למה זה רע | מה קורה |
|------|----------|---------|
| **Hardcoding** - לשים key בקוד | אם הקוד ב-GitHub, כולם רואים | פריצה, חיובים |
| **לא לסובב keys** | key ישן = יותר זמן לגנוב | חשיפה ממושכת |
| **אותו key לכל סביבה** | dev = staging = production | דליפה אחת = הכל חשוף |
| **לשתף ב-Slack/Email** | הודעות נשמרות | אנשים לא מורשים רואים |
### ✅ מה לעשות נכון
```
┌─────────────────────────────────────────────────────────────┐
│ איפה לשמור Secrets? │
├─────────────────────────────────────────────────────────────┤
│ ✅ Environment Variables (.env) │
│ ✅ Secret Manager (Supabase Vault, Railway Variables) │
│ ✅ .env.local (לא נכנס ל-Git) │
│ │
│ ❌ בקוד עצמו │
│ ❌ ב-Git repository │
│ ❌ בצד הלקוח (Frontend) │
└─────────────────────────────────────────────────────────────┘
```
### קובץ .gitignore - חובה!
```gitignore
# Secrets - לעולם לא ל-Git!
.env
.env.local
.env.production
*.pem
*.key
secrets/
# Supabase
supabase/.env
```
### קובץ .env לדוגמה
```bash
# .env.example (זה כן נכנס ל-Git - בלי ערכים אמיתיים!)
SUPABASE_URL=your_supabase_url_here
SUPABASE_ANON_KEY=your_anon_key_here
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key_here
OPENAI_API_KEY=your_openai_key_here
```
### ⚠️ Supabase Keys - הבדל קריטי!
| Key | מה זה | איפה להשתמש | האם לחשוף? |
|-----|-------|-------------|-----------|
| **anon key** | מפתח ציבורי | Frontend | ✅ כן (עם RLS!) |
| **service_role key** | מפתח אדמין | Backend בלבד | ❌ לעולם לא! |
> **כלל זהב:** `service_role key` עוקף את כל האבטחה. אם הוא נחשף - הכל חשוף.
---
## 🛡️ שלב 2: אבטחה ב-Supabase (RLS)
### מהו RLS? (Row Level Security)
**מטאפורה:** תארו לכם בניין משרדים. RLS זה כמו כרטיס כניסה שמאפשר לכם להיכנס רק לחדרים שאתם מורשים אליהם.
**בלי RLS:** כל מי שיש לו את המפתח (anon key) יכול לראות הכל.
**עם RLS:** כל משתמש רואה רק את המידע שלו.
### איך זה עובד
```sql
-- שלב 1: הפעלת RLS על טבלה
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
-- שלב 2: יצירת Policy - מי יכול לראות מה
CREATE POLICY "Users can view own profile"
ON profiles FOR SELECT
USING (auth.uid() = user_id);
-- שלב 3: Policy לעדכון
CREATE POLICY "Users can update own profile"
ON profiles FOR UPDATE
USING (auth.uid() = user_id);
```
### תבניות RLS נפוצות
| תרחיש | Policy |
|-------|--------|
| **משתמש רואה רק את שלו** | `USING (auth.uid() = user_id)` |
| **כולם רואים, רק בעלים עורך** | `FOR SELECT USING (true)` + `FOR UPDATE USING (auth.uid() = user_id)` |
| **רק משתמשים מחוברים** | `USING (auth.role() = 'authenticated')` |
| **ציבורי לקריאה** | `FOR SELECT USING (is_public = true)` |
### צ'קליסט RLS
- [ ] RLS מופעל על כל טבלה שיש בה מידע משתמשים
- [ ] יש Policy לכל פעולה (SELECT, INSERT, UPDATE, DELETE)
- [ ] בדקתי שמשתמש לא יכול לראות מידע של אחרים
- [ ] service_role key משמש רק ב-Backend
---
## 🔐 שלב 3: אימות והרשאות (Authentication)
### מה Supabase Auth נותן לך
```
┌─────────────────────────────────────────────────────────────┐
│ Supabase Auth │
├─────────────────────────────────────────────────────────────┤
│ ✅ הרשמה עם Email/Password │
│ ✅ OAuth (Google, GitHub, etc.) │
│ ✅ אימות Email │
│ ✅ שחזור סיסמה │
│ ✅ JWT Tokens אוטומטי │
│ ✅ MFA (Two-Factor Authentication) │
└─────────────────────────────────────────────────────────────┘
```
### הגדרות מומלצות
| הגדרה | המלצה | למה |
|-------|-------|-----|
| **אימות Email** | ✅ כן | מונע חשבונות מזויפים |
| **Password מינימום** | 8+ תווים | מונע סיסמאות חלשות |
| **MFA** | ✅ כן (לפחות אופציונלי) | שכבת הגנה נוספת |
| **Session timeout** | 1-24 שעות | מגביל זמן חשיפה |
| **Rate limiting** | ✅ כן | מונע Brute Force |
### קוד לדוגמה - בדיקת משתמש מחובר
```typescript
// Frontend - React
import { useEffect, useState } from 'react'
import { supabase } from './supabaseClient'
function ProtectedPage() {
const [user, setUser] = useState(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
// בדיקת משתמש נוכחי
supabase.auth.getUser().then(({ data: { user } }) => {
setUser(user)
setLoading(false)
})
// האזנה לשינויים
const { data: { subscription } } = supabase.auth.onAuthStateChange(
(_event, session) => {
setUser(session?.user ?? null)
}
)
return () => subscription.unsubscribe()
}, [])
if (loading) return <div>Loading...</div>
if (!user) return <div>Please log in</div>
return <div>Welcome, {user.email}!</div>
}
```
---
## 🧹 שלב 4: Input Validation (אימות קלט)
### למה זה חשוב?
**מטאפורה:** אתה לא נותן למישהו לכתוב מה שהוא רוצה על הטופס שלך. אם הוא כותב קוד זדוני במקום שם - יש בעיה.
### סוגי התקפות שאימות מונע
| התקפה | מה זה | דוגמה |
|--------|-------|-------|
| **SQL Injection** | הכנסת פקודות SQL | `'; DROP TABLE users; --` |
| **XSS** | הכנסת JavaScript | `<script>alert('hacked')</script>` |
| **Command Injection** | הכנסת פקודות מערכת | `; rm -rf /` |
### כללים בסיסיים
```
✅ תמיד לאמת בצד השרת (Backend)
✅ לעולם לא לסמוך על קלט מהמשתמש
✅ להשתמש ב-Parameterized Queries
✅ לסנן תווים מיוחדים
✅ להגביל אורך קלט
```
### קוד לדוגמה - FastAPI
```python
from pydantic import BaseModel, EmailStr, validator
from fastapi import FastAPI, HTTPException
app = FastAPI()
class UserCreate(BaseModel):
email: EmailStr # מאמת אוטומטית פורמט email
name: str
@validator('name')
def name_must_be_valid(cls, v):
if len(v) < 2 or len(v) > 50:
raise ValueError('Name must be 2-50 characters')
if not v.replace(' ', '').isalpha():
raise ValueError('Name must contain only letters')
return v.strip()
@app.post("/users")
async def create_user(user: UserCreate):
# הקלט כבר מאומת בזכות Pydantic!
# ... יצירת משתמש
return {"message": "User created"}
```
---
## 🔒 שלב 5: HTTPS והצפנה
### HTTPS - חובה!
| ללא HTTPS | עם HTTPS |
|-----------|----------|
| מידע נשלח "גלוי" | מידע מוצפן |
| כל אחד ברשת יכול לקרוא | רק המקבל יכול לקרוא |
| סיסמאות חשופות | סיסמאות מוגנות |
### מה צריך לעשות?
**בהוסטינג מודרני (Vercel, Railway, Supabase) - אוטומטי!**
אבל תוודא:
- [ ] כל הבקשות עוברות ב-HTTPS
- [ ] HTTP מופנה אוטומטית ל-HTTPS
- [ ] TLS 1.2 לפחות (עדיף 1.3)
### הצפנת מידע רגיש
```
┌─────────────────────────────────────────────────────────────┐
│ מה להצפין? │
├─────────────────────────────────────────────────────────────┤
│ ✅ סיסמאות (bcrypt - Supabase עושה אוטומטית) │
│ ✅ מידע רפואי / פיננסי │
│ ✅ מספרי כרטיס אשראי (או השתמש ב-Stripe!) │
│ ✅ מידע אישי רגיש (PII) │
│ │
│ ℹ️ Supabase מצפין אוטומטית את כל ה-DB ב-AES-256 │
└─────────────────────────────────────────────────────────────┘
```
---
## 🤖 שלב 6: אבטחה בעבודה עם AI (Claude Code)
### ⚠️ אזהרה חשובה
> "אם אתה אומר ל-AI לגרום למשהו לעבוד, הוא עלול להסיר את בדיקות האבטחה שמגינות עליך."
> — Bill Harmer, CISO Supabase
### מה AI עלול לעשות בטעות
| הבקשה שלך | מה AI עלול לעשות |
|-----------|------------------|
| "תגרום לזה לעבוד" | להסיר RLS policies |
| "תפשט את הקוד" | להוריד validation |
| "תן לי לראות את כל הנתונים" | לפתוח הכל לציבור |
### כללים לעבודה בטוחה עם AI
```markdown
# ב-CLAUDE.md שלך, הוסף:
## Security Rules - DO NOT BYPASS
- Never disable RLS on any table
- Never expose service_role key in frontend
- Always validate user input
- Never remove authentication checks
- Always use parameterized queries
```
### תבנית פרומפט בטוח
```
בצע את המשימה הבאה תוך שמירה על כל מנגנוני האבטחה הקיימים:
- אל תסיר RLS policies
- אל תחשוף API keys
- שמור על validation קיים
- הוסף הערות על שינויים הקשורים לאבטחה
המשימה: [תיאור המשימה]
```
---
## ✅ צ'קליסט אבטחה מלא
### לפני Production
#### 🔑 Secrets & Keys
- [ ] אין API keys בקוד
- [ ] .env ב-.gitignore
- [ ] service_role key רק ב-Backend
- [ ] יש .env.example (בלי ערכים אמיתיים)
#### 🛡️ Database (Supabase)
- [ ] RLS מופעל על כל טבלה
- [ ] יש policies לכל פעולה
- [ ] בדקתי שמשתמש לא רואה מידע של אחרים
- [ ] Backups מופעלים
#### 🔐 Authentication
- [ ] אימות Email מופעל
- [ ] סיסמאות מינימום 8 תווים
- [ ] Rate limiting על login
- [ ] Session timeout מוגדר
#### 🧹 Input & API
- [ ] כל קלט מאומת ב-Backend
- [ ] אין SQL injection אפשרי
- [ ] Rate limiting על APIs
- [ ] Error messages לא חושפים מידע
#### 🔒 Transport
- [ ] HTTPS בכל מקום
- [ ] אין Mixed Content (HTTP בתוך HTTPS)
#### 📝 Logging & Monitoring
- [ ] לוגים של login failures
- [ ] התראות על פעילות חשודה
- [ ] לא מלוגגים secrets
---
## 🚨 מה לעשות אם נחשפת?
### API Key נחשף
1. **מיד:** סובב (regenerate) את ה-key
2. **בדוק:** לוגים - מה נעשה עם ה-key?
3. **נקה:** הסר מ-Git history (קשה אבל אפשרי)
4. **למד:** איך זה קרה? תקן את התהליך
### חשד לפריצה
1. **השבת** גישות חשודות
2. **בדוק** לוגים
3. **שנה** כל ה-keys והסיסמאות
4. **הודע** למשתמשים אם יש דליפת מידע
---
## 📚 מילון מושגים
| מושג | הסבר פשוט |
|------|-----------|
| **RLS** | שליטה מי רואה איזה שורה בטבלה |
| **JWT** | "כרטיס כניסה" דיגיטלי שמוכיח מי אתה |
| **HTTPS** | תקשורת מוצפנת באינטרנט |
| **API Key** | סיסמה שמזהה את האפליקציה שלך |
| **Injection** | הכנסת קוד זדוני דרך קלט |
| **XSS** | הכנסת JavaScript זדוני לאתר |
| **MFA/2FA** | אימות דו-שלבי (סיסמה + קוד) |
| **Hashing** | הפיכת סיסמה לקוד בלתי הפיך |
| **Encryption** | הצפנה (אפשר לפענח עם מפתח) |
| **Rate Limiting** | הגבלת כמות בקשות |
---
## 🚀 איך להשתמש בי
**אמור לי:**
- "תבדוק אם הקוד שלי מאובטח"
- "איך להגדיר RLS בשביל [תרחיש]?"
- "יש לי API key חשוף, מה לעשות?"
- "תעזור לי לכתוב CLAUDE.md עם כללי אבטחה"
- "מה חסר לי לפני production?"
**אני:**
1. אבדוק את הקוד/ההגדרות
2. אזהה בעיות פוטנציאליות
3. אתן פתרונות ספציפיים עם קוד
4. אסביר בשפה פשוטה למה זה חשוב
---
## 💡 כללי זהב
1. **אבטחה מתחילה בתכנון** - לא מוסיפים בסוף
2. **פחות זה יותר** - פחות הרשאות = פחות סיכון
3. **לעולם לא לסמוך על הלקוח** - תמיד לאמת ב-Backend
4. **Secrets הם secrets** - לא משתפים, לא חושפים
5. **AI לא מבין אבטחה** - תמיד לבדוק קוד שנוצר
6. **כשיש ספק - תשאל** - עדיף להיות בטוח