Az is_admin() megtévesztő

Azzal ellentétben, amit a neve sugall, az is_admin() függvénnyel nem azt ellenőrizzük, hogy adminisztrátóri jogosultsággal rendelkezik-e a felhasználó, hanem hogy admin-oldali kérés-e a jelenlegi. Kezdő és nem annyira kezdő fejlesztők időnként eltévesztik, és ez a hiba rendszerint komoly biztonsági rést hoz létre az oldalakon.

Külön ki is van emelve a WordPress dokumentációjában, hogy mire NEM való az is_admin(): nem azt nézi, adminisztrátor-e a felhasználó. Ezzel a funkcióval azt ellenőrizhetjük, hogy a jelenlegi kérés egy, a /wp-admin/ könyvtár alá eső admin oldalra irányul-e.

A probléma az, hogy egy WordPress webhelyen általában van olyan /wp-admin/ URL, ami nem bejelentkezett látogatók számára is elérhető, és ott az is_admin() igaz értéket ad vissza mindenkinek – ilyen például a gyakran használt /wp-admin/admin-ajax.php fájl.

Ha a plugin (vagy sablon) az is_admin()-t tévesen arra használja, hogy ellenőrizze a felhasználó jogosultságát mielőtt érzékeny műveletet hajt végre, akkor azt a műveletet gyakorlatilag bárki végre tudja majd hajtani.

Ehhez hasonló fejlesztői hiba, amikor az admin_init hookon meghívott funkcióba nem raknak jogosultságot ellenőrző funkciót, azt gondolva, hogy az admin_init csak adminisztrátor felhasználóknak fog lefutni – ez nem így van, az admin-ajax.php lefuttatja az admin_init-et a mezei látogatóknak is.

Ezek a tévedések gyakoriak és nagy gondokat tudnak okozni: több példa is volt rá, hogy ezt kihasználva támadtak tömegesen WP site-okat, mivel olykor többszázezer aktív telepítéssel rendelkező bővítményeknél is előfordul ez a hiba.

A WordPress fejlesztői közösségében egy időben folytak viták arról, át kéne-e nevezni az is_admin()-t, pl. in_admin()-ra, ami jobban kifejezné, mit is csinál a funkció. Ezeket az ötleteket végül elvetették.

Jegyezzük meg:

A felhasználó jogosultságának az ellenőrzéséhez az is_user_logged_in() és current_user_can() függvényeket kell használni.


A Szerzőről
Piller Balázs senior webfejlesztő, SEO specialista, és a WordPress szakértője. Számos sikeres projektben vett részt vezető fejlesztőként. Az általa írt kód jelenleg több mint 1 000 000 webhelyen fut.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük