Reguli mod_rewrite aplicate global

Pe unul din serverle pe care le gestionez am avut nevoie sa implementez o restrictie pentru comentarii din moment ce niciunul din siteuri nu urma sa accepte comentarii. Cum vorbim de peste 170 de siteuri de WordPress aveam urmatoarele posibilitati:

  • Sa dezactivez comentariile pe fiecare site in parte folosind pluginuri gen Disable Comments (asta presupunea login in fiecare admin de WordPress, cautat si instalat plugin si apoi configurat)
  • Sa scriu un script in PHP prin care sa execut o comanda SQL folosind parola de root pe toate bazele de date si sa dezactivez comentariile via MySQL (toate bazele de date au table prefix generat aleatoriu pentru ca din motive de securitate nu folosesc “wp_” si astfel trebuia intai sa obtin o lista cu toate bazele de date si sa le pun intr-un array impreuna cu table prefixul, iar pentru fiecare in parte trebuia sa execut cele 4 comenzi asociind baza de date cu table prefixul)
  • Sa editez fiecare fisier .htaccess in parte si sa bag liniile cu copy/paste (munca de chinez)
  • Sa bag liniile in httpd.conf si apoi sa editez fiecare fisier .htaccess in parte si sa adaug RewriteOptions Inherit (munca de chinez)
  • Sa fac un script in PHP, Perl sau bash prin care sa adaug in .htaccess liniile de care aveam nevoie folosind o bucla conditionala (destul de usor de facut, insa ineficient in cazul in care se adauga siteuri noi, ca si restul exemplelor de altfel)

De asemenea puteam sa modific templateul folosit la generarea de vhosturi si sa includ liniile de care aveam nevoie acolo in tagul <Directory>, dar daca n-am facut asta de la bun inceput sa o fac acum e util doar pentru siteurile ce se vor adauga pe viitor nu si pentru cele gata adaugate unde trebuia sa aplic vreuna din metodele enumerate mai sus.

Sau nu pentru ca in loc sa irosesc timpul incercand sa aplic niste metode pe care le stiam deja m-am apucat sa caut pe Google o solutie alternativa, convins fiind ca ea si exista.

Asa am ajuns pe StackOverflow de unde am aflat ca incepand cu versiunea 2.4.8 Apache suporta functia RewriteOptions InheritDown, o functie ce impune un set de conditii si reguli de mod_rewrite recursiv si astfel permite definirea unui set de conditii si reguli global pentru mod_rewrite. Am incercat functia respectiva si n-a mers pentru ca aparent trebuie definit directorul radacina inainte de invocarea ei lucru pe care l-am aflat de pe un mailing list.

Astfel, daca toate siteurile sunt in /home (cPanel si vestaCP) sau /var/sentora/hostdata (Sentora) sau de ce nu in /var/www (fara panou de control) atunci directorul radacina trebuie definit cu tagul <Directory> in felul urmator:

<Directory /home>
RewriteOptions InheritDown
………….
</Directory>

Desigur trebuie sa inlocuiti punctele de suspensie cu regulile si conditiile pe care vreti sa le invocati. In cazul meu a fost vorba de o restrictie pe wp-comments-post.php si a aratat astfel:

<Directory /home>
     <IfModule mod_rewrite.c>
           RewriteEngine On
           RewriteOptions InheritDown
           ErrorDocument 503 “Commenting disabled”
           RewriteCond %{REQUEST_URI} ^/wp-comments-post.php$
           RewriteRule .* – [R=503,L]
     </IfModule>
</Directory>

Folosind metoda asta (mai ales daca vindeti gazduire sau gazduiti gratis siteurile unor prieteni) puteti sa adaugati si reguli care sa protejeze siteurile de atacuri XSS:

RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ index_error.php [F,L]
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* – [F]

sau reguli care sa blocheze orice tentativa de spoof a Googlebot (o sa blocheze si Googlebot daca aveti Cloudflare, dar n-aveti mod_rpaf sau mod_cloudflare active):

RewriteCond %{HTTP_USER_AGENT} .*Googlebot.*
RewriteCond %{REMOTE_ADDR} !66\.249\.
RewriteRule .* – [F]

sa blocheze cereri facute cu user-agent gol (de obicei spam sau atacuri):

RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule ^(.*)$ – [F,L]

sa blocheze cereri facute via proxy (folosite in combinatie cu un reverse proxy sau anumite CDN-uri poate sa blocheze si traficul legitim):

RewriteCond %{HTTP:VIA} !^$ [OR]
RewriteCond %{HTTP:FORWARDED} !^$ [OR]
RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR]
RewriteCond %{HTTP:PROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR]
RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$
RewriteRule ^(.*)$ – [F]

si de ce nu sa blocheze unele dintre cele mai comune atacuri (chiar daca nu aveti timthumb sau revslider nimic n-o sa opreasca zombii din botneturi sa va atace pentru ca la atacuri nu exista niciun fel de selectivitate):

RewriteCond %{REQUEST_URI} (mssqlil|register).php [NC,OR]
RewriteCond %{REQUEST_URI} (img|thumb|thumb_editor|thumbopen).php [NC,OR]
RewriteCond %{QUERY_STRING} (img|thumb|thumb_editor|thumbopen).php [NC,OR]
RewriteCond %{REQUEST_URI} revslider [NC,OR]
RewriteCond %{QUERY_STRING} revslider [NC]
RewriteRule .* – [F,L]

Desigur lista poate sa continue cu o sumedenie de exemple, insa din punct de vedere al securitatii astea de mai sus sunt cele mai importante.

PS: Daca sunteti pe shared hosting si aveti o gramada de domenii adaugate, metoda asta functioneaza la fel atat timp cat adaugati codul intr-un .htaccess din documentul radacina.

Daca ati ajuns pana aici si nu stiti ce-i Apache atunci o sa aflati din poza de mai jos:

indians-67540

Lunarpages Internet Solutions

Add a Comment

Your email address will not be published. Required fields are marked *