frissítve: 2022. 05. 15.
Olvasási idő: 4 perc
Plugout

WordPress REST API korlátozása

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:

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.