Ik probeer via htaccess een wachtwoord op mijn website te zetten bij bepaalde urls (alleen waar /leden in staat).

Dat probeer ik met de volgende code:


RewriteEngine on
DirectoryIndex
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

#Indexes uitzetten
Options -Indexes

#Cross site access toestaan
Header set Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"

#CMS rewrite
RewriteRule ^cms/$ /cms/administrator [L]

#mysitename

DirectoryIndex index.php

SetEnvIf Request_URI ^leden/(.*).html auth=1

AuthName "Please login"
AuthType Basic
AuthUserFile "/home/mysitename/public_html/.htpasswd"

# first, allow everybody
Order Allow,Deny
Satisfy any
Allow from all
Require valid-user
# then, deny only if required
Deny from env=auth

RewriteRule         ^leden/(.*).html catlisting.php?alias=$1 [QSA,L]
RewriteRule         ^info/(.*).html catlisting.php?alias=$1 [QSA,L]
RewriteRule         ^events/(.*).html events.php?alias=$1 [QSA,L]
RewriteRule         ^projecten/(.*).html projecten.php?alias=$1 [QSA,L]
RewriteRule         ^product/(.*).html product.php?alias=$1 [QSA,L]
RewriteRule         ^catalogus/(.*).html catalogus.php?alias=$1 [QSA,L]
RewriteRule         ^(.*).html content.php?alias=$1 [QSA,L]

ErrorDocument 404 /error/404.php
ErrorDocument 403 /error/403.php
ErrorDocument 500 /error/500.php
ErrorDocument 501 /error/501.php
ErrorDocument 503 /error/503.php
ErrorDocument 504 /error/504.php


Alleen als ik naar een pagina toe ga, bijvoorbeeld https://mysite.nl/leden/vergaderstukken.html dan zie ik geen password popup. Wat doe ik precies verkeerd?
Give it a try.
Maar ik houd mijn vingers gekruisd dat het met mod_rewrite lastig is. Maar waarom .htaccess, en geen PHP oplossing?

<Files "^leden/(.*).html">
AuthName "Please login"
AuthType Basic
AuthUserFile "/home/mysitename/public_html/.htpasswd"
</Files>
/home/mysitename/public_html/.htpasswd

En voor het gebruikersgemak kan iedereen de .htpasswd file ook downloaden, cool.

EDIT: er wordt namelijk nergens voorkomen dat je .ht* bestanden kunt opvragen, dat zou ook in een allow/deny regel moeten staan, of nog beter, zet het in eerste instantie niet in de publieke webdirectory...
Thomas van den Heuvel op 21/12/2018 15:11:25

/home/mysitename/public_html/.htpasswd

En voor het gebruikersgemak kan iedereen de .htpasswd file ook downloaden, cool.

Dat wordt al standaard in Apache tegengegaan hoor. Er bestaat ook configuratie op server-niveau dan enkel op user-niveau. Of ben je een Nginx gebruiker? ;-)

Persoonlijk vind ik dat dit netjes buiten de webroot hoort. En dus op een onbereikbare plek waar een bezoeker niet bij kan.
- Ariën - op 21/12/2018 15:43:32
Dat wordt al standaard in Apache tegengegaan hoor. Er bestaat ook configuratie op server-niveau dan enkel op user-niveau. Of ben je een Nginx gebruiker? ;-)

Lijkt mij beter om dit expliciet, en wellicht ten overvloede, in te stellen, of nog beter:
- Ariën - op 21/12/2018 15:43:32
Persoonlijk vind ik dat dit netjes buiten de webroot hoort. En dus op een onbereikbare plek waar een bezoeker niet bij kan.

Want dan heb je dit probleem in eerste instantie niet.
Apache kijkt enkel naar .ht*:

<Files ".ht*">
    Require all denied
</Files>

Dus een .htaccess bestand wordt gelijk behandeld als een .htpasswd.
Enkel een .htaccess bestand bepaalt de instellingen vanuit de directory waar deze in geplaatst is. Deze kan je dan niet eenvoudig of zelfs onmogelijk in een andere directory plaatsen. Maar gebruikersnamen en (ge-encrypte) wachtwoorden zijn al een verhaal apart. Die zou je altijd lekker buiten de webroot moeten plaatsen, ongeacht dat Apache het bekijken ervan blokkeert. Maar als het niet anders zou kunnen, dan voorkomt Apache in ieder geval dat je het zomaar kan downloaden. Met PHP kan je er overigens wel bij, als je het via het bestandssysteem doet.

Maar het had in mijn ogen wel netter gekund.
Dat snap ik en weet ik ook. Maar iets expliciet instellen is wat mij betreft altijd beter dan uitgaan van een default, die mogelijk niet de default is die jij verwacht, of mogelijk over tijd verandert zonder dat je er erg in hebt (denk bijvoorbeeld aan een upgrade).

Als je dit zelf configureert heb je deze problematiek nooit en hoef je de instellingen ook niet continu na te lopen om jezelf ervan te vergewissen dat deze inderdaad nog kloppen :p.
Eigenlijk zou het blokkeren van het bekijken van configuratiebestanden niet instelbaar moeten zijn, en zou dit altijd al geblokkeerd moeten worden. Ik zou geen voorbeeld kunnen bedenken waarom je .ht* bestanden zou willen downloaden.

Maar we dwalen wel een beetje af, zo ;-)
- Ariën - op 21/12/2018 12:19:30

Give it a try.
Maar ik houd mijn vingers gekruisd dat het met mod_rewrite lastig is. Maar waarom .htaccess, en geen PHP oplossing?

<Files "^leden/(.*).html">
AuthName "Please login"
AuthType Basic
AuthUserFile "/home/mysitename/public_html/.htpasswd"
</Files>



Ik hoopte dit eigenlijk snel en dirty even op te lossen met een .htaccess password, maar helaas werkt bovenstaande code ook niet dus zal ik het toch via PHP moeten doen.
Moet daar niet nog een Require regel achteraan, bijvoorbeeld:
Require valid-user

En in de documentatie wordt begonnen met AuthType, niet AuthName. Wellicht is de volgorde van de argumenten ook belangrijk.

Een nettere -en waarschijnlijk uniformere- oplossing is nog steeds authenticatie in PHP zelf. Je hebt ook een /cms/administrator gedeelte? Hoe wordt die dan dichtgetimmerd? Kun je /leden niet op precies dezelfde manier beveiligen, maar met een "lid" rol of recht? Het klinkt alsof het een en ander nog niet helemaal uitgekristalliseerd is...
Voor zover ik weet kan je lastig uitloggen als je HTTP authenticatie gebruikt.
Enkel door de browser af te sluiten.

Het is leuk voor een tijdelijke beveiliging van een geheel project of bestand. Maar ik zie het niet als specifiek inlogsysteem. Ten eerste vanwege het uitloggen (wat ik al zei), het kent geen rollensysteem. Maar ook omdat je bijna metadata kan opslaan in je .htpasswd bestand. Je kan dan wel met een database werken, maar dan kan je weer net zo goed het hele inlogsysteem in PHP bouwen.

Reageren