web-dev-qa-db-fra.com

htaccess "order" Refuser, Autoriser, Refuser

J'aimerais autoriser l'accès à un seul pays, mais exclure les mandataires de ce pays.

C'est ce que j'ai (version abrégée pour plus de commodité)

<Limit GET POST>
order deny,allow
deny from all
allow from 139.82.0.0/16
allow from 143.54.0.0/16
allow from 186.192.0.0/11
allow from 186.224.0.0/11
.
deny from 186.201.27.66
deny from 186.201.196.1
deny from 186.214.51.231
deny from 186.237.225.26
</Limit>

Mais je sais que cela ne fonctionnera pas. Comment puis-je faire cela?

33
Gaia

Update: pour le nouvel Apache 2.4 saute directement à la fin.

Le mot clé Order et sa relation avec les directives Deny et Allow constituent un véritable cauchemar. Il serait très intéressant de comprendre comment nous en sommes arrivés à une telle solution, une solution pour le moins non intuitive.

  • Le premier point important est que le mot clé Order aura un impact important sur la façon dont les directives Allow et Deny sont utilisées.
  • Deuxièmement, les directives Deny et Allow ne sont pas appliquées dans l'ordre dans lequel elles ont été écrites, elles doivent être considérées comme deux blocs distincts (un pour les directives for Deny, un pour Allow).
  • Troisièmement, elles ne ressemblent pas du tout aux règles du pare-feu: toutes les règles sont appliquées, le processus est ne s’arrête pas au premier match.

Vous avez deux modes principaux:

Le Order-Deny-Allow-mode, ou autoriser tout le monde sauf cette liste ou peut-être pas

Order Deny,Allow
  • Ceci est un mode autorisé par défaut. Vous pouvez éventuellement spécifier des règles Deny.
  • Premièrement, les règles Deny rejettent certaines demandes.
  • Si quelqu'un est rejeté, vous pouvez le récupérer avec une Allow.

Je reformulerais comme suit:

Rule Deny
     list of Deny rules
Except
     list of Allow rules
Policy Allow (when no rule fired)

Le Order-Allow-Deny-mode} _ ou rejette tout le monde sauf cette liste ou peut-être pas

Order Allow,Deny
  • Ceci est un mode refuser par défaut. Ainsi, vous spécifiez généralement les règles Allow.
  • Premièrement, la demande de quelqu'un doit correspondre à au moins une règle Allow.
  • Si une personne correspond à une Allow, vous pouvez toujours la rejeter avec une Deny.

Sous la forme simplifiée:

Rule Allow
     list of Allow rules
Except
     list of Deny rules
Policy Deny (when no rule fired)

Retour à votre cas

Vous devez autoriser une liste de réseaux qui sont les réseaux de pays. Et dans ce pays, vous souhaitez exclure les adresses IP de certains mandataires.

Vous avez choisi le mode autoriser tout le monde, sauf-this-list-ou peut-être-pas. Ainsi, par défaut, personne peut accéder à votre serveur, à l'exception des adresses IP des mandataires répertoriés dans la liste Deny ils sont rejetés par vous toujours autoriser les réseaux de pays. C'est trop large. Pas bon.

En inversant order allow,deny, vous serez en mode rejetez tout le monde sauf cette liste ou peut-être pas . Ainsi, vous refuserez l'accès à tout le monde mais autoriserez les réseaux de pays, puis vous refuserez les mandataires. Et bien sûr, vous devez supprimer le Deny from all indiqué par @Gerben et @Michael Slade (cette réponse explique uniquement ce qu'ils ont écrit).

Deny from all est généralement utilisé avec order deny,allow pour supprimer l'accès autoriser par défaut et créer une configuration simple et lisible. Par exemple, spécifiez une liste d'adresses IP autorisées après cela. Vous n'avez pas besoin de cette règle et votre question est le cas parfait d'un mode d'accès à 3 voies (stratégie par défaut, exceptions, exceptions aux exceptions).

Mais les gars qui ont conçu ces paramètres sont certainement fous.

Tout cela est déconseillé avec Apache 2.4

L'ensemble du schéma d'autorisation a été refactored dans Apache 2.4 avec les directives RequireAll , RequireAny et RequireNone . Voir par exemple cet exemple de logique complexe .

Ainsi, l'ancienne logique étrange Order devient une relique, et pour citer la nouvelle documentation:

Contrôler comment et dans quel ordre l'autorisation sera appliquée était un peu mystérieux dans le passé

119
regilero

Changez votre code en 

<Limit GET POST>
deny from all

allow from 139.82.0.0/16
allow from 143.54.0.0/16
allow from 186.192.0.0/11
allow from 186.224.0.0/11
</Limit>

De cette façon, votre htaccess refusera tout sauf ceux que vous autorisez explicitement avec allow from..

Un proxy dans la plage autorisée peut facilement être remplacé par une règle deny from.. supplémentaire.

3
Gillian Lo Wong

Utilisez simplement order allow,deny à la place et supprimez la ligne deny from all.

3
Gerben

Comme l'a suggéré Gerben, il suffit de changer:

order deny,allow
deny from all

à

order allow,deny

Et les restrictions fonctionneront comme vous le souhaitez.

Les détails peuvent être trouvés dans la documentation d'Apache .

1
Michael Slade

Ne répondez pas directement à la question sur les points de vente, mais pour les personnes qui trouvent cette question à la recherche de précisions sur la différence entre allow,deny et deny,allow:

Lire la virgule comme un "mais".

  • allow but deny: liste blanche avec exceptions.
    tout est refusé, à l'exception des éléments de la liste d'autorisation, à l'exception des éléments de la liste de refus
  • deny but allow: liste noire avec des exceptions.
    tout est autorisé, à l'exception des éléments de la liste de refus, à l'exception des éléments de la liste des autorisations

n'autoriser qu'un seul pays, mais exclure les mandataires de ce pays

OP avait besoin d'une liste blanche avec des exceptions, donc allow,deny au lieu de deny,allow

0
Felk