WordPress beveiligen kun je doen met behulp van plugins. Zo zijn er plugins voor beveiligingsvragen toevoegen aan je WordPress login scherm, plugins voor je WordPress login pagina verplaatsen of verbergen, en niet te vergeten WordPress firewall plugins om je site te beschermen tegen o.a. DDoS aanvallen en brute force aanvallen. Maar WordPress beveiligen is ook mogelijk zonder dit soort security plugins. In dit artikel leggen we uit hoe je je WordPress site beveiligen kunt door een aantal snippets aan je WordPress bestanden toe te voegen.
WordPress beveiligen, zonder de plugins
Voor je aan de slag gaat met het aanpassen van je WordPress bestanden willen we je nog even op het hart drukken om altijd eerst een volledige backup van je website te maken. Als je dan per ongeluk iets fout doet, kun je je website namelijk altijd weer herstellen.
#1. Bescherm je .htaccess bestand
Je .htaccess bestand is één van de belangrijkste WordPress bestanden. Met onderstaande snippet kun je dit bestand beveiligen.
# Protect .htaccess <files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </files>
#2. Bescherm je wp-config.php bestand
Ook je wp-config.php bestand is heel belangrijk. Deze kun je beveiligen door onderstaande snippet in je .htaccess bestand te zetten.
# Protect wp-config.php <files wp-config.php> order allow,deny deny from all </files>
#3. Bescherm je error_log bestand
Met deze snippet zorg je dat hackers geen toegang krijgen tot error logs.
# Protect error_log <files error_log> order allow,deny deny from all </files>
#4. Bescherm je WordPress website tegen SQL Injecties
Deze snippet biedt bescherming tegen SQL Injecties.
# Protect from SQL Injection Options +FollowSymLinks RewriteEngine On RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2}) RewriteRule ^(.*)$ index.php [F,L]
#5. Voorkom dat anderen je foto’s hotlinken
WordPress beveiligen betekent ook je afbeeldingen beveiligen. Als anderen jouw afbeeldingen ‘hotlinken,’ krijgt jouw host extra veel dataverkeer. Dat is dus in feite diefstal van jouw bandbreedte! Om dit te voorkomen kun je onderstaande snippet gebruiken. Vergeet niet om de voorbeeld URL aan te passen.
# Disable hotlinking of images RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC] RewriteRule \.(jpg|jpeg|png|gif)$ – [NC,F,L]
#6. Beperk directe toegang tot de PHP bestanden van je plugins en thema’s
Deze snippet zorgt ervoor dat PHP bestanden niet direct toegankelijk zijn.
# Restrict Direct Access to Plugin and Theme PHP files RewriteCond %{REQUEST_URI} !^/wp-content/plugins/file/to/exclude\.php RewriteCond %{REQUEST_URI} !^/wp-content/plugins/directory/to/exclude/ RewriteRule wp-content/plugins/(.*\.php)$ - [R=404,L] RewriteCond %{REQUEST_URI} !^/wp-content/themes/file/to/exclude\.php RewriteCond %{REQUEST_URI} !^/wp-content/themes/directory/to/exclude/ RewriteRule wp-content/themes/(.*\.php)$ - [R=404,L]
#7. Beveilig het wp-includes directory
Hiermee kun je de wp-includes map beveiligen.
# Protect Include-Only files <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule>
#8. Laat mensen niet door je directories browsen
Met deze snippet zorg je dat mensen niet in je mappenstructuur kunnen snuffelen.
# Disable directory browsing Options All -Indexes
#9. Blokkeer WordPress XMLRPC verzoeken
Als je deze functie niet gebruikt, is het aan te raden het te blokkeren.
# Block WordPress xmlrpc.php requests <Files xmlrpc.php> order deny,allow deny from all </Files>
#10. Voeg je eigen firewall toe
Deze 6G firewall/blacklist is ontwikkeld door PerishablePress en biedt misschien nog wel betere bescherming dan de meeste WordPress security plugins.
# 6G FIREWALL/BLACKLIST # @ https://perishablepress.com/6g/ # 6G:[QUERY STRINGS] <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} (eval\() [NC,OR] RewriteCond %{QUERY_STRING} (127\.0\.0\.1) [NC,OR] RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR] RewriteCond %{QUERY_STRING} (javascript:)(.*)(;) [NC,OR] RewriteCond %{QUERY_STRING} (base64_encode)(.*)(\() [NC,OR] RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC,OR] RewriteCond %{QUERY_STRING} (<|%3C)(.*)script(.*)(>|%3) [NC,OR] RewriteCond %{QUERY_STRING} (\\|\.\.\.|\.\./|~|`|<|>|\|) [NC,OR] RewriteCond %{QUERY_STRING} (boot\.ini|etc/passwd|self/environ) [NC,OR] RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumb)?)\.php [NC,OR] RewriteCond %{QUERY_STRING} (\'|\")(.*)(drop|insert|md5|select|union) [NC] RewriteRule .* - [F] </IfModule> # 6G:[REQUEST METHOD] <IfModule mod_rewrite.c> RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|put|trace|track) [NC] RewriteRule .* - [F] </IfModule> # 6G:[REFERRERS] <IfModule mod_rewrite.c> RewriteCond %{HTTP_REFERER} ([a-z0-9]{2000,}) [NC,OR] RewriteCond %{HTTP_REFERER} (semalt.com|todaperfeita) [NC] RewriteRule .* - [F] </IfModule> # 6G:[REQUEST STRINGS] <IfModule mod_alias.c> RedirectMatch 403 (?i)([a-z0-9]{2000,}) RedirectMatch 403 (?i)(https?|ftp|php):/ RedirectMatch 403 (?i)(base64_encode)(.*)(\() RedirectMatch 403 (?i)(=\\\'|=\\%27|/\\\'/?)\. RedirectMatch 403 (?i)/(\$(\&)?|\*|\"|\.|,|&|&?)/?$ RedirectMatch 403 (?i)(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\"\\\") RedirectMatch 403 (?i)(~|`|<|>|:|;|,|%|\\|\s|\{|\}|\[|\]|\|) RedirectMatch 403 (?i)/(=|\$&|_mm|cgi-|etc/passwd|muieblack) RedirectMatch 403 (?i)(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ) RedirectMatch 403 (?i)\.(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$ RedirectMatch 403 (?i)/(^$|(wp-)?config|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell)\.php </IfModule> # 6G:[USER AGENTS] <IfModule mod_setenvif.c> SetEnvIfNoCase User-Agent ([a-z0-9]{2000,}) bad_bot SetEnvIfNoCase User-Agent (archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune) bad_bot # Apache < 2.3 <IfModule !mod_authz_core.c> Order Allow,Deny Allow from all Deny from env=bad_bot </IfModule> # Apache >= 2.3 <IfModule mod_authz_core.c> <RequireAll> Require all Granted Require not env bad_bot </RequireAll> </IfModule> </IfModule> # 6G:[BAD IPS] <Limit GET HEAD OPTIONS POST PUT> Order Allow,Deny Allow from All # uncomment/edit/repeat next line to block IPs # Deny from 123.456.789 </Limit>