Hogyan növelheted tovább WordPress oldalad biztonságát egyedi kódrészletekkel?

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. 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.

  11. 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.

  12. 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!