התחבר / הירשם
מדריך מתקדם

אבטחת אתרים - מדריך למפתחים

מדריך מקיף להגנה על אתרים מפני איומים סייבריים

120 דקות קריאה רמת קושי: מתקדם עודכן לאחרונה: מרץ 2024

תוכן עניינים

1 מבוא לאבטחת אתרים

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

מה נלמד במדריך זה:

  • OWASP Top 10 - האיומים הנפוצים ביותר
  • SQL Injection - זיהוי ומניעה
  • Cross-Site Scripting (XSS) - הגנה מפני התקפות
  • Cross-Site Request Forgery (CSRF)
  • אבטחת אימות משתמשים
  • הגנה על נתונים רגישים
  • Security Headers וטכניקות הגנה נוספות

למה אבטחת אתרים חשובה?

אבטחת אתרים חשובה מכמה סיבות:

  • הגנה על נתונים: מניעת גישה לנתונים רגישים
  • אמון המשתמשים: משתמשים צריכים לחוש בטוחים
  • עמידה בתקנות: GDPR, PCI DSS ועוד
  • מוניטין: פריצה יכולה לפגוע במוניטין החברה
  • עלויות: תיקון נזקים עולה יותר ממניעה

2 OWASP Top 10

OWASP Top 10 הוא רשימה של 10 האיומים הנפוצים ביותר באבטחת web. חשוב להכיר אותם ולדעת כיצד למנוע אותם.

OWASP Top 10 2021

רשימת האיומים:

  1. Broken Access Control - בקרת גישה שבורה
  2. Cryptographic Failures - כשלים בהצפנה
  3. Injection - הזרקת קוד
  4. Insecure Design - עיצוב לא בטוח
  5. Security Misconfiguration - הגדרות אבטחה שגויות
  6. Vulnerable Components - רכיבים פגיעים
  7. Authentication Failures - כשלים באימות
  8. Software and Data Integrity Failures - כשלים בשלמות תוכנה ונתונים
  9. Security Logging Failures - כשלים ברישום אבטחה
  10. Server-Side Request Forgery - זיוף בקשות צד שרת

3 SQL Injection

SQL Injection הוא אחד האיומים הנפוצים והמסוכנים ביותר. הוא מאפשר לתוקף להריץ קוד SQL על מסד הנתונים.

דוגמה מסוכנת:

הקוד הבא פגיע ל-SQL Injection:


// קוד פגיע - אל תשתמשו בזה!
$username = $_POST['username'];
$password = $_POST['password'];

$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);
                    

הגנה מפני SQL Injection


// קוד בטוח - השתמשו בזה!
$username = $_POST['username'];
$password = $_POST['password'];

// שימוש ב-Prepared Statements
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
                    

בדיקת קוד לאיתור SQL Injection


// בדיקה בצד הלקוח
function validateInput(input) {
    // הסרת תווים מסוכנים
    const dangerousChars = /['";\\]/g;
    return input.replace(dangerousChars, '');
}

// בדיקה בצד השרת
function sanitizeInput(input) {
    return htmlspecialchars(strip_tags(trim($input)));
}
                    

4 Cross-Site Scripting (XSS)

XSS מאפשר לתוקף להריץ קוד JavaScript בדפדפן של המשתמש. זה יכול לגרום לגניבת עוגיות, הסטת משתמשים ועוד.

סוגי XSS

  • Reflected XSS: הקוד מוחזר מיד מהשרת
  • Stored XSS: הקוד נשמר במסד הנתונים
  • DOM-based XSS: הקוד מופעל בצד הלקוח

דוגמה מסוכנת:



<div>שלום, <?php echo $_GET['name']; ?></div>


                        

הגנה מפני XSS


// הגנה בצד השרת
$name = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
echo "<div>שלום, " . $name . "</div>";

// או שימוש ב-CSP (Content Security Policy)
header("Content-Security-Policy: default-src 'self'");
                    

Content Security Policy (CSP)


<!-- הגדרת CSP ב-HTML -->
<meta http-equiv="Content-Security-Policy" 
      content="default-src 'self'; script-src 'self' 'unsafe-inline';">

<!-- או בשרת -->
<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self';");
?>
                    

5 Cross-Site Request Forgery (CSRF)

CSRF מאפשר לתוקף לבצע פעולות בשם המשתמש המחובר, ללא ידיעתו.

דוגמה להתקפת CSRF


<!-- דף זדוני -->
<img src="https://yoursite.com/transfer?amount=1000&to=attacker" 
     style="display:none;">
                    

הגנה מפני CSRF


// יצירת CSRF Token
session_start();
if (!isset($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// בדיקת Token בטופס
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die('CSRF attack detected!');
}
                    

<!-- הוספת Token לטופס -->
<form method="POST" action="/transfer">
    <input type="hidden" name="csrf_token" 
           value="<?php echo $_SESSION['csrf_token']; ?>">
    <input type="number" name="amount">
    <input type="text" name="to">
    <button type="submit">העברה</button>
</form>
                    

6 אבטחת אימות משתמשים

אימות משתמשים הוא אחד החלקים החשובים ביותר באבטחת אתר.

סיסמאות חזקות


// בדיקת חוזק סיסמה
function validatePassword($password) {
    $errors = [];
    
    if (strlen($password) < 8) {
        $errors[] = "הסיסמה חייבת להיות לפחות 8 תווים";
    }
    
    if (!preg_match('/[A-Z]/', $password)) {
        $errors[] = "הסיסמה חייבת להכיל אות גדולה";
    }
    
    if (!preg_match('/[a-z]/', $password)) {
        $errors[] = "הסיסמה חייבת להכיל אות קטנה";
    }
    
    if (!preg_match('/[0-9]/', $password)) {
        $errors[] = "הסיסמה חייבת להכיל מספר";
    }
    
    if (!preg_match('/[^A-Za-z0-9]/', $password)) {
        $errors[] = "הסיסמה חייבת להכיל תו מיוחד";
    }
    
    return $errors;
}
                    

הצפנת סיסמאות


// הצפנת סיסמה בטוחה
$password = $_POST['password'];
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);

// בדיקת סיסמה
if (password_verify($password, $hashedPassword)) {
    // סיסמה נכונה
}
                    

Rate Limiting


// הגבלת ניסיונות התחברות
function checkLoginAttempts($ip) {
    $attempts = getLoginAttempts($ip);
    
    if ($attempts > 5) {
        $timeout = 15 * 60; // 15 דקות
        if (time() - getLastAttempt($ip) < $timeout) {
            return false; // חסום
        }
    }
    
    return true;
}
                    

7 הגנה על נתונים

הגנה על נתונים רגישים היא קריטית לאבטחת האתר.

הצפנת נתונים


// הצפנת נתונים רגישים
function encryptData($data, $key) {
    $cipher = "aes-256-gcm";
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    
    $encrypted = openssl_encrypt($data, $cipher, $key, 0, $iv, $tag);
    
    return base64_encode($iv . $tag . $encrypted);
}

// פענוח נתונים
function decryptData($encryptedData, $key) {
    $data = base64_decode($encryptedData);
    $cipher = "aes-256-gcm";
    $ivlen = openssl_cipher_iv_length($cipher);
    $taglen = 16;
    
    $iv = substr($data, 0, $ivlen);
    $tag = substr($data, $ivlen, $taglen);
    $encrypted = substr($data, $ivlen + $taglen);
    
    return openssl_decrypt($encrypted, $cipher, $key, 0, $iv, $tag);
}
                    

אחסון בטוח של מפתחות


// שימוש במשתני סביבה
$encryptionKey = getenv('ENCRYPTION_KEY');

// או בקובץ נפרד מחוץ ל-web root
require_once '../config/keys.php';
                    

8 Security Headers

Security Headers הם דרך חשובה להגן על האתר ברמת השרת.

הגדרת Security Headers


// הגדרת Security Headers
header("X-Frame-Options: DENY");
header("X-Content-Type-Options: nosniff");
header("X-XSS-Protection: 1; mode=block");
header("Referrer-Policy: strict-origin-when-cross-origin");
header("Permissions-Policy: geolocation=(), microphone=(), camera=()");

// Content Security Policy
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';");

// HSTS (HTTP Strict Transport Security)
header("Strict-Transport-Security: max-age=31536000; includeSubDomains");
                    

בדיקת אבטחה


# בדיקת Security Headers
curl -I https://yoursite.com

# כלי לבדיקת אבטחה
nmap --script http-security-headers yoursite.com
                    

סיכום המדריך:

במדריך זה למדנו את היסודות של אבטחת אתרים. התחלנו עם OWASP Top 10, עברנו דרך SQL Injection, XSS, CSRF, אימות משתמשים, הגנה על נתונים וסיימנו עם Security Headers.

זכרו: אבטחת אתרים היא תהליך מתמשך. תמיד בדקו את הקוד שלכם, השתמשו בכלים אוטומטיים לבדיקת אבטחה, והישארו מעודכנים עם האיומים החדשים!