Az online világban a WordPress oldalak folyamatos célpontjai a különféle támadásoknak, legyen szó brute force támadásokról, rosszindulatú kód feltöltéséről, vagy éppen adatlopásról. Bár számos népszerű biztonsági bővítmény létezik, ezekhez a támadók is könnyedén hozzáférhetnek, így könnyebben kikerülhetik azok védelmét. Éppen ezért érdemes egyedi kódrészletekkel is növelni az oldal biztonságát. Habár 100%-os védelem nem létezik, a megfelelő intézkedésekkel jelentősen csökkenthetjük a sebezhetőségeket, és nagyobb eséllyel akadályozhatjuk meg a támadásokat.
Ebben a cikkben olyan praktikus, egyedi kódmegoldásokat mutatunk be, amelyekkel megvédheted a WordPress oldaladat a különféle támadásoktól, és megerősítheted a védekezési rendszert a hagyományos biztonsági bővítményeken túl. Ha a te célod is egy biztonságosabb webhely, olvass tovább!
Fájlszerkesztés tiltása
Az első kódrészlet célja, hogy megakadályozza a WordPress adminisztrátorokat (vagy bárkit, aki hozzáfér az admin felülethez), hogy közvetlenül szerkeszthessék a téma- és bővítményfájlokat az admin felületen keresztül.
// Tiltás a fájlszerkesztésre a WordPress admin felületén
define( 'DISALLOW_FILE_EDIT', true );
Ez a kód letiltja a WordPress fájlszerkesztő funkcióját, amely alapértelmezés szerint lehetőséget ad arra, hogy az adminisztrátorok közvetlenül a WordPress vezérlőpulton keresztül módosítsák a téma- és bővítményfájlokat. Az admin felület bal oldali menüjében található "Megjelenés" (Appearance) és "Bővítmények" (Plugins) menüpont alatt normál esetben elérhető a fájlszerkesztő opció, amely lehetővé teszi a PHP, CSS, és JavaScript fájlok szerkesztését.
Ez a funkció azonban biztonsági kockázatot jelenthet, ha valaki jogosulatlanul hozzáfér az adminisztrátori fiókhoz, mert könnyen rosszindulatú kódot illeszthet be ezekbe a fájlokba.
Ezt a kódrészletet a WordPress oldalunk wp-config.php fájljába kell bemásolni.
Amint hozzáadod ezt a kódot, a WordPress admin felületen eltűnnek a fájlszerkesztő menüpontok. Tehát sem a "Megjelenés" (Appearance) menüben lévő "Szerkesztő" (Editor), sem a "Bővítmények" (Plugins) menüben lévő "Bővítményszerkesztő" (Plugin Editor) nem lesz elérhető.
Bejelentkezési kísérletek korlátozása
Az alábbi kódrészlet célja, hogy korlátozza a felhasználók bejelentkezési kísérleteit a WordPress webhelyeden. Ha valaki háromszor (vagy más előre beállított számú alkalommal) hibásan próbálkozik a bejelentkezéssel, ideiglenesen blokkolhatod őt. Ez a módszer jelentősen csökkenti a brute force támadások esélyét, amelyek során a támadók folyamatosan próbálnak különféle felhasználónevekkel és jelszavakkal hozzáférni az admin felülethez.
// Bejelentkezési próbálkozások cookie alapján történő számlálása
function limit_login_attempts_via_cookie() {
// Ellenőrizzük, hogy létezik-e a login_attempts cookie
if (isset($_COOKIE['login_attempts']) && $_COOKIE['login_attempts'] >= 3) {
wp_die('Túllépted a bejelentkezési próbálkozások számát. Kérlek, próbáld újra később.');
}
}
add_action('login_form', 'limit_login_attempts_via_cookie');
// Sikertelen bejelentkezési próbálkozások cookie alapú számlálása
function increment_login_attempts_via_cookie() {
if (isset($_COOKIE['login_attempts'])) {
$login_attempts = $_COOKIE['login_attempts'] + 1;
} else {
$login_attempts = 1;
}
// 20 percig érvényes cookie beállítása
setcookie('login_attempts', $login_attempts, time() + 1200, COOKIEPATH, COOKIE_DOMAIN, false, true);
}
add_action('wp_login_failed', 'increment_login_attempts_via_cookie');
// Sikeres bejelentkezés esetén próbálkozások nullázása
function reset_login_attempts_via_cookie() {
// Töröljük a cookie-t sikeres bejelentkezés után
setcookie('login_attempts', 0, time() - 3600, COOKIEPATH, COOKIE_DOMAIN, false, true);
}
add_action('wp_login', 'reset_login_attempts_via_cookie', 10, 2);
Ez a kódrészlet cookie-k segítségével számolja a sikertelen bejelentkezési próbálkozásokat. Minden hibás bejelentkezés után a login_attempts cookie növekszik, és ha három sikertelen próbálkozás történik, a rendszer megakadályozza a további bejelentkezéseket. A cookie 20 percig érvényes, utána újra lehet próbálkozni. Sikeres bejelentkezés esetén a cookie automatikusan törlődik, így újraindul a számlálás.
Természetesen ez egy nagyon egyszerű megoldás, és emellett lehet még session alapú vagy IP-cím alapú módszereket is alkalmazni, amelyek szintén hatékonyak lehetnek.
Felhasználói lekérdezés (User Enumeration) megakadályozása
A felhasználói lekérdezés (user enumeration) egy gyakori módszer a támadók részéről, amely során megpróbálják kideríteni az oldal felhasználóinak nevét, hogy később ezeket használva brute force támadást indítsanak a bejelentkezési felületen. Ez a kódrészlet megakadályozza, hogy a nem bejelentkezett vagy nem megfelelő jogosultságokkal rendelkező felhasználók hozzáférjenek a felhasználói listához a WordPress REST API-n keresztül.
/**
* Prevent user enumeration
*/
function restrict_user_rest_api_access() {
if (isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '/wp-json/wp/v2/users') !== false) {
// Check if the user is logged in and has the 'edit_posts' capability
if (!is_user_logged_in() || !current_user_can('edit_posts')) {
// If the user does not have the required capability, return an error
wp_die('You are not allowed to access this part of the site');
}
}
}
add_action('init', 'restrict_user_rest_api_access');
A WordPress REST API-n keresztül az /wp-json/wp/v2/users útvonalon bármely felhasználó képes lehet hozzáférni a webhelyen található összes felhasználó nevéhez és egyéb adataihoz. A kódrészlet figyeli ezt az útvonalat, és letiltja azokat a hozzáféréseket, amelyekhez a felhasználónak nincs megfelelő jogosultsága.
Ha egy felhasználó el akarja érni a /wp-json/wp/v2/users URL-t, a kód először ellenőrzi, hogy az adott felhasználó be van-e jelentkezve, és hogy rendelkezik-e a szükséges jogosultsággal (például a "szerkesztés" joggal, ami a current_user_can('edit_posts') ellenőrzésen alapul).
Ha a felhasználó nincs bejelentkezve, vagy nincs megfelelő jogosultsága (pl. nem admin vagy szerkesztő), akkor az oldal egy hibaüzenettel leállítja a további hozzáférést: „You are not allowed to access this part of the site” (Nem férhet hozzá az oldal ezen részéhez).
Ha valaki próbál hozzáférni a felhasználói listához jogosultság nélkül, a rendszer azonnal megszakítja az eljárást a wp_die() függvény segítségével. Ez egy WordPress által használt beépített funkció, amely hibaüzenetet ad és leállítja a folyamatot.
A kódrészletet hozzá kell adnod az aktív téma functions.php fájljához. Ez a fájl a következő helyen található:
wp-content/themes/sajat-tema/functions.php.
Ha más jogosultságokat szeretnél ellenőrizni (pl. csak admin felhasználóknak engednéd meg a hozzáférést), akkor módosíthatod a current_user_can('edit_posts') részt:
if (!is_user_logged_in() || !current_user_can('manage_options')) {
A manage_options csak az adminisztrátorok számára teszi elérhetővé a hozzáférést.
WordPress verziószám eltávolítása a fejlécből
Ez a kódrészlet célja, hogy eltávolítsa a WordPress verziószámát a webhely forráskódjából. A WordPress alapértelmezés szerint megjeleníti az oldal forrásában a verziószámát, ami biztonsági kockázatot jelenthet, mivel a támadók könnyen kideríthetik, hogy a webhely mely verzióját használja, és célzottan kihasználhatják az ismert sebezhetőségeket.
// WordPress verziószám eltávolítása
remove_action('wp_head', 'wp_generator');
A WordPress alapértelmezés szerint a weboldal HTML forráskódjában megjeleníti a használt verziószámot. Ez az információ elérhető a <meta name="generator"> címkében. A remove_action('wp_head', 'wp_generator') kódrészlet ezt a verziószámot eltávolítja a webhelyed forráskódjából, így azt a látogatók és potenciális támadók nem láthatják.
A kódrészletet hozzá kell adnod az aktív téma functions.php fájljához. Ez a fájl a következő helyen található:
wp-content/themes/sajat-tema/functions.php.
XML-RPC letiltása a WordPress-ben
Ez a kódrészlet célja, hogy letiltsa a WordPress XML-RPC funkcióját, amelyet a támadók gyakran kihasználnak brute force támadások és DDoS (Distributed Denial of Service) támadások során. Az XML-RPC-t eredetileg arra tervezték, hogy lehetővé tegye külső alkalmazások számára a WordPresshez való csatlakozást, például a mobil alkalmazások vagy a távoli bejegyzésírás használatát, de ha nincs rá szükséged, érdemes letiltani.
// XML-RPC letiltása
add_filter( 'xmlrpc_enabled', '__return_false' );
A kódrészletet hozzá kell adnod az aktív téma functions.php fájljához. Ez a fájl a következő helyen található:
wp-content/themes/sajat-tema/functions.php.
Ezenkívül még a .htaccess fájlhoz hozzá kell adni az alábbi részt:
# XML-RPC teljes letiltása
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Az XML-RPC-hez való hozzáférést megpróbáló kérések automatikusan vissza lesznek utasítva. Tehát ha valaki vagy valamilyen eszköz megpróbál csatlakozni a webhelyedhez az XML-RPC-n keresztül, az nem fog sikerülni.
Ha Nginx szervert használsz, a .htaccess nem működik, mert az Nginx nem támogatja ezt a fájlt. Ebben az esetben az Nginx konfigurációban kell letiltani az XML-RPC-t.
location = /xmlrpc.php {
deny all;
}
Ezután indítsd újra az Nginx szervert, hogy az új beállítások érvénybe lépjenek.
A wp-config.php és a .htaccess fájlokhoz való hozzáférés blokkolása
Ez a kódrészlet kifejezetten két kritikus WordPress fájl védelmét célozza: a wp-config.php és a .htaccess. Ezek a fájlok alapvető szerepet játszanak a WordPress működésében és biztonságában, és rendkívül fontos megvédeni őket. Habár ezekhez a fájlokhoz alapértelmezetten a szerverbeállítások miatt nem lehet közvetlenül hozzáférni a böngészőből, ez a kódrészlet extra védelmet nyújt, ha valamilyen konfigurációs hiba miatt mégis lehetővé válna a hozzáférés.
// Hozzáférés blokkolása a wp-config.php fájlhoz
function block_wpconfig_access() {
if ( preg_match('/wp-config.php/', $_SERVER['REQUEST_URI']) ) {
wp_die( 'Hozzáférés megtagadva.' );
}
}
add_action('init', 'block_wpconfig_access');
// Hozzáférés blokkolása a .htaccess fájlhoz
function block_htaccess_access() {
if ( preg_match('/\.htaccess/', $_SERVER['REQUEST_URI']) ) {
wp_die( 'Hozzáférés megtagadva.' );
}
}
add_action('init', 'block_htaccess_access');
A wp-config.php fájl tartalmazza az oldal legfontosabb beállításait, beleértve az adatbázis hitelesítő adatait (adatbázis neve, felhasználónév, jelszó), valamint az egyéb fontos konfigurációkat.
A kódrészlet figyeli a webhely URL-jét, és ha valaki közvetlenül megpróbálja elérni a wp-config.php fájlt (például böngészőn keresztül), a rendszer azonnal megszakítja a folyamatot és egy „Hozzáférés megtagadva” üzenetet jelenít meg.
A .htaccess fájl elsősorban a szerver konfigurációs beállításokat tartalmazza, például az átirányításokat, és szabályozza, hogy milyen fájlokhoz lehet hozzáférni a böngészőn keresztül. Ez a fájl is kritikus, és védelmet igényel.
A kódrészlet hasonlóan működik, mint a wp-config.php fájlnál: ellenőrzi, hogy valaki megpróbálja-e közvetlenül elérni a .htaccess fájlt. Ha igen, azonnal megszakítja a hozzáférést és egy hibaüzenetet küld.
A kódrészletet hozzá kell adnod az aktív téma functions.php fájljához. Ez a fájl a következő helyen található:
wp-content/themes/sajat-tema/functions.php.
Azok számára, akik Apache szervert használnak, a .htaccess fájlban közvetlenül is blokkolhatják a wp-config.php fájl elérését, például az alábbi kóddal:
<Files wp-config.php>
Order Allow,Deny
Deny from all
</Files>
Fájltípusok feltöltésének korlátozása WordPress-ben
Ennek a kódrészletnek célja, hogy megakadályozza bizonyos fájltípusok – konkrétan PHP, JavaScript (JS), és CSS fájlok – feltöltését a WordPress webhelyre. Ezek a fájlok potenciálisan veszélyesek lehetnek, mert támadók rosszindulatú kódot rejthetnek bennük. Mivel a wp-content/uploads könyvtárba bárki, aki jogosultságot kap, képes fájlokat feltölteni, érdemes korlátozni, hogy milyen típusú fájlokat lehet feltölteni.
// A feltölthető fájltípusok korlátozása
function restrict_mime_types( $mimes ) {
// A PHP, JS és CSS fájlok feltöltésének letiltása
unset( $mimes['php'] );
unset( $mimes['js'] );
unset( $mimes['css'] );
return $mimes;
}
add_filter( 'upload_mimes', 'restrict_mime_types' );
A WordPress alapértelmezés szerint lehetővé teszi különböző fájltípusok feltöltését, de ez a kódrészlet kifejezetten megakadályozza, hogy PHP, JS és CSS fájlokat lehessen feltölteni a webhelyre. Az unset() függvény segítségével eltávolítjuk a PHP, JS és CSS fájlok MIME típusait a WordPress engedélyezett feltöltési listájából, így a felhasználók ezeket a fájlokat nem tudják feltölteni.
A WordPress minden feltöltéskor ellenőrzi a fájlok MIME típusát (pl. a fájl kiterjesztését és tartalmát). Ha a fájl típusát eltávolítjuk az engedélyezett listából, a feltöltés sikertelen lesz.
A restrict_mime_types() függvényben a PHP (php), JavaScript (js), és CSS (css) fájlok MIME típusait töröljük, így ezek a fájlok többé nem tölthetők fel.
A kódrészletet hozzá kell adnod az aktív téma functions.php fájljához. Ez a fájl a következő helyen található:
wp-content/themes/sajat-tema/functions.php.
Ha más fájltípusokat is le szeretnél tiltani, egyszerűen hozzáadhatod azokat a kódhoz. Például, ha SVG fájlokat is tiltani szeretnél:
unset( $mimes['svg'] );
PHP futtatás letiltása a wp-content/uploads könyvtárban
Ha valamilyen módon mégis felkerül egy php fájl az uploads könyvtárba, letilthatjuk ezen fájlok futtatását. Az alábbi kóddal megakadályozhatod a PHP fájlok végrehajtását az uploads könyvtárban, ami egy gyakori támadási célpont.
# PHP futtatás letiltása az uploads mappában
<FilesMatch "\.php$">
Order Deny,Allow
Deny from all
</FilesMatch>
Ez a kódrészlet ellenőrzi az összes fájlt a megadott könyvtárban (jelen esetben a wp-content/uploads könyvtárban), és ha PHP fájlt talál, megakadályozza annak futtatását.
A FilesMatch "\.php$" parancs specifikusan a .php kiterjesztésű fájlokat célozza meg.
Az Order Deny,Allow sor a fájlok hozzáférési szabályait állítja be. Az Deny from all utasítással az összes PHP fájl futtatását megtiltjuk a könyvtárban.
Ezt a kódrészletet nem a functions.php fájlba kell tenni, hanem egy .htaccess fájlba, amely az Apache webszerver számára tartalmaz konfigurációs szabályokat.
Nyisd meg az FTP kliensedet, és menj a WordPress wp-content/uploads könyvtárába. Ha nincs ott .htaccess fájl, hozz létre egyet, ha már létezik, nyisd meg szerkesztésre és másold be a kódrészletet.
Mentés után érdemes tesztelni, hogy megfelelően működik-e. Próbálj feltölteni egy PHP fájlt az uploads könyvtárba (például egy üres fájlt test.php néven), és próbáld meg elérni azt a böngészőből (pl. http://sajat-oldal.com/wp-content/uploads/test.php). Ha a kód megfelelően működik, egy hozzáférés megtagadva üzenetet vagy 403 hibát fogsz kapni.
Az .htaccess fájl Apache webszervereken működik. Ha Nginx szervert használsz, ennek a funkciónak a beállításához a szerver konfigurációját kell módosítani.
Rosszindulatú fájlok (PHP, JS, CSS) automatikus törlése feltöltéskor WordPress-ben
Ennek a kódrészletnek a célja, hogy automatikusan törölje a PHP, JavaScript (JS), vagy CSS fájlokat, ha valaki ezeket megpróbálná feltölteni a WordPress médiatárba.
A kódrészlet azonnal és automatikusan törli a nem engedélyezett fájlokat a feltöltés során.
// Automatikusan törli a PHP, JS vagy CSS fájlokat, ha feltöltik
function remove_malicious_files( $file ) {
$filetype = wp_check_filetype( $file['name'] );
$disallowed_types = array( 'php', 'js', 'css' );
// Ellenőrzi, hogy a fájltípus tiltott-e
if ( in_array( $filetype['ext'], $disallowed_types ) ) {
// Ha a fájltípus tiltott, törli a fájlt
@unlink( $file['tmp_name'] );
return new WP_Error( 'disallowed_file_type', __( 'Ez a fájltípus nem engedélyezett.' ) );
}
return $file;
}
add_filter( 'wp_handle_upload_prefilter', 'remove_malicious_files' );
A kódrészlet azonnal ellenőrzi a fájl típusát a feltöltés pillanatában. Ha a fájl kiterjesztése .php, .js, vagy .css, a rendszer automatikusan törli azt a szerver ideiglenes fájlrendszeréből, mielőtt a fájl befejezné a feltöltést.
Az @unlink( $file['tmp_name'] ) parancs törli a feltöltött fájlt a szerverről.
Ha egy felhasználó megpróbálja feltölteni valamelyik tiltott fájltípust (PHP, JS, CSS), a feltöltési folyamat megszakad, és egy hibaüzenetet kap: „Ez a fájltípus nem engedélyezett.” Ez biztosítja, hogy a felhasználó tudja, hogy miért hiúsult meg a feltöltés.
A wp_check_filetype() függvény segítségével a kódrészlet ellenőrzi a fájl kiterjesztését (például .php, .js, vagy .css). Ha a feltöltött fájl kiterjesztése megegyezik a tiltott típusokkal, a rendszer megszakítja a feltöltést.
A kódrészletet hozzá kell adnod az aktív téma functions.php fájljához. Ez a fájl a következő helyen található:
wp-content/themes/sajat-tema/functions.php.
Ha más fájltípusokat is szeretnél tiltani, bővítheted a disallowed_types tömböt a kívánt fájltípusok kiterjesztésével. Például ha SVG fájlokat is tiltani szeretnél, így adhatod hozzá:
$disallowed_types = array( 'php', 'js', 'css', 'svg' );
További tippek a WordPress oldal biztonságának növeléséhez
-
Adatbázis tábla előtag (prefix) megváltoztatása: Alapértelmezés szerint a WordPress adatbázis táblái a wp_ előtagot használják, amit sok támadó célzottan keres. A telepítéskor vagy utólagos beállítással érdemes egyedi előtagot használni, például mywp_, hogy megnehezítsd a támadások sikerét.
-
Bonyolult adatbázis jelszó használata: Az adatbázis hozzáféréséhez használt jelszó legyen hosszú, összetett, és tartalmazzon számokat, kis- és nagybetűket, valamint speciális karaktereket. Ez segít megelőzni a brute force támadásokat.
-
Admin felhasználónév módosítása: Sose használd az "admin" felhasználónevet, mert ez a támadók által leggyakrabban célzott felhasználónév. Használj egyedi felhasználónevet a fiókod számára, hogy még nehezebb legyen a támadások sikere.
-
Bonyolult admin jelszó használata: Az adminisztrátori fiókod jelszava legyen bonyolult, minimum 12-15 karakter hosszú, tartalmazzon kis- és nagybetűket, számokat és speciális karaktereket. A jelszó gyakori módosítása további biztonságot ad.
-
Child theme használata: Ha módosítod a WordPress sablonod fájljait, érdemes child theme-t használni. Ezzel megőrizheted a módosításaidat, és elkerülheted, hogy egy frissítés felülírja azokat.
-
WP-admin elérési út módosítása: Az alapértelmezett /wp-admin bejelentkezési URL könnyen megtalálható, így érdemes egyedi URL-re változtatni. Ezzel csökkentheted annak esélyét, hogy a támadók könnyen megtalálják a belépési felületet.
-
Kétfaktoros hitelesítés (2FA): Használj kétfaktoros hitelesítést a bejelentkezési folyamatnál. Ez azt jelenti, hogy a jelszó megadása után egy második azonosítási lépésre is szükség lesz, például egy SMS-ben kapott kódra, ami jelentősen növeli a biztonságot.
-
SSL tanúsítvány használata: Az SSL tanúsítvány biztosítja, hogy a webhelyed és a látogatók közötti adatforgalom titkosított legyen. Ezzel megakadályozhatod az adatlopást, különösen a bejelentkezési felületeken.
-
Rendszeres biztonsági mentés készítése: Készíts rendszeresen teljes biztonsági mentést az oldaladról, beleértve az adatbázist és a fájlokat is. Így bármilyen támadás vagy rendszerhiba esetén vissza tudod állítani az oldalad.
-
Automatikus frissítések bekapcsolása: Kapcsold be a WordPress, a bővítmények és a sablonok automatikus frissítését. Ezzel biztosíthatod, hogy mindig a legfrissebb, biztonságos verziókat használd.
-
CloudFlare használata: A CloudFlare egy ingyenes és prémium szolgáltatásokat is kínáló tartalomelosztó hálózat (CDN), amely többek között webhelyed biztonságát is növeli. A CloudFlare védi az oldalad DDoS támadások ellen, gyorsítja a weboldal betöltését, és tűzfal szabályokat állíthatsz be, amelyekkel blokkolhatod a gyanús IP-címeket.
-
Nem használt bővítmények és sablonok törlése: Érdemes minden olyan bővítményt és sablont törölni, amelyet már nem használsz. Még akkor is, ha ezek inaktívak, potenciálisan sebezhetőséget jelenthetnek, különösen, ha nem frissítik őket rendszeresen. Az eltávolításukkal csökkented a támadási felületeket és biztosítod, hogy csak a szükséges és frissített elemek maradnak az oldaladon.
Befejezés
A WordPress biztonságának megerősítése nemcsak a bővítmények telepítéséről szól, hanem az egyedi kódolási megoldások alkalmazásáról is. Bár nincs 100%-os védelem, az általunk bemutatott kódrészletek segítenek minimalizálni a támadási felületeket és megnehezíteni a rosszindulatú felhasználók dolgát. Legyen szó a fájltípusok korlátozásáról, a kritikus fájlok védelméről vagy a nem kívánt feltöltések automatikus törléséről, ezek a megoldások egy újabb védelmi réteget adnak a webhelyed biztonságához. Továbbra is fontos azonban, hogy mindig frissítsd a WordPress-t, a bővítményeket és a sablonokat, hiszen a rendszeres karbantartás és biztonsági javítások kulcsfontosságúak a webhely hosszú távú védelme érdekében.
Szólj hozzá a cikkhez
Be kell jelentkezned komment írásához.
Még nem írtak kommentet ehhez a cikkhez!