Hieronder een aantal tips voor beveiliging.
1. Zorg dat de website en de uitbreidingen up-to-date zijn. In de laatste versies zijn recente bugs opgelost.
2. Informeer bij je provider of de php versie recent is. Dit kun je bij sommige providers in het .htaccess bestand of in het control panel instellen. Controleer ook of de website software geschitk is voor deze recentere php versie.
3. Gebruik verschillende sterke wachtwoorden voor: control panel (provider), website beheer (cms), database user (cms), FTP user, en voor de mailbox die je website gebruikt.
4. Gebruik als het mogelijk is nergens "admin" of "beheerder" als gebruikersnaam.
5. Wijzig als het mogelijk is de naam van je cms-beheer map.
6. Permissies van mappen maximaal 755, van bestanden 444, tenzij het niet anders kan. Als je een schrijfbaar bestand nodig hebt, probeer dan de permissies van dit bestand in deze volgorde in te stellen tot het werkt: 644, 664, 666.
Een alternatief is om de gehele inhoud van een map af te schermen. Dit doe je door in de betreffende map een .htaccess bestand te zetten met de volgende inhoud.
Code:
<Files ~ "\.(php|php3|php4|php5|phtml|pl|cgi)$">
order deny,allow
deny from all
</Files>
7. Zet in mappen die geen index.html of index.php hebben een dummy bestand met de naam index.html zonder tekst (bestandgrootte 0 bytes)
8. Als je een cms of blog met rechtenbeheer voor de beheerders hebt, neem dan voor het dagelijks beheer een inlognaccount met minder rechten.
9. Zorg dat bezoekers nooit bij een php bestand kunnen komen waar de opdracht phpinfo() in staat. Als je dit toch gebruikt, scherm het dan af met een .htpasswd bestand. Gebruik hiervoor een online "htpasswd generator" en volg de aanwijzingen. Gebruik geen voor de hand liggende naam zoals "admin".
10. Zet in de root een bestand robots.txt met als enige inhoud: User-agent: *
11. Configureer een backup cyclus, meestal kan dit in het control panel.
12. Betere Authenticatie bij inloggen in website applicaties (cms, blog, enz)
a) Single-Factor Authenticatie controleert 1 factor, bijv. een sterk wachtwoord. Belangrijk is dat dit moeilijk door anderen is te raden, te achterhalen of te klonen.
b) Veiliger is de Two-Factor Authenticatie waarbij 2 verschillende factoren worden gecontroleerd, bijv. eigen wachtwoord
én code via smartphone.
Authenticatie Factoren zijn
iets dat je weet (wachtwoord, pincode, toegangszin)
iets dat je hebt (smartcard, smartphone)
iets dat je bent (iris-patroon, vingerafdruk, stemherkenning)
13. Je kunt in een .htaccess bestand goede beveiling regelen. Regels die met een # beginnen zijn commentaar regels voor wat extra info. De onderstaande code staat in een bestand met de naam .htaccess in de root van je domein (
www.example.nl/.htaccess). De provider heeft ervoor gezorgd dat dit bestand niet te lezen is voor de buitenwereld.
Code:
### page not found (check the name of your 404 file)
ErrorDocument 404 https://www.example.nl/404.html
### rewrite on
RewriteEngine on
### no index, no server info
Options -Indexes
ServerSignature Off
### base (in root / or in direcory /subdir)
RewriteBase /
### force https (only with https)
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
### wordpress: block include files
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]
### wordpress: rewrites urls as /parent/child
RewriteRule ^index.php$ - [L]
RewriteRule ^login/?$ /wp-login.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
### wordpress: block config
<Files wp-config.php>
Order allow,deny
Deny from all
</Files>
### deny cgi, perl, python
<FilesMatch "\.(cgi|pl|py)">
Order allow,deny
Deny from all
</FilesMatch>
### block file extensions
<FilesMatch "(^#.*#|.(bak|config|dist|htm|inc|ini|log|sh|sql)|~)$">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
### security
<IfModule mod_headers.c>
# disable ETags
Header unset ETag
FileEtag None
# same origin, for example no iframes on other sites
Header set X-Frame-Options "SAMEORIGIN"
</IfModule>
### security enhancements
# if the uri contains http:
RewriteCond %{QUERY_STRING} http\: [OR]
# or if the uri contains [ or ]
RewriteCond %{QUERY_STRING} \[ [OR]
RewriteCond %{QUERY_STRING} \] [OR]
# or if the uri contains <script>
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
# or if the script trying to set a php globals variable via url
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# or if any script is trying to modify a _request variable via url
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]
# or if the uri contains union
RewriteCond %{QUERY_STRING} UNION [OR]
# or if the uri contains double slash
RewriteCond %{QUERY_STRING} // [OR]
# or if the request contains /proc/self/environ (lfi hack)
RewriteCond %{QUERY_STRING} proc\/self\/environ [OR]
# or if the uri contains asterisk
RewriteCond %{QUERY_STRING} \*
# then 403 deny request
RewriteRule ^.*$ - [F,L]