12+1 hasznos .htaccess trükk

[Ezt a cikket 17 perc elolvasni.]

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>
Ha tetszik, mutasd meg másoknak is: