htaccess "zamów" Deny, Allow, Deny

Chciałbym zezwolić tylko na dostęp do jednego kraju, ale wykluczyć proxy w tym kraju.

Oto co mam (skrócona wersja dla wygody)

<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>
Ale wiem, że to nie zadziała. Jak mam to zrobić?
Author: regilero, 2012-03-30

6 answers

Aktualizacja: dla nowego apache 2.4 przejdź bezpośrednio do końca.

Kolejność słowa kluczowego i jego związek z dyrektywami Deny i Allow jest prawdziwym koszmarem. Ciekawie byłoby zrozumieć, w jaki sposób trafiliśmy na takie rozwiązanie, co najmniej nieintuicyjne.

  • pierwszą ważną kwestią jest to, że słowo kluczowe Order będzie miało duży wpływ na sposób użycia dyrektyw Allow i Deny.
  • Po Drugie, Deny i Allow dyrektywy nie są stosowane w kolejności, w jakiej zostały napisane, muszą być postrzegane jako dwa odrębne bloki (jeden dla Deny dyrektyw, jeden dla Allow).
  • Po trzecie, nie są one drastycznie podobne do reguł firewalla: wszystkie reguły są stosowane, Proces jest nie zatrzymuje się podczas pierwszego meczu.

Masz dwa główne tryby:

W 2007 roku, po raz pierwszy w Polsce, w Polsce i za granicą, w 2008 roku, w Polsce i za granicą, w 2009 roku, w Polsce i za granicą.]}
Order Deny,Allow
  • this is an allow by domyślny tryb. Opcjonalnie można określić reguły Deny.
  • Po pierwsze, reguły Deny odrzucają niektóre żądania.
  • jeśli ktoś zostanie odrzucony, możesz go odzyskać za pomocą Allow.

Przeformułowałbym to jako:

Rule Deny
     list of Deny rules
Except
     list of Allow rules
Policy Allow (when no rule fired)
W 2007 roku, po raz pierwszy w Polsce, w 2008 roku, w Polsce i na świecie, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku]}
Order Allow,Deny
  • jest to tryb domyślnie odrzucający . Więc zazwyczaj określasz Allow Zasady.
  • Po pierwsze, czyjaś Prośba musi pasować do co najmniej jednej reguły Allow.
  • jeśli ktoś dopasował Allow, nadal możesz odrzucić je za pomocą Deny.

W formie uproszczonej:

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

Powrót do sprawy

Musisz zezwolić na listę sieci, które są sieciami krajowymi. A w tym kraju chcesz wykluczyć adresy IP niektórych proxy.

Wybrałeś tryb allow-anyone-except-this-list-or-maybe-not, więc domyślnie każdy może uzyskać dostęp do twojego serwera, z wyjątkiem adresów IP Proxy wymienionych na liście Deny, ale jeśli zostaną odrzucone, nadal zezwalasz na krajowe sieci. To zbyt szerokie. Niedobrze.

Odwracając do order allow,deny będziesz w trybie Odrzuć-wszystkich-z wyjątkiem-tej-listy-lub-może-nie . Więc odrzucisz dostęp do wszystkich, ale pozwolisz sieciom krajowym, a następnie odrzucisz proxy. I oczywiście należy usunąć Deny from all jak stwierdzili @Gerben i @ Michael Slade (ta odpowiedź wyjaśnia tylko to, co oni napisał).

The Deny from all jest zwykle postrzegane z order deny,allow, aby usunąć zezwolić domyślnie dostęp i dokonać prostej, czytelnej konfiguracji. Na przykład następnie określ listę dozwolonych adresów IP. Nie potrzebujesz tej reguły, a twoje pytanie jest idealnym przypadkiem trybu dostępu 3-kierunkowego(domyślna zasada, wyjątki, wyjątki od WYJĄTKÓW).

Ale ci, którzy zaprojektowali te ustawienia, są obłąkani. Wszystko to jest przestarzałe z Apache 2.4

Cały schemat autoryzacji został zrefakturowany W Apache 2.4 with RequireAll, RequireAny i RequireNone dyrektywy. Zobacz na przykład ten złożony przykład logiki .

Tak więc stara dziwna logika staje się reliktem, a cytując nową dokumentację:]}

Kontrola jak i w jakiej kolejności autoryzacja będzie stosowana była w przeszłości trochę tajemnicą

 129
Author: regilero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-09 11:58:54

Zamiast tego użyj order allow,deny i usuń linię deny from all.

 3
Author: Gerben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-05 16:45:33

Zmień kod na

<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>

W ten sposób twój htaccess zaprzeczy wszystkim, z wyjątkiem tych, na które wyraźnie zezwalasz za pomocą allow from..

Proxy w zakresie allow można łatwo zastąpić dodatkową regułą deny from...

 3
Author: Gilly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-06 07:41:01

Nie odpowiadając bezpośrednio na pytanie OPs, ale dla osób, które znajdują to pytanie w poszukiwaniu jasności, jaka jest różnica między allow,deny a deny,allow:

Odczytaj przecinek jako "ale".

  • allow but deny: biała lista z wyjątkami.
    wszystko jest odrzucone, z wyjątkiem pozycji na liście Zezwól, z wyjątkiem pozycji na liście zaprzecz
  • deny but allow: Czarna lista z wyjątkami.
    wszystko jest dozwolone, z wyjątkiem elementów na liście Odrzuć, z wyjątkiem elementów na liście Zezwól lista

Zezwalaj tylko na dostęp do jednego kraju, ale wyklucz proxy w tym kraju

OP potrzebował białej listy z wyjątkami, dlatego allow,deny zamiast deny,allow

 3
Author: Felk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 20:04:36

Jak zasugerował Gerben, po prostu zmień:

order deny,allow
deny from all

Do

order allow,deny

I ograniczenia będą działać tak, jak chcesz.

SZCZEGÓŁY można znaleźć w Apache ' s docs.

 2
Author: Michael Slade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-09 03:19:49

Zapraszamy do zapoznania się z naszą ofertą]}

Require all granted

 0
Author: Deepa MG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-22 06:56:59