חיפוש ]

אבטחת ה-REST API של וורדפרס (מבלי לשבור את האתר)

מערכת ה-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 תשבור את אתר הוורדפרס שלי?
כן, אם תשביתו אותה לחלוטין. עורך הבלוקים (Gutenberg), תוספים רבים וחלקים מממשק הניהול של וורדפרס תלויים ב-REST API. במקום להשבית אותה לגמרי, הגבילו גישה לנקודות קצה ספציפיות או דרשו אימות עבור נקודות קצה רגישות.
האם נקודת הקצה /wp-json/wp/v2/users מסוכנת?
היא חושפת שמות משתמש ומזהי משתמש לכל מי שמבקר בכתובת. למרות שהיא לא חושפת סיסמאות או אימיילים, ידיעת שמות משתמש נותנת לתוקפים נקודת התחלה להתקפות Brute Force ו-Credential Stuffing. הגבלה או הסרה של נקודת קצה זו היא מהדברים הראשונים שכדאי לעשות.
מה הם Application Passwords בוורדפרס?
Application Passwords הוצגו בוורדפרס 5.6 כדרך מובנית לאימות בקשות REST API מכלים חיצוניים. כל סיסמה מקושרת לחשבון משתמש, ניתנת לביטול בנפרד, ולא ניתן להשתמש בה להתחברות לממשק הניהול. הם משתמשים ב-HTTP Basic Auth והם השיטה המומלצת לסקריפטים, אפליקציות מובייל ואינטגרציות צד שלישי.
האם להשתמש ב-current_user_can עם שם תפקיד או הרשאה?
תמיד השתמשו בהרשאות (capabilities), לא בשמות תפקידים. לדוגמה, השתמשו ב-current_user_can('edit_posts') במקום current_user_can('editor'). העברת שם תפקיד ל-current_user_can() אינה אמינה ועלולה לא לעבוד כצפוי. אם צריך לבדוק תפקיד ספציפי, השתמשו ב-in_array('role_name', $user->roles) במקום.
האם צריך לאבטח את ה-REST API אם משתמשים בתוסף אבטחה?
תוספי אבטחה כמו Wordfence או iThemes Security יכולים להגביל גישה ל-REST API, אך ייתכן שהם לא מכסים כל נקודת קצה או תרחיש. שילוב של הגנה ברמת התוסף עם הגבלות ממוקדות ברמת הקוד מספק את רמת האבטחה החזקה ביותר. לכל הפחות, ודאו שנקודת הקצה של המשתמשים אינה נגישה לציבור.
האם ניתן להגביל את ה-REST API באמצעות .htaccess?
טכנית כן, אך זה לא מומלץ. חסימת /wp-json/ ברמת השרת תשבור את עורך הבלוקים וכל תוסף שמשתמש ב-REST API באופן פנימי. הגישות מבוססות PHP המתוארות במדריך זה בטוחות יותר מכיוון שהן יכולות להבחין בין בקשות מאומתות ולא מאומתות ולמקד נקודות קצה ספציפיות.

לסיכום

ה-REST API חיונית לוורדפרס מודרנית, אך אבטחתה חשובה לא פחות. התחילו בהגבלת נקודת הקצה של המשתמשים (אפשרות 2) מכיוון שזו המנוצלת ביותר. לאחר מכן העריכו האם אתם צריכים הגבלות רחבות יותר בהתאם לצרכי האתר.

לאינטגרציות חיצוניות, השתמשו ב-Application Passwords במקום לשתף את הסיסמה הראשית. ואל תשכחו לחסום גם Author Enumeration דרך /?author=N.

למבט רחב יותר על אבטחת וורדפרס, קראו את המדריך שלנו לחיזוק אבטחת וורדפרס. תוכלו גם להוסיף Security Headers להגנה נוספת על האתר.

דיון ותגובות
0 תגובות  ]

השאירו תגובה

הוסיפו קוד באמצעות הכפתורים מטה. למשל, בכדי להוסיף PHP לחצו על הכפתור PHP והוסיפו את הקוד בתוך השורטקוד. מצאתם שגיאה בפוסט? עדכנו אותנו...

Savvy WordPress Development official logo