A .htaccess fájl a webmesterek svájci bicskája. Néhány egyszerű szabály megadásával oldalunk biztonságosabbá, gyorsabbá és megbízhatóbbá tehető, ezekből gyűjtöttük össze a szerintünk leghasznosabbakat. Természetesen nem kötelező mindegyiket használni és a legtöbbet bizonyos pluginek is alkalmazzák, tehát csak akkor kezdjünk bele a másolgatásba, ha meggyőződtünk róla, hogy a kiválasztott kívánt szabály még nem került hozzáadásra. A biztonsági bővítmények (például az iThemes Security) a legtöbb lenn olvasható trükköt automatikusan hozzáadják a .htaccess fájlhoz, ha a beállításikban bekapcsoljuk a hozzájuk tartozó funkciót.
Azt is ki kell még emelni, hogy a .htaccess fájl csak Apache webszerver esetén létezik, nginx és IIS felhasználóknak sajnos nem fognak működni a kis kódrészletek. Viszont mivel a publikus szerverek közel felén Apache fut, ezért nagy valószínűséggel te is bátran használhatod őket.
Maga a .htaccess fájl alapértelmezetten nem létezik, akkor hozza létre a WordPress (a weboldal gyökérkönyvtárában), amikor egyéni permalinkeket (beszédes URL-eket) állítunk be. Természetesen kézzel is létrehozhatjuk, csak a névre figyeljünk. Fontos a pont is a htaccess elnevezés előtt. Egyes FTP kliensek alapértelmezetten nem mutatják a létező/létrehozott .htaccess fájlt, ennek az oka mindössze annyi, hogy Linux rendszerek alatt a fájl/könyvárnevek előtt szereplő pont karakter felel azért, hogy az a bizonyos fájl vagy könyvtár rejtett legyen. Ilyen esetben a kliensünk beállításaiban engedélyezzük a rejtett fájlok és mappák megjelenítését. A cPanel beépített fájlkezelője sem mutatja alapértelmezetten a rejtett fájlokat és könyvtárakat, itt is nekünk kell engedélyeznünk ezt.
Mielőtt bármit is módosítanánk készítsünk biztonsági másolatot az eredeti .htaccess-ről!
1. A WordPress vezérlőpult megnyitásának IP alapú korlátozása
Ha rendelkezünk statikus IP-vel, akkor megadhatjuk, hogy csak a saját engedélyezett IP címünkről érkező kéréseket szolgálja ki a rendszer, tehát csak mi leszünk képesek megnyitni a vezérlőpultot, minden más IP elutasításra kerül. Itt arra kell ügyelni, hogy ha megváltozik az IP címünk (dinamikus IP), akkor ki is tudjuk zárni magunkat, ezért csak akkor adjunk meg statikus IP, ha biztosak vagyunk benne, hogy ez egy állandó cím. Dinamikus IP esetén megadhatjuk az IP cím kezdetét, ezek általában itt is állandóak. Természetesen ilyen esetben csak arról a gépről fogjuk tudni megnyitni a vezérlőpultot, amelyiknek a címét engedélyeztük, viszont bátran hozzáadhatunk több címet is. A lenti kódban értelemszerűen cseréljük az xx.xx.xx.xxx-et a saját IP-nkre és a végleges kódrészletet másoljuk egy üres .htaccess nevű fájlba és helyezzük el a “wp-admin” könyvtáron belül.
AuthUserFile /dev/null AuthGroupFile /dev/null AuthName "WordPress Vezérlőpult Hozzáférés Korlátozás" AuthType Basic <LIMIT GET> order deny,allow deny from all # engedélyezett otthoni IP cím allow from xx.xx.xx.xxx # engedélyezett munkahelyi IP cím allow from xx.xx.xx.xxx <LIMIT>
2. A WordPress vezérlőpult jelszavas védelme
Nagyon sok hacker és bot célpontja a “wp-admin”, mivel minden WordPress oldal esetében ugyanaz az elérési útja (ezért is érdemes megváltoztatni ezt), ráadásul sokan az alapértelmezett “admin” felhasználónevet használják, így elegendő csak a jelszót találgatni. Sok esetben úgynevezett “brute-force” módszerrel is képesek bejutni, azaz addig próbálgatják a jelszavakat, míg meg nem találják azt, ami helyes. Ennek a megakadályozása érdekében érdemes egy limitet beállítani, így bizonyos hibás bejelentkezési kísérlet után ideiglenesen kitiltásra kerül a felhasználó. Mindezeken túl érdemes lehet még extra jelszóval és névvel védeni a WordPress bejelentkező képernyőjét, erre szolgál a lenti kódrészlet.
Mielőtt nekivágnánk szükséges lesz generálni egy úgynevezett .htpasswd fájlt, ez fogja tartalmazni a felhasználónevet és a titkosított jelszót. A generáláshoz látogassunk el a következő oldalra: .htpasswd generátor Itt adjuk meg a kívánt felhasználónevet és jelszót, majd kattintsunk a “Create .htpasswd file” gombra. Az ezután megjelenő sort másoljuk ki és illesszük be egy általunk létrehozott .htpasswd nevű fájlba. Ezt a fájlt végül helyezzük el egy webszerver által elérhetetlen könyvtárba, tehát ne lehessen megnyitni URL meghívásával. cPanel esetén kerüljön a “public_html”-en kívülre.
Ha eddig eljutottunk, akkor csak létre kell hozni a .htaccess-t a “wp-admin” könyvtárban és be kell illeszteni a lenti kódot. Ne felejtsük el átírni az “AuthUserFile” elérési útját, ide az az útvonal kerül, amin keresztül elérhető a .htpasswd fájl. Ezen kívül adjuk még meg a felhasználónevet is a jelzett helyen.
AuthName "Titkosított részleg" AuthUserFile /home/konyvtar/jelszavak/ AuthGroupFile /dev/null AuthType basic require user felhasznalonev <Files admin-ajax.php> Order allow,deny Allow from all Satisfy any </Files>
3. A fájl/könyvtár listázás kikapcsolása
Ez az egyik olyan módosítás, ami mondhatni kötelező. Ha alapértelmezetten nincs tiltva globálisan a szerver beállításaiban, akkor nekünk kell ezt megtenni a lenti sor bemásolásával. Nélküle az összes index(.html/.php, stb.) nélküli könyvtár tartalmát kilistázza a webszerver, ezáltal mindenki számára felderíthető lesz a tartalmuk. Főként biztonsági problémák miatt kritikus, hogy tiltsuk a listázást ezzel a kóddal:
Options -Indexes
4. PHP fájlok futtatásának tiltása egyes könyvtárakban
Van, ahol egészen egyszerűen nincs értelme engedélyezni a PHP fájlok külső futtatását, ilyen a “wp-content/uploads” könyvtár és a rendszerfájlokat tartalmazó “wp-includes” is. Biztonsági okokból hasznos lépés, ha le is tiltjuk ezt ebben a két mappában, hiszen ezekből csak akkor kerül meghívásra PHP fájl, ha az oldalunkat feltörték és úgynevezett “backdoor” scripteket próbálnak futtatni rendszerfájloknak álcázva.
Hozzunk létre egy üres .htaccess fájlt, másoljuk bele a lenti kódot és helyezzük el a fenti könyvtárakba. A módszer természetesen bárhol másutt is működik, azonban problémákat is okozhatunk vele, ha ész nélkül mindenhová elhelyezzük, így maradjunk csak a fentebb említett mappáknál.
<Files *.php> deny from all </Files>
5. A wp-config.php fájl védelme
A wp-config.php az egyik legfontosabb fájl WordPress oldal esetén, főként azért, mert ez tartalmazza az adatbázis hozzáférési adatait (köztük a jelszót) is érdemes tehát védeni, amennyire csak lehet. A lenti kód megakadályozza az illetéktelen hozzáféréseket ehhez a fájlhoz.
<files wp-config.php> order allow,deny deny from all </files>
6. 301 átirányítások használata
Ha keresőbarát gyors átirányításokra van szükségünk, akkor a 301-es típus az, amit használni fogunk. Ezeket szintén a .htaccess-be írjuk. Használatukra főleg akkor van szükség, ha egy korábbi jól ismert domain vagy URL megváltozott és szeretnénk, ha a régi linkre érkező megtekintések automatikusan az új változatra irányítódnának. Ezzel egy időben az oldalt feltérképező keresőrobot is értesíti a keresőket a változásról és így nem veszítjük el az eddigi pozíciónkat sem a találati listában.
Redirect 301 /regicim/ http://www.oldalad.hu/ujcim Redirect 301 /kategoria/bemutatok/ http://www.oldalad.hu/kategoria/cikkek/
7. IP címek bannolása
Ha egy IP címről túl sok gyanús kérés érkezik, esetleg gyanítjuk, hogy ez az IP támadás alá vette az oldalunkat, akkor egyszerűen ki is tilthatjuk, ha a következő kódot használjuk. Csak cseréljük ki az xxx.xxx.xx.x-et a valódi IP-re.
<Limit GET POST> order allow,deny deny from xxx.xxx.xx.x allow from all </Limit>
8. Képeink megosztásának tiltása (hotlinking)
Ha nem szeretnénk, hogy az oldalunkon található képeket máshová is be tudják illeszteni, akkor tiltsuk ezt le a következő szabály használatával. Erre általában azért van szükség, hogy elejét vegyük a túlzott adatforgalmi használatnak és ezzel egy időben csökkenthető az oldal terhelése is. Kis weblapok esetében nem feltétlenül van értelme a tiltásnak, de egy nagy forgalmú, sok képet tartalmazó portálnál már érzékelhető lehet a változás. A kódrészlet természetesen engedélyezi a képek megtekintését a Google-nek. Ne felejtsük el kicserélni a domaint!
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?wpszaki.hu [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC] RewriteRule \.(jpg|jpeg|png|gif)$ – [NC,F,L]
9. A .htaccess fájl védelme
Ahogy a wp-config.php esetében, úgy itt is fontos, hogy illetéktelen felhasználók ne tudják megnyitni vagy módosítani ezt a fájlt sem. A következő kódsor azért felel, hogy a .htaccess fájl futni tudjon, de olvasni vagy írni ne lehessen.
<files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </files>
10. A maximálisan feltölthető fájlméret megemelése
A .htaccess fájlban arra is van lehetőség, hogy manuálisan megemeljük a maximálisan feltölthető fájlméretet, sajnos azonban ez nem minden tárhelyen és nem minden környezetben működik, viszont egy próbát megér. A példában 64MB-os értéket adunk meg, de ez tetszőlegesen módosítható.
php_value upload_max_filesize 64M php_value post_max_size 64M php_value max_execution_time 300 php_value max_input_time 300
11. Az XML-RPC hozzáférésének letiltása
Az utóbbi időben sokszor került szóba az XML-RPC fájl és sebezhetőségei. A WordPress alapértelmezetten tartalmazza ezt és engedélyezi a használatát, azonban az esetek túlnyomó többségében egyáltalán nincs rá szükség. Néhány bővítmény és egyéb alkalmazás támaszkodik mindössze rá, de az az általánosan elfogadott vélemény, hogy ha nincs rá szükség, akkor érdemes teljesen letiltani. Ez a .htaccess kód blokkolja az erre irányuló kéréseket.
<Files xmlrpc.php> order deny,allow deny from all </Files>
12. A szerzők felhasználónevének begyűjtésére irányuló támadások blokkolása
Elterjedt támadási forma a szerzők felhasználónevének kiderítése, ennek birtokában már könnyedén lehet brute-force támadásokat indítani a névhez tartozó jelszó megfejtésére fókuszálva. Ezt ajánlott tiltani a következő kóddal.
RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} (author=\d+) [NC] RewriteRule .* - [F]
+1 A GZIP tömörítés és a böngésző gyorsítótár bekapcsolása
Egy weboldal sebességének optimalizálása nagyon fontos manapság, ennek az egyik alapköve a gzip tömörítés és a böngésző általi gyorsítótárazás megfelelő beállítása. Ha idáig eljutottál, akkor valószínűleg nem lesz meglepő, hogy mindezek konfigurálása is a .htaccess fájl segítségével történik. A neten nagyon sokféle kódrészlet található ezekre a feladatokra én azonban kicsit csalok és egy jól beállított W3Total Cache bővítmény által generált kódot fogok ajánlani. Ez tartalmaz mindent, amire szükség lehet ahhoz, hogy a lehető legjobb sebességet és pontszámokat érjük el GTMetrix vagy PageSpeed Insights tesztekben (leverage browser caching, gzip compression, stb.). Természetesen ez még önmagában kevés a teljes sebesség optimalizáláshoz, de kiindulásnak tökéletes.
<IfModule mod_mime.c> AddType text/css .css AddType text/x-component .htc AddType application/x-javascript .js AddType application/javascript .js2 AddType text/javascript .js3 AddType text/x-js .js4 AddType text/html .html .htm AddType text/richtext .rtf .rtx AddType image/svg+xml .svg AddType text/plain .txt AddType text/xsd .xsd AddType text/xsl .xsl AddType text/xml .xml AddType video/asf .asf .asx .wax .wmv .wmx AddType video/avi .avi AddType image/bmp .bmp AddType application/java .class AddType video/divx .divx AddType application/msword .doc .docx AddType application/vnd.ms-fontobject .eot AddType application/x-msdownload .exe AddType image/gif .gif AddType application/x-gzip .gz .gzip AddType image/x-icon .ico AddType image/jpeg .jpg .jpeg .jpe AddType image/webp .webp AddType application/json .json AddType application/vnd.ms-access .mdb AddType audio/midi .mid .midi AddType video/quicktime .mov .qt AddType audio/mpeg .mp3 .m4a AddType video/mp4 .mp4 .m4v AddType video/mpeg .mpeg .mpg .mpe AddType application/vnd.ms-project .mpp AddType application/x-font-otf .otf AddType application/vnd.ms-opentype ._otf AddType application/vnd.oasis.opendocument.database .odb AddType application/vnd.oasis.opendocument.chart .odc AddType application/vnd.oasis.opendocument.formula .odf AddType application/vnd.oasis.opendocument.graphics .odg AddType application/vnd.oasis.opendocument.presentation .odp AddType application/vnd.oasis.opendocument.spreadsheet .ods AddType application/vnd.oasis.opendocument.text .odt AddType audio/ogg .ogg AddType application/pdf .pdf AddType image/png .png AddType application/vnd.ms-powerpoint .pot .pps .ppt .pptx AddType audio/x-realaudio .ra .ram AddType image/svg+xml .svg .svgz AddType application/x-shockwave-flash .swf AddType application/x-tar .tar AddType image/tiff .tif .tiff AddType application/x-font-ttf .ttf .ttc AddType application/vnd.ms-opentype ._ttf AddType audio/wav .wav AddType audio/wma .wma AddType application/vnd.ms-write .wri AddType application/font-woff .woff AddType application/font-woff2 .woff2 AddType application/vnd.ms-excel .xla .xls .xlsx .xlt .xlw AddType application/zip .zip </IfModule> <IfModule mod_expires.c> ExpiresActive On ExpiresByType text/css A31536000 ExpiresByType text/x-component A31536000 ExpiresByType application/x-javascript A31536000 ExpiresByType application/javascript A31536000 ExpiresByType text/javascript A31536000 ExpiresByType text/x-js A31536000 ExpiresByType text/html A3600 ExpiresByType text/richtext A3600 ExpiresByType image/svg+xml A3600 ExpiresByType text/plain A3600 ExpiresByType text/xsd A3600 ExpiresByType text/xsl A3600 ExpiresByType text/xml A3600 ExpiresByType video/asf A31536000 ExpiresByType video/avi A31536000 ExpiresByType image/bmp A31536000 ExpiresByType application/java A31536000 ExpiresByType video/divx A31536000 ExpiresByType application/msword A31536000 ExpiresByType application/vnd.ms-fontobject A31536000 ExpiresByType application/x-msdownload A31536000 ExpiresByType image/gif A31536000 ExpiresByType application/x-gzip A31536000 ExpiresByType image/x-icon A31536000 ExpiresByType image/jpeg A31536000 ExpiresByType image/webp A31536000 ExpiresByType application/json A31536000 ExpiresByType application/vnd.ms-access A31536000 ExpiresByType audio/midi A31536000 ExpiresByType video/quicktime A31536000 ExpiresByType audio/mpeg A31536000 ExpiresByType video/mp4 A31536000 ExpiresByType video/mpeg A31536000 ExpiresByType application/vnd.ms-project A31536000 ExpiresByType application/x-font-otf A31536000 ExpiresByType application/vnd.ms-opentype A31536000 ExpiresByType application/vnd.oasis.opendocument.database A31536000 ExpiresByType application/vnd.oasis.opendocument.chart A31536000 ExpiresByType application/vnd.oasis.opendocument.formula A31536000 ExpiresByType application/vnd.oasis.opendocument.graphics A31536000 ExpiresByType application/vnd.oasis.opendocument.presentation A31536000 ExpiresByType application/vnd.oasis.opendocument.spreadsheet A31536000 ExpiresByType application/vnd.oasis.opendocument.text A31536000 ExpiresByType audio/ogg A31536000 ExpiresByType application/pdf A31536000 ExpiresByType image/png A31536000 ExpiresByType application/vnd.ms-powerpoint A31536000 ExpiresByType audio/x-realaudio A31536000 ExpiresByType image/svg+xml A31536000 ExpiresByType application/x-shockwave-flash A31536000 ExpiresByType application/x-tar A31536000 ExpiresByType image/tiff A31536000 ExpiresByType application/x-font-ttf A31536000 ExpiresByType application/vnd.ms-opentype A31536000 ExpiresByType audio/wav A31536000 ExpiresByType audio/wma A31536000 ExpiresByType application/vnd.ms-write A31536000 ExpiresByType application/font-woff A31536000 ExpiresByType application/font-woff2 A31536000 ExpiresByType application/vnd.ms-excel A31536000 ExpiresByType application/zip A31536000 </IfModule> <IfModule mod_deflate.c> <IfModule mod_filter.c> AddOutputFilterByType DEFLATE text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/html text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/bmp application/java application/msword application/vnd.ms-fontobject application/x-msdownload image/x-icon image/webp application/json application/vnd.ms-access application/vnd.ms-project application/x-font-otf application/vnd.ms-opentype application/vnd.oasis.opendocument.database application/vnd.oasis.opendocument.chart application/vnd.oasis.opendocument.formula application/vnd.oasis.opendocument.graphics application/vnd.oasis.opendocument.presentation application/vnd.oasis.opendocument.spreadsheet application/vnd.oasis.opendocument.text audio/ogg application/pdf application/vnd.ms-powerpoint image/svg+xml application/x-shockwave-flash image/tiff application/x-font-ttf application/vnd.ms-opentype audio/wav application/vnd.ms-write application/font-woff application/font-woff2 application/vnd.ms-excel <IfModule mod_mime.c> # DEFLATE by extension AddOutputFilter DEFLATE js css htm html xml </IfModule> </IfModule> </IfModule> <FilesMatch "\.(css|htc|less|js|js2|js3|js4|CSS|HTC|LESS|JS|JS2|JS3|JS4)$"> FileETag MTime Size <IfModule mod_headers.c> Header set Pragma "public" Header append Cache-Control "public" </IfModule> </FilesMatch> <FilesMatch "\.(html|htm|rtf|rtx|svg|txt|xsd|xsl|xml|HTML|HTM|RTF|RTX|SVG|TXT|XSD|XSL|XML)$"> FileETag MTime Size <IfModule mod_headers.c> Header append Vary User-Agent env=!dont-vary Header set Pragma "public" Header append Cache-Control "public" </IfModule> </FilesMatch> <FilesMatch "\.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|webp|json|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|_otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|_ttf|wav|wma|wri|woff|woff2|xla|xls|xlsx|xlt|xlw|zip|ASF|ASX|WAX|WMV|WMX|AVI|BMP|CLASS|DIVX|DOC|DOCX|EOT|EXE|GIF|GZ|GZIP|ICO|JPG|JPEG|JPE|WEBP|JSON|MDB|MID|MIDI|MOV|QT|MP3|M4A|MP4|M4V|MPEG|MPG|MPE|MPP|OTF|_OTF|ODB|ODC|ODF|ODG|ODP|ODS|ODT|OGG|PDF|PNG|POT|PPS|PPT|PPTX|RA|RAM|SVG|SVGZ|SWF|TAR|TIF|TIFF|TTF|TTC|_TTF|WAV|WMA|WRI|WOFF|WOFF2|XLA|XLS|XLSX|XLT|XLW|ZIP)$"> FileETag MTime Size <IfModule mod_headers.c> Header set Pragma "public" Header append Cache-Control "public" </IfModule> </FilesMatch> <FilesMatch "\.(bmp|class|doc|docx|eot|exe|ico|webp|json|mdb|mpp|otf|_otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|pot|pps|ppt|pptx|svg|svgz|swf|tif|tiff|ttf|ttc|_ttf|wav|wri|woff|woff2|xla|xls|xlsx|xlt|xlw|BMP|CLASS|DOC|DOCX|EOT|EXE|ICO|WEBP|JSON|MDB|MPP|OTF|_OTF|ODB|ODC|ODF|ODG|ODP|ODS|ODT|OGG|PDF|POT|PPS|PPT|PPTX|SVG|SVGZ|SWF|TIF|TIFF|TTF|TTC|_TTF|WAV|WRI|WOFF|WOFF2|XLA|XLS|XLSX|XLT|XLW)$"> <IfModule mod_headers.c> Header unset Last-Modified </IfModule> </FilesMatch>