2015-01-23 3 views
1

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

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

Это не работает, это позволяет получить доступ только к адресам, начиная с 10.10.

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

Спасибо.

+0

Как в стороне, какая странная идея от разработчиков Tomcat использовать только IP-фильтрацию на основе регулярного выражения, а не сетевую маску. – biziclop

+0

Использование regex - overkill imo. У меня бы скорее была сетевая маска. – WillG

ответ

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.X.Y.Z, 3.X.Y.Z, ..., 9.X.Y.Z.

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

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 и т. Д. Но это может быть нормально для ваш проблемный домен.

Смежные вопросы