WordPress REST API korlátozása előnézeti képe

WordPress REST API korlátozása

| Olvasási idő: 3 perc

A WordPress alapértelmezetten bekapcsolt REST API-val érkezik - ez szükséges például ahhoz, hogy a Gutenberg szerkesztő is működjön. Na de mi van akkor, ha ez a REST API egyenesen teher, sőt: adatszivárgást okoz? 

Nemrégen egy weboldalon a következő jelenségre lettem figyelmes: az oldalon (ami egyértelműen WordPresses) egy bejelentkező űrlap fogad, amikor az egyik menüpontra kattintunk: láthatóan a mögötte lévő tartalmat szerették volna elrejteni. Ez azonban csúfos kudarcba fulladt, melyet több tényező együttesen okozott: 

  • a WP nem átfogó ismerete,
  • a megközelítés helytelensége.

Az első pont egyértelmű, a második azonban nem az: miért lenne rossz megközelítés az, hogy a pontos URL-eket és linkeket csak bejelentkezés után mutatjuk meg a felhasználónak? kérdezhetnénk. Azért, mert nem alapozhatunk arra, hogy a felhasználó nem fogja tudni ezeket az URL-eket. Tehát ha a védelmünet teljes mértékben arra alapoznánk, hogy a külső fél nem ismer valamit (security by obscurity), akkor azzal sajnos nagyon rossz lóra tennénk. 

Miért?

Ebben az esetben azért, mert a WordPress ezeket az URL-eket hitelesítés nélkül kiadja a REST API-n keresztül. Próbáljátok ki: ha semmilyen plugin nincs feltéve, ami letiltja a REST API-t, navigáljatok el a következő címre: http://valami.hu/wp-json/wp/v2/pages. Ha minden jól ment, akkor egy viszonylag hosszú szöveget fogsz látni - a "link" kifejezésre keresve meg is találod az adott oldal URL-jét. Tehát ha az adott oldal nincs jelszóval védve, akkor minden további nélkül látni fogod azon a címen a tartalmat is (vagyis erre figyelj, ha ott szeretnél elrejteni valamilyen tartalmat, például oktatási anyagot). 

Sajnos nem jutottak ennél tovább, de eggyel trükkösebb lenne, ha az oldal, ahonnan a különféle szerződések, pályázati kiírások tömörített állományban letölthetők, le lenne védve jelszóval - ekkor egy kicsit tovább kellene kutakodnunk, de nem sokkal: navigálj el a http://valami.hu/wp-json/wp/v2/media címre, és látni fogod az összes feltöltött médiaelemet, minden fontosabb adatával együtt - ideértve a pontos letöltési URL-t is. Ez azt jelenti, hogy ha esetleg fizetős tartalmakat (pl. oktatási anyagok, PDF-ek, sablonok, stb.) a weboldaladról szolgálsz ki, akkor azokat is. Igen, ez gáz

Szóval a hosszú bevezető után tiltsuk le a be nem jelentkezett felhasználóknak a REST API-t, az alábbi kódrészlettel, amit tegyünk az mu-plugins mappában létrehozandó disable-rest-api.php fájlba: 

php
<?php
/*
Plugin Name: Restrict WP REST API to logged in users
Plugin URI: https://gist.github.com/danielbachhuber/8f92af4c6a8db784771c
Description: Restrict WP REST API to logged in users
Version: 1.0
Author: Daniel Bachhuber
Author URI: https://gist.github.com/danielbachhuber/8f92af4c6a8db784771c
License: GPLv3
*/

add_filter( 'rest_authentication_errors', function( $result ) {
    if ( ! empty( $result ) ) {
        return $result;
    }

    if ( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
    }

    return $result;
});

Ennyi, készen is vagyunk: a be nem jelentkezett felhasználóknak 401-es hibakódot és You are not currently logged in. üzenetet ad majd vissza a REST API az oldalunkon - gratulálok, máris tettél az oldalad biztonságáért. 

Megjegyzés: az elterjedt biztonsági pluginokban egy checkbox-al is lehet állítani, hogy a REST API elérhető-e - ebben az esetben erre a snippetre nem lesz szükséged.