מערכת ה-REST API של וורדפרס היא תכונה חזקה שמאפשרת למפתחים לתקשר עם נתוני האתר בצורה תכנותית. למרות שהיא שימושית עבור Headless WordPress, אפליקציות מותאמות וקריאות AJAX – היא גם עלולה לחשוף מידע רגיש אם לא מאובטחת כראוי.
כברירת מחדל, ה-REST API מאפשרת למשתמשים לא מזוהים גישה למגוון נקודות קצה (endpoints), כולל פרטים על משתמשים, פוסטים וטקסונומיות.
בפוסט זה נעבור על כמה שיטות בטוחות לאבטחת ה-REST API מבלי לשבש פונקציונליות ליבה או תוספים שתלויים בה.
למה חשוב לאבטח את ה-REST API?
חלק מנקודות הקצה ב-API חושפות מידע שיכול לשמש תוקפים לאיסוף נתונים או להתקפות. לדוגמה:
/wp-json/wp/v2/users– מציג את כל המשתמשים הרשומים, כולל שמות משתמש ומזהי משתמש/wp-json/wp/v2/posts– ציבורי כברירת מחדל, חושף תוכן פוסטים ומטא-דאטה/?author=1– מפנה לארכיון המחבר וחושף את שם המשתמש בכתובת ה-URL
אבטחת נקודות קצה אלו עוזרת למנוע התקפות Brute Force, Credential Stuffing, פישינג וגניבת תוכן.
אל תשביתו את ה-REST API לחלוטין. תכונות ליבה של וורדפרס כמו עורך הבלוקים (Gutenberg), תוספים רבים וממשק הניהול עצמו תלויים בה. השבתה מלאה תשבור את האתר. במקום זאת, הגבילו גישה לנקודות קצה ספציפיות או דרשו אימות היכן שצריך.
אפשרות 1: הגבלת גישה רק למשתמשים מחוברים
באפשרותכם לדרוש אימות עבור כל בקשות ה-REST API על ידי הוספת הקוד הבא לקובץ functions.php של התבנית או לתוסף מותאם:
add_filter('rest_authentication_errors', function($result) {
if (true === $result || is_wp_error($result)) {
return $result;
}
if (!is_user_logged_in()) {
return new WP_Error(
'rest_not_logged_in',
'עליכם להיות מחוברים כדי לגשת ל-REST API.',
array('status' => 401)
);
}
return $result;
});שימו לב לבדיקה true === $result || is_wp_error($result) בתחילת הפונקציה. זה מוודא שאם מנגנון אימות אחר כבר אישר או דחה את הבקשה, לא נדרוס אותו.
גישה זו חוסמת כל גישה לא מאומתת ל-REST API, כולל קריאות AJAX ציבוריות מצד הלקוח. השתמשו בה רק אם האתר שלכם לא מסתמך על נקודות קצה ציבוריות.
אפשרות 2: הגבלת נקודות קצה מסוימות בלבד
אם ברצונכם לחסום רק נקודות קצה מסוימות (כמו רשימת המשתמשים) תוך שמירה על יתר ה-API פעיל, השתמשו בגישה ממוקדת יותר:
add_filter('rest_endpoints', function($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[d]+)'])) {
unset($endpoints['/wp/v2/users/(?P<id>[d]+)']);
}
return $endpoints;
});קוד זה מסיר הן את נקודת הקצה של רשימת המשתמשים והן את נקודות הקצה של משתמשים בודדים. עורך הבלוקים ותכונות ליבה אחרות ימשיכו לעבוד כרגיל מכיוון שהם לא תלויים בגישה ציבורית לנתוני משתמשים.
אפשרות 3: חסימת REST API למשתמשים ללא הרשאות עריכה
באפשרותכם להגביל גישה ל-REST API על בסיס הרשאות. לדוגמה, לאפשר גישה רק לעורכים ומנהלים:
add_filter('rest_authentication_errors', function($result) {
if (true === $result || is_wp_error($result)) {
return $result;
}
if (!is_user_logged_in()) {
return new WP_Error(
'rest_not_logged_in',
'נדרש אימות.',
array('status' => 401)
);
}
if (!current_user_can('edit_posts')) {
return new WP_Error(
'rest_forbidden',
'אין לכם הרשאה לגשת ל-REST API.',
array('status' => 403)
);
}
return $result;
});קוד זה בודק את ההרשאה edit_posts, שאין למנויים ולתורמים. שימוש בהרשאות (capabilities) ולא בשמות תפקידים הוא הגישה הנכונה – current_user_can('subscriber') בודק שם תפקיד ולא הרשאה, ועלול לא לעבוד באופן אמין.
אפשרות 4: הסתרת מידע רגיש מהציבור
במקום לחסום את נקודת הקצה לחלוטין, באפשרותכם לסנן שדות רגישים מתוך תגובת ה-API:
add_filter('rest_prepare_user', function($response, $user, $request) {
if (!current_user_can('list_users')) {
$data = $response->get_data();
unset($data['slug']);
unset($data['link']);
$response->set_data($data);
}
return $response;
}, 10, 3);קוד זה מסיר את ה-slug (שם המשתמש) ואת ה-link (כתובת ארכיון המחבר) מהתגובה עבור משתמשים שאין להם הרשאת list_users. נקודת הקצה עדיין עובדת, אך המידע הרגיש ביותר מוסתר.
אפשרות 5: שימוש ב-Application Passwords לגישה חיצונית
החל מוורדפרס 5.6, Application Passwords מספקים דרך מובנית לאימות בקשות REST API מכלים חיצוניים, סקריפטים או אפליקציות מובייל.
כל Application Password מקושר לחשבון משתמש ספציפי, ניתן לביטול בנפרד, ולא ניתן להשתמש בו להתחברות לממשק הניהול. זה הופך אותו לבטוח יותר משיתוף הסיסמה הראשית עם שירותים חיצוניים.
ליצירת אחד, גשו ל-משתמשים > הפרופיל שלכם וגללו לקטע "Application Passwords". תנו שם תיאורי (למשל "סקריפט פריסה" או "אפליקציית מובייל") ושמרו את הסיסמה שנוצרה מיד – היא לא תוצג שוב.
בקשות חיצוניות מתאמתות באמצעות HTTP Basic Auth עם שם המשתמש בוורדפרס וה-Application Password.
אפשרות 6: שימוש בתוסף אבטחה
תוספים כמו Wordfence, iThemes Security או Disable REST API מאפשרים לכם לשלוט על הגישה ל-API באמצעות ממשק פשוט – בלי לכתוב קוד. כלים אלו מספקים שליטה מדויקת לפי תפקיד משתמש או סוג תוכן.
לרוב האתרים, שילוב של הגבלות ברמת הקוד (אפשרויות 1-4) עם תוסף אבטחה מספק את ההגנה החזקה ביותר.
אל תשכחו את Author Enumeration
הגבלת נקודת הקצה של המשתמשים ב-REST API חשובה, אך זו לא הדרך היחידה בה תוקפים מגלים שמות משתמש. וורדפרס גם חושפת שמות משתמש דרך כתובות ארכיון המחבר.
ביקור ב-/?author=1 מפנה ל-/author/admin/ וחושף את שם המשתמש. כדי לחסום זאת, הוסיפו את הקוד הבא לקובץ functions.php של התבנית:
add_action('template_redirect', function() {
if (is_author()) {
wp_redirect(home_url('/'), 301);
exit;
}
});קוד זה מפנה את כל בקשות ארכיון המחבר לדף הבית. אם האתר שלכם משתמש בארכיוני מחבר למטרות לגיטימיות, תוכלו להגביל זאת רק למשתמשים לא מחוברים.
בדיקת רמת האבטחה של ה-API
לאחר ביצוע השינויים, ודאו שהם עובדים כראוי. בדקו את הכתובות הבאות כשאתם מנותקים מהמערכת:
https://yoursite.com/wp-json/– לצפייה בכל המסלולים הזמיניםhttps://yoursite.com/wp-json/wp/v2/users– לבדוק אם נתוני משתמשים חשופיםhttps://yoursite.com/?author=1– לבדוק אם Author Enumeration עובד
השתמשו בכלים כמו Postman או בלשונית הרשת (Network) של כלי המפתחים בדפדפן כדי לבדוק את כותרות התגובה והגוף. ודאו שנקודות קצה מוגבלות מחזירות קוד סטטוס 401 או 403 במקום נתוני משתמשים.
לאחר מכן התחברו וודאו שממשק הניהול, עורך הבלוקים וכל תוסף שמשתמש ב-REST API עדיין פועלים כראוי.
שאלות נפוצות
שאלות נפוצות בנושא אבטחת ה-REST API של וורדפרס:
לסיכום
ה-REST API חיונית לוורדפרס מודרנית, אך אבטחתה חשובה לא פחות. התחילו בהגבלת נקודת הקצה של המשתמשים (אפשרות 2) מכיוון שזו המנוצלת ביותר. לאחר מכן העריכו האם אתם צריכים הגבלות רחבות יותר בהתאם לצרכי האתר.
לאינטגרציות חיצוניות, השתמשו ב-Application Passwords במקום לשתף את הסיסמה הראשית. ואל תשכחו לחסום גם Author Enumeration דרך /?author=N.
למבט רחב יותר על אבטחת וורדפרס, קראו את המדריך שלנו לחיזוק אבטחת וורדפרס. תוכלו גם להוסיף Security Headers להגנה נוספת על האתר.

