Как правильно написать этот IP-клапан?

1

Я пытаюсь контролировать доступ к моему tomcat (версия 8), разорваемому по ip-адресу запроса, используя клапан. Я хочу разрешить все адреса, которые не начинаются с 10 и всех адресов, начинающихся с 10.10. Вот что у меня есть.

<valve className="org.apache.catalina.valves.RemoteAddrValve"> allow="[^10]\.\d+\.\d+\.\d+|10\.10\.\d+\.\d+"/>

Он не работает, он разрешает доступ только к адресам, начинающимся с 10.10.

Регулярные выражения - не лучшая вещь, что я делаю неправильно?

Благодарю.

  • 1
    Кроме того, что за странная идея от разработчиков Tomcat реализовывать только IP-фильтрацию на основе регулярных выражений, а не на основе сетевых масок.
  • 0
    Использование регулярных выражений излишне IMO. Я бы предпочел иметь здесь маску.
Теги:
tomcat
tomcat8

2 ответа

2
Лучший ответ

Чтобы разрешить все адреса, начиная с 10.10. вы можете использовать следующее регулярное выражение:

10\.10\..*

\. соответствует символу "точка" и .* соответствует чему угодно.

Чтобы запретить все адресации, начиная с 10. вы должны написать что-то более сложное: [^1].* Соответствует чему-либо, что не начинается с 1. Это прекрасно, если IP-адрес не начинается с 1 мы это разрешим. 1[^0].* Соответствует любому IP-адресу, который начинается с 1 а второй символ не равен 0. 11xxx, 15xxx и т.д. Но мы должны разрешать такие адреса, как 101.xxx. Поэтому нам придется писать 10[^.].*. Это выражение позволит ничего, кроме 10.xxx это нормально.

Таким образом, окончательное регулярное выражение будет выглядеть как альтернатива между всеми выражениями выше:

10\.10\..*|[^1].*|1[^0].*|10[^.].*

или немного упростить:

(10\.10\.|[^1]|1[^0]|10[^.]).*

Теперь лучше добавить ^ в начале и $ в конце, просто чтобы убедиться, что это выражение будет проверять весь IP-адрес:

^(10\.10\.|[^1]|1[^0]|10[^.]).*$

Я не проверял, что входное значение является IP-адресом, но я уверен, что tomcat не будет передавать ничего, кроме IP-адреса для этой проверки.

0

[^ 10] не будет исключать строки, начинающиеся с 10, он будет соответствовать любому символу, который отличается от одного или нуля. Таким образом, первая часть вашего шаблона примет следующие IP-адреса: 2.XYZ, 3.XYZ,..., 9.XYZ

Чтобы достичь своей цели, вы можете попробовать что-то вроде этого:

d\.\d+\.\d+\.\d+|[02-9]d\.\d+\.\d+\.\d+|[1-9]dd\.\d+\.\d+\.\d+|10\.10\.\d+\.\d+

Таким образом, первая альтернатива будет принимать любой IP-адрес, начинающийся с одной цифры. Второй - любой IP-адрес, начинающийся с двух цифр, за исключением 10. Третий, любой IP-адрес, начинающийся с трех цифр (и, следовательно, не может быть равно 10).

Еще одно замечание: используя d+ для сопоставления номера, даже недопустимые значения могут быть приняты как компоненты IP (которые должны быть между 0-255), например 257, 3848 и т.д. Но это может быть хорошо для вашей проблемы домен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню