Подтвердить что ты не робот

Htaccess "заказать" Запретить, Разрешить, Отклонить

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

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

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

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

4b9b3361

Ответ 1

Обновление: для нового перехода apache 2.4 прямо в конец.

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

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

Теперь у вас есть основные режимы:

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

Order Deny,Allow
  • Это режим разрешить по умолчанию. Где вы дадите optionnaly список правил Deny.
  • Затем проверяются правила Запретить, чтобы отклонять запросы на основе этих правил.
  • Если кто-то отклоняется одним из правил Deny, вы можете вернуть его с помощью правила Разрешить.

Я бы назвал его

Policy Allow
Rule Deny
     list of Deny rules
Exception
     list of Allow rules

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

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

В упрощенной форме:

Policy Deny
Rule Allow
     list of Allow rules
Exception
     list of Deny rules

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

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

Вы включили режим Allow-any-except-this-list-or-maybe-not, поэтому по умолчанию любой может получить доступ к вашему серверу, за исключением прокси IP, перечисленных в списке Запрет (и с Deny от всех вы удаляете доступ для тех, кто был установлен по умолчанию), но если они будут отвергнуты, вы все равно разрешите country Networks. Это нехорошо.

Инвертируя заказ на order allow,deny, вы попадете в режим Reject-all-except-this-list-or-maybe-not. Таким образом, вы отклоняете доступ ко всем, но разрешаете сетевые сети, а затем для разрешенных людей вы отклоняете прокси IP. И, конечно же, вы должны удалить Deny from all, как указано в @Gerben и @Michael Slade (этот ответ - просто экскарация того, почему они правы).

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

Но ребята, которые сделали тезеты конфигурации тезисов, безусловно, безумно.

Обновление: теперь это неправда с Apache 2.4

Все секции авторизации/требований были рефакторированы в apache 2.4 с RequireAll, RequireAny и RequireNone. См., Например, этот пример сложной логики.

поэтому эта странная логика скоро станет прошлым и процитирует новую документацию:

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

Ответ 2

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

<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

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

Ответ 4

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

order deny,allow
deny from all

к

order allow,deny

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

Подробности можно найти в Apache docs.

Ответ 5

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

Прочитайте запятую как "но".

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

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

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