Je Website Beveiligen met een .htaccess Bestand: Een Complete Gids

htaccess

Als je een website beheert, heb je waarschijnlijk wel eens gehoord van een .htaccess bestand. Maar wat is het precies? En nog belangrijker: hoe kun je het gebruiken om je website veiliger en sneller te maken? In dit artikel leggen we uit wat een .htaccessbestand is en bespreken we een krachtig, kant-en-klaar configuratiebestand dat je direct in je public_html map kunt plaatsen om hackers en bots buiten de deur te houden.
Het bestand staat onder dit artikel.

Wat is een .htaccess bestand?

.htaccess staat voor Hypertext Access. Het is een verborgen configuratiebestand dat wordt gebruikt door webservers die op Apache draaien (de meest gebruikte webserversoftware ter wereld). Met dit kleine, maar extreem krachtige tekstbestand kun je serverinstellingen aanpassen voor de specifieke map waarin het bestand staat, zónder dat je toegang nodig hebt tot de hoofdconfiguratie van de server.

Je kunt een .htaccess bestand gebruiken voor talloze taken, zoals:

  • Het doorsturen (redirecten) van bezoekers naar andere pagina’s.
  • Het afdwingen van een veilige HTTPS-verbinding.
  • Het beveiligen van mappen met een wachtwoord.
  • Het blokkeren van kwaadaardig verkeer.

Omdat het bestand zo direct communiceert met de server, is het de eerste verdedigingslinie van je website.

De Ultieme .htaccess Beveiliging:
Stap-voor-Stap Uitgelegd

Hieronder bespreken we een sterk staaltje .htaccess configuratie, speciaal ontworpen om de public_html (de hoofdmap van je website waar al je openbare bestanden staan) robuust te beveiligen. We breken het script op in 6 logische onderdelen, zodat je precies begrijpt wat het doet.

1. Standaard Beveiliging & Server Instellingen

Een veelgemaakte fout is dat webservers een lijst van bestanden (een “directory index”) laten zien als er geen index.html of index.php aanwezig is. Dit script schakelt Directory Listing uit met Options -Indexes . Bezoekers kunnen dus nooit door je mappen bladeren. Daarnaast verbergt het de serversignatuur en blokkeert het de toegang tot kritieke verborgen bestanden (zoals het .htaccess bestand zelf of .env bestanden waarin wachtwoorden staan).

2. PHP Instellingen (Veilig geconfigureerd)

Standaard stuurt een server vaak een zogenaamde header mee naar de browser die verklapt welke PHP-versie er draait (bijv. X-Powered-By: PHP/8.1). Voor hackers is dit waardevolle informatie, omdat ze dan kunnen zoeken naar zwakheden in precies die versie. Via dit script wordt de expose_php functie uitgeschakeld voor diverse PHP-versies, waardoor je deze informatie verborgen houdt.

3. Forceer HTTPS (SSL Afdwingen)

Een veilige website vereist een SSL-certificaat (het slotje in de adresbalk). Maar wat als iemand handmatig “http://” intypt in plaats van “https://“? Dit onderdeel van het script detecteert onbeveiligde verbindingen en stuurt de bezoeker automatisch en permanent (301 redirect) door naar de beveiligde HTTPS-versie van de pagina.

4. Moderne Security Headers

Dit is een van de belangrijkste onderdelen voor moderne webveiligheid. Het script voegt extra instructies (headers) toe aan het antwoord van de server:

  • X-Frame-Options: Voorkomt Clickjacking doordat je website niet zomaar in een onzichtbaar frame of iframe op een andere site geladen mag worden.
  • X-Content-Type-Options (“nosniff”): Zorgt ervoor dat de browser bestanden strikt behandelt zoals ze bedoeld zijn, wat voorkomt dat kwaadaardige code stiekem als een onschuldige afbeelding wordt geladen.
  • HSTS (Strict-Transport-Security): Vertelt de browser van je bezoekers dat je site het komende jaar (31536000 seconden) uitsluitend via HTTPS bezocht mag worden.
  • Permissions-Policy: Beperkt onnodige browserfuncties (zoals ongevraagd toegang proberen te krijgen tot de microfoon, camera of locatie).

5. Compacte Firewall (Bescherming tegen bots & exploits)

Met behulp van de RewriteEngine functioneert het .htaccess bestand nu als een mini-firewall:

  • Verdachte methodes: Alleen standaard lees- en schrijfverzoeken (GET en POST) worden toegelaten; acties zoals PUT, TRACE of DEBUG worden direct geblokkeerd.
  • Bot-blokkade: Bekende kwaadaardige spambots, scrapers en scanners (zoals sqlmap of nikto) worden op basis van hun User-Agent direct buitengesloten.
  • Exploit-preventie: URL’s die proberen kwaadaardige code uit te voeren (zoals Cross-Site Scripting (XSS), SQL-injecties, base64 code of verzoeken naar systeembestanden zoals etc/passwd) worden opgevangen in de query string en resoluut afgewezen.

6. Standaard Foutmeldingen

Mocht iemand toch op een geblokkeerd onderdeel stuiten of een pagina zoeken die niet bestaat, dan zorgt dit script voor heldere, standaard foutmeldingen. In plaats van een standaard serverpagina ziet de bezoeker netjes:

  • 403 Forbidden: “Je hebt geen toegang tot dit bestand.”
  • 404 Not Found: “De opgevraagde pagina bestaat niet.”

Conclusie

Het toevoegen van een goed geconfigureerd .htaccess bestand aan je public_html map is een kleine moeite met een gigantische impact op de veiligheid van je website. Met het bovenstaande script verander je een open deur in een digitaal fort. Je verbergt gevoelige serverinformatie, dwingt beveiligde verbindingen af en stopt de meeste geautomatiseerde hackpogingen al voordat ze de kans krijgen om je website te bereiken.

Let op: Maak altijd een back-up van je huidige .htaccess bestand (indien aanwezig) voordat je wijzigingen aanbrengt. Een klein typfoutje kan er namelijk voor zorgen dat je website tijdelijk onbereikbaar wordt.


Het .htaccess bestand

# ==============================================================================
# 1. STANDAARD BEVEILIGING & SERVER INSTELLINGEN
# ==============================================================================

# Voorkom dat mappen uitgelezen kunnen worden (Directory Listing)
Options -Indexes

# Verberg de server versie en het besturingssysteem
ServerSignature Off

# Blokkeer directe toegang tot verborgen bestanden (zoals .htaccess, .htpasswd, .env, .git)
<FilesMatch "^\.">
    Require all denied
</FilesMatch>

# ==============================================================================
# 2. PHP INSTELLINGEN (Veilig geconfigureerd)
# ==============================================================================
# Verberg de PHP versie in de headers (Voorkomt X-Powered-By: PHP/8.x)
<IfModule mod_php.c>
    php_flag expose_php Off
</IfModule>
<IfModule mod_php7.c>
    php_flag expose_php Off
</IfModule>
<IfModule mod_php8.c>
    php_flag expose_php Off
</IfModule>

# ==============================================================================
# 3. FORCEER HTTPS (SSL Afdingen)
# ==============================================================================
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

# ==============================================================================
# 4. MODERNE SECURITY HEADERS
# ==============================================================================
<IfModule mod_headers.c>
    # Voorkom Clickjacking
    Header always set X-Frame-Options "SAMEORIGIN"
    
    # Voorkom MIME-type sniffing
    Header always set X-Content-Type-Options "nosniff"
    
    # Forceer beveiligde verbindingen voor 1 jaar (HSTS)
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    
    # Referrer informatie beperken voor privacy
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    
    # Blokkeer browser features die deze app niet nodig heeft (Microfoon, Camera, Locatie)
    Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=()"
    
    # Verouderde, maar nog steeds gebruikte XSS bescherming
    Header always set X-XSS-Protection "1; mode=block"
    
    # Verberg de server header (werkt op sommige Apache configuraties)
    Header unset Server
    Header unset X-Powered-By
</IfModule>

# ==============================================================================
# 5. COMPACTE FIREWALL (Bescherming tegen bots & exploits)
# ==============================================================================
<IfModule mod_rewrite.c>
    RewriteEngine On

    # Blokkeer verdachte Request Methods (We hebben alleen GET en POST nodig)
    RewriteCond %{REQUEST_METHOD} ^(DEBUG|MOVE|PUT|TRACE|TRACK) [NC]
    RewriteRule .* - [F,L]

    # Blokkeer bekende kwaadaardige bots & scrapers
    RewriteCond %{HTTP_USER_AGENT} (binlar|casper|cmsworld|diavol|dotbot|extract|feedfinder|flicky|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|purebot|pycurl|python|sqlmap|sucker|turnit|vikspider|zmeu) [NC]
    RewriteRule .* - [F,L]

    # Blokkeer XSS, Base64 en SQL Injectie patronen in URL/Query String
    RewriteCond %{QUERY_STRING} (eval\() [NC,OR]
    RewriteCond %{QUERY_STRING} (127\.0\.0\.1) [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} (boot\.ini|etc/passwd|self/environ) [NC,OR]
    RewriteCond %{QUERY_STRING} (\'|\")(.*)(drop|insert|md5|select|union) [NC]
    RewriteRule .* - [F,L]
</IfModule>

# ==============================================================================
# 6. STANDAARD FOUTMELDINGEN
# ==============================================================================
ErrorDocument 403 "403 Forbidden - Je hebt geen toegang tot dit bestand."
ErrorDocument 404 "404 Not Found - De opgevraagde pagina bestaat niet."

Archief