אקסטרה הגנה עבור חולשת אבטחה ב-REST API
מערכת ה-REST API של WordPress (wp-json) היא רכיב מובנה המאפשר תקשורת בין האתר לשירותים חיצוניים. היא מספקת גישה לנתונים כמו פוסטים, משתמשים, קטגוריות, תגובות ועוד. למרות שזהו כלי חיוני לפיתוח, הוא עלול להוות סיכון אבטחה משמעותי אם אינו מנוהל כראוי.
תוכן העניינים
מה הבעיה בזה?
ברירת המחדל של WordPress מאפשרת לכל משתמש לגשת לכתובות API מסוימות, גם ללא הרשאות מיוחדות. לדוגמה הגישה אל:
- עלול לחשוף רשימת משתמשים, כולל שמות משתמשים (מטרה נוחה להתקפות Brute Force).
- עלול לספק מידע פנימי על מבנה האתר.
הסיכונים העיקריים:
- דליפת מידע על משתמשים – תוקפים יכולים לקבל את שמות המשתמשים ולבצע Brute Force לניחוש סיסמאות על משתמשים.
- חשיפת מבנה האתר – מידע על קטגוריות, תגיות, פוסטים ותגובות עשוי להועיל לתוקף בניסיון לזהות פרצות נוספות.
- פישינג והנדסה חברתית – מידע שנחשף יכול לשמש להתחזות ולתקוף משתמשים רשומים.

איך להגן על האתר שלך?
- חסימת גישה למשתמשים לא מחוברים – למנוע חשיפת נתונים לכל גולש.
- הגבלת גישה לסוגי מידע רגישים – לדוגמה, חסימת
wp-json/wp/v2/users. - שימוש בפלאגינים לאבטחה – כמו "Disable WP REST API".
- הגבלת גישה ב-.htaccess או Nginx – חסימת גישה כללית או לפי IP.
הפתרון הטוב ביותר תלוי בצרכים. אם רוצים רק לחסום גישה למידע רגיש, חוקים ב-.htaccess או סינון Endpoints הם אופציה טובה. אם רוצים פתרון רחב יותר – עדיף להשתמש בקוד ב-functions.php או פלאגין ייעודי.
חסימת גישה ל-wp-json למשתמשים לא מורשים
הפתרון הראשון הוא להוסיף קוד לקובץ functions.php של ה-Theme הפעיל כדי למנוע גישה למשתמשים שאינם מחוברים:
function disable_rest_api_for_guests( $access ) {
if (!is_user_logged_in()) {
return new WP_Error( 'rest_cannot_access', __( 'REST API restricted for unauthenticated users.' ), array( 'status' => 403 ) );
}
return $access;
}
add_filter( 'rest_authentication_errors', 'disable_rest_api_for_guests' );חסימת גישה ישירה לסוגי נתונים מסוימים
כדי למנוע גישה לרשימת המשתמשים, ניתן לחסום בקשות ל-/wp-json/wp/v2/users באמצעות הקוד הבא:
function disable_rest_endpoints( $endpoints ) {
if ( isset( $endpoints['/wp/v2/users'] ) ) {
unset( $endpoints['/wp/v2/users'] );
}
return $endpoints;
}
add_filter( 'rest_endpoints', 'disable_rest_endpoints' );
חסימה באמצעות .htaccess
ניתן לחסום גישה ל-REST API ישירות דרך קובץ .htaccess (אם השרת שלך מבוסס Apache ויש לך גישה לקובץ ב-FTP):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/wp-json/wp/v2/users [NC,OR]
RewriteCond %{REQUEST_URI} ^/wp-json/wp/v2/categories [NC]
RewriteRule .* - [F]
</IfModule>קוד מלא להוספה ל-functions.php
הנה קוד PHP שתוכל להוסיף לקובץ functions.php של ה-Theme הפעיל שלך, והוא יבטל את הגישה ל-REST API למשתמשים שאינם מחוברים ויחסום גישה לרשימת המשתמשים ולרשימת הקטגוריות:
// חסימת גישה למשתמשים שאינם מחוברים
function disable_rest_api_for_guests( $access ) {
if ( !is_user_logged_in() ) {
return new WP_Error( 'rest_cannot_access', __( 'REST API is restricted to authenticated users only.' ), array( 'status' => 403 ) );
}
return $access;
}
add_filter( 'rest_authentication_errors', 'disable_rest_api_for_guests' );
// חסימת גישה לרשימת המשתמשים
function disable_rest_users_endpoint( $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;
}
add_filter( 'rest_endpoints', 'disable_rest_users_endpoint' );
// חסימת גישה לרשימת הקטגוריות למשתמשים לא מחוברים
function restrict_rest_categories_endpoint( $endpoints ) {
if ( !is_user_logged_in() ) {
if ( isset( $endpoints['/wp/v2/categories'] ) ) {
unset( $endpoints['/wp/v2/categories'] );
}
}
return $endpoints;
}
add_filter( 'rest_endpoints', 'restrict_rest_categories_endpoint' );
אזורים נוספים שעלולים להיות מנוצלים על ידי תוקפים
ב-WordPress יש אזורים נוספים ב-REST API (wp-json) שיכולים להיות מנוצלים על ידי תוקפים אם הם לא מוגנים כראוי. להלן חלק מהאזורים הרגישים ביותר:
שליפת פוסטים ודפים
הגישה אל
מאפשרת:
- מאפשר גישה לתוכן הפוסטים, גם אם הם טיוטות או פרטיים.
- תוקפים יכולים להשתמש בנתונים לזיהוי תוכן רגיש שטרם פורסם.
- תוקף יכול להשתמש במידע כדי לשכפל את האתר או לבצע Scrap-ing.
חשיפת תגובות באתר
הגישה אל
מאפשרת:
- ניתן לגשת לתגובות ולראות פרטי משתמשים שהגיבו באתר.
- תוקפים יכולים לנצל זאת לצורך הונאות פישינג או ספאם ממוקד.
שליפת מידע על תוספים ותבניות
/wp-json/wp/v2/plugins
- תוקפים יכולים לבדוק אילו תוספים ותבניות פעילים, ולמצוא חולשות אבטחה בתוספים ישנים או פגיעים.
- משמש לתקיפות ממוקדות נגד גרסאות ישנות של WordPress ותוספים לא מעודכנים.
איך לחסום את האזורים הפגיעים?
הקוד הבא ב-functions.php חוסם גישה לנתיבים רגישים ב-REST:
function restrict_sensitive_rest_api( $endpoints ) {
if ( !is_user_logged_in() ) {
// חסימת תגובות
unset( $endpoints['/wp/v2/comments'] );
// חסימת מידע על תבניות ותוספים
unset( $endpoints['/wp/v2/themes'] );
unset( $endpoints['/wp/v2/plugins'] );
}
return $endpoints;
}
add_filter( 'rest_endpoints', 'restrict_sensitive_rest_api' );
פתרונות נוספים לאבטחת REST API
חסימת גישה ל-REST API לחלוטין למשתמשים לא מחוברים:
function disable_rest_api_for_guests( $access ) {
if ( !is_user_logged_in() ) {
return new WP_Error( 'rest_cannot_access', __( 'REST API restricted for authenticated users only.' ), array( 'status' => 403 ) );
}
return $access;
}
add_filter( 'rest_authentication_errors', 'disable_rest_api_for_guests' );
הגבלת גישה לפי IP עם .htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/wp-json/wp/v2/users [NC,OR]
RewriteCond %{REQUEST_URI} ^/wp-json/wp/v2/categories [NC,OR]
RewriteCond %{REQUEST_URI} ^/wp-json/wp/v2/comments [NC]
RewriteRule .* - [F]
</IfModule>
הסבר על פקודות RewriteCond ב-.htaccess
בפקודות RewriteCond של Apache mod_rewrite, האותיות NC ו-OR הן דגלים (Flags) שמשפיעים על ההתנהגות של התנאים.
הסבר של הדגלים:
NC(No Case) – התעלמות מגודל אותיות- גורם לכלל להיות case-insensitive, כלומר, לא משנה אם ה-URL מכיל אותיות גדולות או קטנות.
- לדוגמה,
/WP-JSON/WP/V2/USERSייחסם בדיוק כמו/wp-json/wp/v2/users.
OR(Logical OR) – תנאי "או"- משמש לקישור בין תנאים שונים כך שאם אחד מהם מתקיים, הכלל יופעל.
- במקרה שלנו, התנאי יתממש אם הבקשה מכילה
/wp-json/wp/v2/usersאו/wp-json/wp/v2/categories. - שימו לב שבשורה האחרונה אין
OR, כי זה התנאי האחרון בשרשרת.
סיכום
🚨 ה-REST API של WordPress עלול לחשוף מידע רגיש אם אינו מנוהל כראוי.
🔒 מומלץ להגביל גישה רק למשתמשים מחוברים, ולחסום גישה לנקודות קצה רגישות כמו משתמשים, קטגוריות, תגובות ותוספים.
⚙ שימוש בקוד מותאם או בתוספים ייעודיים יכול למנוע דליפות מידע והתקפות זדוניות.
💡 המלצה: בדוק אם האתר שלך באמת זקוק ל-REST פתוח. אם לא – חסום אותו!