htaccess "заказ" Запретить, Разрешить, Запретить - PullRequest
35 голосов
/ 30 марта 2012

Я хотел бы разрешить доступ только одной стране, но исключить прокси в этой стране.

Это то, что у меня есть (сокращенная версия для удобства)

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

Но я знаю этоне будет работать.Как мне это сделать?

Ответы [ 6 ]

122 голосов
/ 09 апреля 2012

Обновление: для нового apache 2.4 перейти непосредственно к концу.

Ключевое слово Order и его связь с директивами Deny и Allowнастоящий кошмар.Было бы очень интересно понять, каким образом мы получили такое решение, по меньшей мере, неинтуитивное.

  • Первый важный момент заключается в том, что ключевое слово Order окажет большое влияние.о том, как используются директивы Allow и Deny.
  • Во-вторых, директивы Deny и Allow не применяются в том порядке, в котором они написаны, они должны рассматриваться как два отдельных блока (одиндля директив Deny, одна для Allow).
  • В-третьих, они совершенно не похожи на правила брандмауэра: применяются все правила, процесс не останавливается при первом совпадении.

У вас есть два основных режима:

Режим Запретить-запретить-разрешить или Разрешить всем, кроме этого-списка-или, может быть, нет

Order Deny,Allow
  • Это режим по умолчанию .При желании вы можете указать Deny правила.
  • Во-первых, правила Deny отклоняют некоторые запросы.
  • Если кто-то отклоняется, вы можете вернуть его с помощью Allow.

Я бы перефразировал его как:

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

Режим Порядок-Разрешить-Запретить или Отклонить всех, кроме этого-списка-или-maybe-not

Order Allow,Deny
  • Это режим отклонение по умолчанию .Таким образом, вы обычно указываете Allow правила.
  • Во-первых, чей-то запрос должен соответствовать хотя бы одному правилу Allow.
  • Если кто-то соответствует Allow, вы все равно можете отклонить его с помощьюDeny.

В упрощенном виде:

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

Вернуться к вашему делу

Вам необходимо разрешить список сетей, являющихся сетями страны,А в этой стране вы хотите исключить IP-адреса некоторых прокси-серверов.

Вы выбрали режим allow-somebody-кроме-этого-списка-или-возможно-не , поэтому по умолчанию любой может получить доступ к вашему серверу, кроме IP-адресов прокси, перечисленных в списке Deny, но если они будут отклонены, вы по-прежнему разрешите сети страны.Это слишком широко.Не хорошо.

Обратившись к order allow,deny, вы перейдете в режим отклонить всех, кроме этого-списка-или-возможно-не .Таким образом, вы отклоните доступ ко всем, но разрешите сети страны, а затем отклоните прокси.И, конечно же, вы должны удалить Deny from all, как заявлено @Gerben и @Michael Slade (этот ответ только объясняет, что они написали).

Обычно Deny from all видно с order deny,allow, чтобы удалить разрешить по умолчанию доступ и сделать простую, удобочитаемую конфигурацию.Например, укажите список разрешенных IP-адресов после этого.Вам не нужно это правило, и ваш вопрос - идеальный случай трехстороннего режима доступа (политика по умолчанию, исключения, исключения из исключений).

Но парни, которые разработали эти настройки, безусловно, безумны.

Все это устарело в Apache 2.4

Вся схема авторизации была реорганизована в Apache 2.4 с RequireAll , RequireAny и RequireNone директивы.См., Например, этот сложный логический пример .

Таким образом, старая странная логика Order становится реликвией, и процитируем новую документацию:

Управление тем, каки в каком порядке будет применяться авторизация, в прошлом было немного загадкой

3 голосов
/ 06 апреля 2012

Измените свой код на

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

Таким образом, ваш htaccess будет запрещать все, кроме тех, которые вы явно разрешаете с allow from..

Прокси в пределах разрешенного диапазона может быть легко перезаписан с помощью дополнительного правила deny from...

3 голосов
/ 05 апреля 2012

Просто используйте order allow,deny и удалите строку deny from all.

2 голосов
/ 23 мая 2017

Не отвечая на вопрос ОП напрямую, но для людей, которые находят этот вопрос в поисках ясности, в чем разница между allow,deny и deny,allow:

Читайте запятую как «но».

  • allow but deny: белый список с исключениями.
    все запрещено, кроме элементов в списке разрешенных, кроме элементов в списке запрещенных
  • deny but allow: черный список с исключениями.
    разрешено все, кроме элементов в списке запрещенных, за исключением элементов в списке разрешенных

разрешить доступ только одной стране, но исключить прокси в этой стране

OP нужен белый список с исключениями, поэтому allow,deny вместо deny,allow

1 голос
/ 04 апреля 2012

Как предложил Гербен, просто измените:

order deny,allow
deny from all

до

order allow,deny

И ограничения будут работать так, как вы хотите.

Подробности можно найти в Документах Apache .

0 голосов
/ 22 мая 2019

В apache2, в конфигурации linux

Требуется все предоставленные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...