我正在使用jetty中的IPAcccessHandler来限制对来自某些域的请求的访问。但是,我真的遇到了两个问题:
1-似乎IPAccessHandler
只接受IP到白名单或黑名单,尽管它是Javadocs表示可以通过网址阻止。这是我的jetty-ipaccess.xml的XML片段:
<Set name="black">
<Array type="String">
<Item>google.com</Item>
</Array>
</Set>
现在,如果我运行jetty,我会得到以下异常(即jetty无法启动):
Caused by: java.lang.IllegalArgumentException: Invalid IP address pattern: google.com
但如果我使用IP地址(例如127.0.0.1
),那么码头就可以了。
2-现在说我通过阻止来自IP 127.0.0.1
的访问来启动jetty,然后如果我尝试在浏览器中请求127.0.0.1
,我会得到正确的禁止错误。如果我尝试请求http://localhost
,那么我会收到此错误:
HTTP ERROR: 500
Problem accessing /. Reason:
java.lang.IllegalArgumentException: Invalid IP address: 0:0:0:0:0:0:0:1
到目前为止,我已经尝试了两天没有任何运气!非常感谢任何帮助!
答案 0 :(得分:1)
IPAccessHandler
仅使用IP地址,因此名称。
使用主机名是非常低效(和错误的),无论是IPAccessHandler
端的配置还是传入请求端的验证。
让我们用这个java代码来探索我的意思。
package net;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class MultiDns
{
public static void main(String[] args)
{
try
{
String hostname = "www.google.com";
System.out.printf("Hostname: %s%n",hostname);
for (InetAddress addr : InetAddress.getAllByName(hostname))
{
System.out.printf(" - %s [%s]%n",addr.getHostAddress(),InetAddress.getByAddress(addr.getAddress()).getHostName());
}
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
}
}
google.com
对我的查询结果显示以下内容......
Hostname: www.google.com
- 74.125.25.106 [pa-in-f106.1e100.net]
- 74.125.25.99 [pa-in-f99.1e100.net]
- 74.125.25.104 [pa-in-f104.1e100.net]
- 74.125.25.147 [pa-in-f147.1e100.net]
- 74.125.25.105 [pa-in-f105.1e100.net]
- 74.125.25.103 [pa-in-f103.1e100.net]
- 2607:f8b0:400e:c00:0:0:0:67 [pf-in-x67.1e100.net]
由于我住在亚利桑那州,我得到了上述结果,但如果你住在欧洲或亚洲(例如),你会得到不同的结果。
你今天看到的结果可能会在以后有所不同。
此外,当您将从查询中返回的IP转到google.com时,您会发现无法从这些IP中解析google.com(它们返回的结果为1e100.net
addresses)。
在使用主机名进行访问控制的任何意义上,主机名和IP之间没有1 :: 1的关系。
即使您向配置端添加主机名,您也需要在每个请求上查询其主机名ips ,以了解传入请求的IP是否为允许或拒绝现在。这对于要执行的活动来说太昂贵了。
您可能认为Jetty只能使用dns请求的ttl / expiration来限制它对该域执行dns查询的次数。唉,Java无法访问dns响应的ttl信息。