Я пытаюсь контролировать доступ к моему tomcat (версия 8), разорваемому по ip-адресу запроса, используя клапан. Я хочу разрешить все адреса, которые не начинаются с 10 и всех адресов, начинающихся с 10.10. Вот что у меня есть.
<valve className="org.apache.catalina.valves.RemoteAddrValve"> allow="[^10]\.\d+\.\d+\.\d+|10\.10\.\d+\.\d+"/>
Он не работает, он разрешает доступ только к адресам, начинающимся с 10.10.
Регулярные выражения - не лучшая вещь, что я делаю неправильно?
Благодарю.
Чтобы разрешить все адреса, начиная с 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-адреса для этой проверки.
[^ 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 и т.д. Но это может быть хорошо для вашей проблемы домен.