מדריך מקיף להגנה על אתרים מפני איומים סייבריים
אבטחת אתרים היא אחד הנושאים החשובים ביותר בפיתוח web. עם העלייה באיומים הסייבריים, חשוב שכל מפתח יכיר את הסכנות וידע כיצד להגן על האתרים שלו.
אבטחת אתרים חשובה מכמה סיבות:
OWASP Top 10 הוא רשימה של 10 האיומים הנפוצים ביותר באבטחת web. חשוב להכיר אותם ולדעת כיצד למנוע אותם.
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);
// קוד בטוח - השתמשו בזה!
$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();
// בדיקה בצד הלקוח
function validateInput(input) {
// הסרת תווים מסוכנים
const dangerousChars = /['";\\]/g;
return input.replace(dangerousChars, '');
}
// בדיקה בצד השרת
function sanitizeInput(input) {
return htmlspecialchars(strip_tags(trim($input)));
}
XSS מאפשר לתוקף להריץ קוד JavaScript בדפדפן של המשתמש. זה יכול לגרום לגניבת עוגיות, הסטת משתמשים ועוד.
<div>שלום, <?php echo $_GET['name']; ?></div>
// הגנה בצד השרת
$name = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
echo "<div>שלום, " . $name . "</div>";
// או שימוש ב-CSP (Content Security Policy)
header("Content-Security-Policy: default-src 'self'");
<!-- הגדרת 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';");
?>
CSRF מאפשר לתוקף לבצע פעולות בשם המשתמש המחובר, ללא ידיעתו.
<!-- דף זדוני -->
<img src="https://yoursite.com/transfer?amount=1000&to=attacker"
style="display:none;">
// יצירת 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>
אימות משתמשים הוא אחד החלקים החשובים ביותר באבטחת אתר.
// בדיקת חוזק סיסמה
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)) {
// סיסמה נכונה
}
// הגבלת ניסיונות התחברות
function checkLoginAttempts($ip) {
$attempts = getLoginAttempts($ip);
if ($attempts > 5) {
$timeout = 15 * 60; // 15 דקות
if (time() - getLastAttempt($ip) < $timeout) {
return false; // חסום
}
}
return true;
}
הגנה על נתונים רגישים היא קריטית לאבטחת האתר.
// הצפנת נתונים רגישים
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';
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.
זכרו: אבטחת אתרים היא תהליך מתמשך. תמיד בדקו את הקוד שלכם, השתמשו בכלים אוטומטיים לבדיקת אבטחה, והישארו מעודכנים עם האיומים החדשים!