PHP fájlok védelme .htaccess-szel
Adott az alábbi felállás:
#apache rewriteunk a következő: /minta => /modules/mod_minta.php /minta/1 => /modules/mod_minta.php?q=1 ## ki hogy vitelezi ki, teljesen lényegtelen, nézzen ki pl így: RewriteRule ^minta(/.*)?$ /modules/mod_minta.php?q=$1 [QSA,L] ## $_GET['q'] feldolgozása phpban történik
Tehát a http://example.com/minta url hívásakor valójában a http://example.com/modules/mod_minta.php hívódik meg és hasonlóan a http://example.com/minta/1 esetén a http://example.com/modules/mod_minta.php?q=1
Tiltsuk le a következő linket: http://example.com/modules/mod_minta.php?q=1. Tehát a címsorba közvetlenül írva adjon valami hibát, de semmiképpen se futtassa le a mod_minta.php-t.
Több lehetőség van:
A modul(ok) elejére beírkáljuk:
if(eregi('mod_minta.php', $_SERVER['REQUEST_URI'])) {
header('HTTP/1.0 403 Forbidden');
exit;
}
Egyszerű, és ronda megoldás. Minden mod_minta.php meghíváskor lefut, az esetek 99.9999%-ában feleslegesen.
Sokkal szebb megoldás a következő kettő…
- Adjunk rá 404-es hibát:
RewriteCond %{THE_REQUEST} ^(GET|HEAD|POST)\ /modules/mod_minta\.php ## a mod_404.php kezeli a 404-et, ki hitte volna, ezt korábban már rewriteoltuk RewriteCond %{REQUEST_URI} !^/modules/mod_404\.php$ RewriteRule $ /404 [L]Ebben az esetben csak a mod_404.php-t tudja elérni közvetlenül, más nem. Ezt az egyet engedni kell, mert különben végtelen rekurzióba fut az apache. Ilyenkor a címsor nem változik, nincs redirect.
- Dobjuk rá a 404-es oldalra
RewriteCond %{THE_REQUEST} ^(GET|HEAD|POST)\ /modules/mod_minta\.php RewriteRule $ /404 [R=301,L]Itt redirect lesz, ebben az esetben semmilyen file nem érhető el közvetlenül.
A kiprobált környezetben minden url rewriteolva van, tehát közvetlenül egy php file sincs meghívva. Ebben az esetben a két megoldás valamelyikét javasolt a rule-ok legvégére tenni, mert csak akkor jut el idáig a feldolgozás, ha korábban egy szabály sem illeszkedett. Ha ez sem illeszkedik akkor sima 404 a végeredmény.
A 404 megfejtése nagyon egyszerű:
ErrorDocument 404 /404 ###### ###### ###### RewriteRule ^404$ /modules/mod_404.php [QSA,L]
Kiegészítve a RewriteCond-ot:
RewriteCond %{THE_REQUEST} ^(GET|HEAD|POST)\ /modules/mod_.+\.php
Tehát az összes mod_-dal kezdődő php file közvetlen elérésének a tiltása ilyen.
