Protéger les fichiers d’un répertoire par redirection

Empêche l’accès direct par l’url à un fichier d’un répertoire protégé par ce script htaccess.

Il reste possible de télécharger un fichier du répertoire via un fichier PHP utilisant un script spécifique (agissant au niveau HTTP) forçant le téléchargement d’un fichier (demandé via un formulaire distant par exemple).

Contenu du htaccess :

  • Première ligne : Active le moteur de réécriture
  • Deuxième ligne : Indique une condition = « Si la requête concerne un fichier… »
  • Troisième ligne : Indique une règle de réécriture. Dans l’exemple, on affiche le fichier index.php du répertoire.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.+$ index.php [L]

 

Notes :

  • Sur la deuxième ligne, pour indiquer que la requête ne concerne par un fichier, il faut terminer par !-f
  • On peut indiquer une condition de requête portant sur un répertoire en terminant par -d.
    Exemple : RewriteCond %{REQUEST_FILENAME} -d
  • [L] (troisième ligne) permet de terminer le processus de réécriture en cours

 

Définir le fichier index par défaut

Il est possible de définir le fichier index par défaut avec la commande DirectoryIndex, syntaxe de la forme :

DirectoryIndex index.php index.html accueil.php index.phtml /erreurs/403.php

Les fichiers sont indiqués dans l’ordre de priorité : dans l’exemple ci-dessus, le navigateur devra afficher le premier fichier cité (index.php), s’il ne le trouve pas, le fichier suivant etc.

Réécriture d’url – variables

références : httpd.apache.org – v. aussi https://craym.eu/tutoriels/…

Création et utilisation de « références » (autrement dit, des variables, réutilisables dans le code htaccess) (v. httpd.apache.org) :
En utilisant des parenthèses dans les lignes de condition (RewriteCond) ou de règle de réécriture (RewriteRule), on crée des références qui peuvent être résumées et rappelées par %N ou $N (« N » représentant le rang de la variable, dans l’ordre de création de ces variables).

%N : variables issues des lignes conditionnelles
$N : variables issues des lignes de règles de réécriture

Ex. :

RewriteEngine On
RewriteCond %{HTTP_HOST} !fb-graphic.com [NC]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://www.fb-graphic.com/$1?domaine=%1 [L]

traduction :

  • si l’hôte n’est pas fb-graphic.com
  • et si l’hôte commence par www.
  • on réécrit www.exemple.tld(/x) en
    http://www.fb-graphic.com/(x)?domaine=exemple.tld

Réécriture d’url – départ

références :
www.webmaster-hub.com
www.magneto.be
https://craym.eu/tutoriels/…

On commence toujours le htaccess de réécriture d’url par le code suivant (cf. références) :

Options +FollowSymlinks
RewriteEngine on

On écrit éventuellement une ou plusieurs lignes de conditions de redirection sous la forme :

RewriteCond %{HTTP_HOST} !www.fb-graphic.com [OR]
RewriteCond %{QUERY_STRING} !^123456$ [NC]

([OR] et [NC] sont des exemples de « flags »)

On écrit la règle de réécriture sous la forme :

RewriteRule ^(.*)\.htm$ $1.php [L]

la première partie (^(.*)\.htm$) représente ce qui doit être réécrit ; elle peut utiliser les expressions régulières et des variables
^ signifie « début de la chaîne obligatoirement »
$ signifie « fin de la chaîne obligatoirement »
la deuxième partie ($1.php) indique la forme de réécriture souhaitée ; elle peut utiliser des variables
$1 représente une variable

Pour une régle sans réécriture d’url, on utilise le signe -.
Exemple : RewriteRule \.(gif|jpg|png)$ - [F,L]

Réécriture d’url – flags (drapeaux)

références :
www.webmaster-hub.com
httpd.apache.org

[L] Celui-ci vous semble familier, comme nous l’avons vu dans notre précédent exemple. Il mérite toutefois une précision. Lorsque le module de réécriture est actif, les règles sont lues séquentiellement et l’URL est comparée ligne à ligne avec le premier argument de celles-ci jusqu’à la dernière.
Si une réécriture est effectuée, c’est la forme réécrite qui sera utilisée en entrée pour les règles suivantes.
Le flag [L] permet de sortir prématurément de la boucle.
[R]
[R=code]
Dans ces deux formes une redirection est effectuée.
Si l’argument code n’est pas précisé, une redirection 302 (déplacé temporairement) est effectuée. Si vous souhaitez faire savoir au navigateur/robot qu’une page a été remplacée définitivement, utiliser le code 301 comme dans :
RewriteRule ^ancien\.html$ http://domaine.tld/nouveau.html [R=301,L]
Dans ce cas précis, une réécriture « externe » s’impose (utilisation de http://…)
[F] Forbidden – interdit. Retourne un code 403, par exemple :
RewriteRule ^secret.html$ – [F]
[NC] NoCase, ou « insensible à la casse ». La règle suivante :
RewriteRule ^script\.php$ programme.php [NC,L]
S’appliquera aussi bien à script .php, SCRIPT.PHP ou ScRiPt .PhP
[G] Gone.
Cette page n’existe plus et retourne une entête http 410
[N] Force l’analyse et l’exécution de toutes les règles en repartant du début de la liste. Ici encore, comme expliqué plus haut ([L]), c’est l’URL modifiée après exécution de la dernière règle qui est utilisée en entrée, et non l’URL originelle. Attention aux boucles infinies !
[C] Chain, chaînage avec la ou les règles suivantes jusqu’à la première règle ne se terminant pas par [C]
Apache interprète ce flag comme suit : s’il y a réécriture (la règle est vérifiée), la règle suivante est exécutée avec la chaîne réécrite en entrée.
Si la règle ne se vérifie pas, toutes les règles qui suivent jusqu’à la première ne comportant pas le flag [C] ne sont pas appliquées.
[QSA] Query String Append. Rajoute le QUERY_STRING à la fin de l’expression, après la réécriture. À réserver pour la dernière règle de réécriture. Utilisée le plus souvent avec le flag [L], comme dans [QSA,L]

Réécriture d’url – manipuler les QUERY_STRING

QUERY_STRING = paramètres d’url

Avec le flag [QSA] on indique à la règle de réécriture qu’elle doit ajouter en fin d’url (et, le cas échéant, à la suite des paramètres existants dans la réécriture, avec « & ») les paramètres de l’url d’origine (avant réécriture).
Sans drapeau [QSA], le QUERY_STRING demandé par la réécriture remplace automatiquement celui d’origine, sinon, celui d’origine est automatiquement ajouté (si l’url réécrite n’en demande pas un nouveau donc) (ceci dépend peut-être des réglages de serveur).
Pour forcer la disparition de tout QUERY_STRING, il suffit de faire terminer la réécriture par un point d’interrogation et ne pas mentionner [QSA].

Exemples :

RewriteRule ^.* http://www.fb-graphic.com/trouve.php [QSA,L]
=> Une page cherche.php?objet=stylo deviendra http://www.fb-graphic.com/trouve.php?objet=stylo

RewriteRule ^.* http://www.fb-graphic.com/trouve.php?trousse [QSA,L]
=> Une page cherche.php?objet=stylo deviendra http://www.fb-graphic.com/trouve.php?trousse&objet=stylo

RewriteRule ^.* http://www.fb-graphic.com/trouve.php?trousse [L]
=> Une page cherche.php?objet=stylo deviendra http://www.fb-graphic.com/trouve.php?trousse

RewriteRule ^.* http://www.fb-graphic.com/trouve.php? [L]
=> Une page cherche.php?objet=stylo » deviendra http://www.fb-graphic.com/trouve.php

Créer un cookie pour un domaine différent

Un cookie n’est valide et lisible que pour l’hôte (domaine) qui l’a créé.

L’utilisation d’une chaîne optionnelle « domain » dans setcookie en php (v. fr.php.net/manual) ou dans document.cookie (JavaScript) n’est pas probante voire est totalement impossible.

Une solution consiste à appeler une page du domaine ciblé (B) dans une page html du domaine initial (A) dans un <object>, la page appelée contenant le script de création de cookie. Ce cookie sera automatiquement attaché au domaine B.

Si la page appelée doit être masquée dans la page « mère », on peut appliquer à l’<object> des dimensions h. et l. et des marges négatives de mêmes valeurs. Un simple style display:none rend inopérant le script dans certains navigateurs (Google Chrome) et l’idée de masquer <object> en le plaçant simplement dans le header n’est pas valable dans tous les navigateurs.

Restriction d’accès

rappel : pour être reconnus les fichiers doivent être téléchargés en mode ascii !

Syntaxe du fichier .htaccess (v. Selfhtml, phpdebutant…) :

Digest :

# fichier .htaccess pour le répertoire prive

AuthType Basic
AuthName "espace prive"
AuthUserFile /usr/local/etc./htdocs/www/lesite/prive/.htpasswd
AuthGroupFile /usr/local/etc./htdocs/www/lesite/prive/.htgroups
require user  Audrey Christian Antoine
require group techniciens

note à propos du chemin réel sur le serveur (décrit à AuthUserFile et AuthGroupFile) :

il est possible de connaître ce chemin à l’aide de php. Il suffit de créer un fichier php avec le code <?php echo realpath("index.php"); ?> (s’il n’y a pas de fichier index.php dans le répertoire de ce fichier, indiquer un fichier existant ou encore ce fichier lui-même).

Pour limiter la protection (cf. Selfhtml) :

# Fichier .htaccess pour le répertoire prive

AuthType Basic
AuthName "espace-Service"
AuthUserFile /usr/local/etc/httpd/htdocs/www.lesite.com/prive/.htpasswd
AuthGroupFile /usr/local/etc/httpd/htdocs/www.lesite.com/prive/.htpasswd.htgroups

<Files *.htm>
require user  Audrey Christian Antoine
require group techniciens
</Files>

selfhtml : « Dans le repère d’ouverture, derrière la parenthèse pointue d’ouverture, peut figurer soit Files, comme dans l’exemple ci-dessus, soit Limit. Derrière, vous pouvez faire uniquement une mention restrictive. Avec *.htm comme dans l’exemple, vous limitez la protection aux fichiers HTML. Avec une mention comme secret.htm ce seul et unique fichier serait protégé. Avec Limit vous pouvez limiter la méthode d’accès par exemple à GET ou bien à POST. »

Syntaxe du fichier .htpassword :

# Fichier d'utilisateurs pour le repertoire "prive"

Audrey:INGoUvP4QNWNM
Michel:INw2mPEH.owe2
Christelle:INt4TUI7dOlQ6
Fanny:IN0w9l5E2Rltw
Norbert:INP0Mscg62Cbg
Diane:INbi/z9y/ogns
Christine:INmkm1zgB8qGk
Gaspard:INeRD/cUQIFP6
Christian:INL8hI.TVvsds
Antoine:INEyrT70PYPlo

Les mots de passe sont cryptés.
Attention : Free n’autorise pas le cryptage des mots de passe.

Syntaxe du fichier .htgroups :

# Fichier de groupe pour le repertoire "prive"

techniciens: Gaspard Diane Christelle